From bb1dab2471b5bd10b6a94b33f3c212889bd856f9 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Nov 2019 16:02:59 -0700 Subject: [PATCH] fdk-aac: Add fdk-aac-free for non BUILD_PATENTED configurations The core parts of AAC were patented back in 1998. Those patents have expired. Some of the newer AAC features involved with HE-AAC are still patented. These patches are taken from fedora where they remove all patented functionality. Note that LC-AAC comprises the majority of AAC content. HE-AAC is for low bitrate stuff like audiobooks. Patches come from Fedora where this is also distributed. Local compiles show a 40% size reduction in the final ipk. Signed-off-by: Rosen Penev --- sound/fdk-aac/Makefile | 48 +- .../fdk-aac/patches-free/010-remove-sbr.patch | 49625 ++++++++++++++++ .../020-remove-hcx-rvlc-error.patch | 10233 ++++ .../030-remove-mp3-surround.patch | 29035 +++++++++ .../patches-free/040-remove-usac.patch | 9569 +++ 5 files changed, 98505 insertions(+), 5 deletions(-) create mode 100644 sound/fdk-aac/patches-free/010-remove-sbr.patch create mode 100644 sound/fdk-aac/patches-free/020-remove-hcx-rvlc-error.patch create mode 100644 sound/fdk-aac/patches-free/030-remove-mp3-surround.patch create mode 100644 sound/fdk-aac/patches-free/040-remove-usac.patch diff --git a/sound/fdk-aac/Makefile b/sound/fdk-aac/Makefile index 5ff951533a..dceddf0e35 100644 --- a/sound/fdk-aac/Makefile +++ b/sound/fdk-aac/Makefile @@ -9,8 +9,8 @@ PKG_NAME:=fdk-aac PKG_VERSION:=2.0.1 PKG_RELEASE:=1 -PKG_SOURCE_URL=https://codeload.github.com/mstorsjo/fdk-aac/tar.gz/v$(PKG_VERSION)? PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/mstorsjo/fdk-aac/tar.gz/v$(PKG_VERSION)? PKG_HASH:=a4142815d8d52d0e798212a5adea54ecf42bcd4eec8092b37a8cb615ace91dc6 PKG_MAINTAINER:=Ted Hess @@ -23,6 +23,10 @@ PKG_BUILD_PARALLEL:=1 PKG_CONFIG_DEPENDS:= CONFIG_FDK-AAC_OPTIMIZE_SPEED +ifeq ($(BUILD_VARIANT),free) +PATCH_DIR:=./patches-free +endif + ifeq ($(CONFIG_FDK-AAC_OPTIMIZE_SPEED),y) TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS)) TARGET_CFLAGS += $(TARGET_CFLAGS) -O2 -flto @@ -33,20 +37,48 @@ endif include $(INCLUDE_DIR)/package.mk -define Package/fdk-aac +define Package/fdk-aac/Default SECTION:=sound CATEGORY:=Sound - DEPENDS:=@BUILD_PATENTED TITLE:=Fraunhofer FDK AAC Codec Library URL:=https://sourceforge.net/projects/opencore-amr/ endef -define Package/fdk-aac/description +define Package/fdk-aac/Default/description Port of the Fraunhofer FDK AAC Codec Library for Android endef +define Package/fdk-aac/Default/config + source "$(SOURCE)/Config.in" +endef + +define Package/fdk-aac + $(call Package/fdk-aac/Default) + DEPENDS:=@BUILD_PATENTED + VARIANT:=nonfree +endef + +define Package/fdk-aac/description + $(call Package/fdk-aac/Default/description) + This is the full patent encumbered version. +endef + define Package/fdk-aac/config - source "$(SOURCE)/Config.in" + $(call Package/fdk-aac/Default/config) +endef + +define Package/fdk-aac-free + $(call Package/fdk-aac/Default) + VARIANT:=free +endef + +define Package/fdk-aac-free/description + $(call Package/fdk-aac/Default/description) + This is the free version that only supports LC-AAC. +endef + +define Package/fdk-aac-free/config + $(call Package/fdk-aac/Default/config) endef define Build/InstallDev @@ -63,4 +95,10 @@ define Package/fdk-aac/install $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfdk-aac.so* $(1)/usr/lib/ endef +define Package/fdk-aac-free/install + $(INSTALL_DIR) $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfdk-aac.so* $(1)/usr/lib/ +endef + $(eval $(call BuildPackage,fdk-aac)) +$(eval $(call BuildPackage,fdk-aac-free)) diff --git a/sound/fdk-aac/patches-free/010-remove-sbr.patch b/sound/fdk-aac/patches-free/010-remove-sbr.patch new file mode 100644 index 0000000000..99862d6a1c --- /dev/null +++ b/sound/fdk-aac/patches-free/010-remove-sbr.patch @@ -0,0 +1,49625 @@ +From 612384d1b1c44d03f0185ef50c8b53fcb5fccfc3 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Mon, 24 Jun 2019 15:25:52 +0200 +Subject: Remove SBR + +--- + Android.bp | 4 - + Makefile.am | 51 - + Makefile.vc | 48 - + libAACdec/src/aacdec_drc.cpp | 17 +- + libAACdec/src/aacdec_drc.h | 10 +- + libAACdec/src/aacdecoder.cpp | 185 +-- + libAACdec/src/aacdecoder.h | 13 - + libAACdec/src/aacdecoder_lib.cpp | 231 +-- + libAACenc/src/aacenc.h | 4 - + libAACenc/src/aacenc_lib.cpp | 562 +------ + libMpegTPDec/include/tp_data.h | 11 - + libMpegTPDec/include/tpdec_lib.h | 12 - + libMpegTPDec/src/tpdec_asc.cpp | 107 -- + libMpegTPDec/src/tpdec_lib.cpp | 10 - + libMpegTPEnc/include/tpenc_lib.h | 12 - + libMpegTPEnc/src/tpenc_asc.cpp | 19 - + libSBRdec/include/sbrdecoder.h | 401 ----- + libSBRdec/src/HFgen_preFlat.cpp | 993 ------------ + libSBRdec/src/HFgen_preFlat.h | 132 -- + libSBRdec/src/arm/lpp_tran_arm.cpp | 159 -- + libSBRdec/src/env_calc.cpp | 3158 ------------------------------------ + libSBRdec/src/env_calc.h | 182 --- + libSBRdec/src/env_dec.cpp | 873 ---------- + libSBRdec/src/env_dec.h | 119 -- + libSBRdec/src/env_extr.cpp | 1728 -------------------- + libSBRdec/src/env_extr.h | 415 ----- + libSBRdec/src/hbe.cpp | 2202 ------------------------- + libSBRdec/src/hbe.h | 200 --- + libSBRdec/src/huff_dec.cpp | 137 -- + libSBRdec/src/huff_dec.h | 117 -- + libSBRdec/src/lpp_tran.cpp | 1471 ----------------- + libSBRdec/src/lpp_tran.h | 275 ---- + libSBRdec/src/psbitdec.cpp | 594 ------- + libSBRdec/src/psbitdec.h | 116 -- + libSBRdec/src/psdec.cpp | 722 --------- + libSBRdec/src/psdec.h | 333 ---- + libSBRdec/src/psdec_drm.cpp | 108 -- + libSBRdec/src/psdec_drm.h | 113 -- + libSBRdec/src/psdecrom_drm.cpp | 108 -- + libSBRdec/src/pvc_dec.cpp | 683 -------- + libSBRdec/src/pvc_dec.h | 238 --- + libSBRdec/src/sbr_crc.cpp | 192 --- + libSBRdec/src/sbr_crc.h | 138 -- + libSBRdec/src/sbr_deb.cpp | 108 -- + libSBRdec/src/sbr_deb.h | 113 -- + libSBRdec/src/sbr_dec.cpp | 1480 ----------------- + libSBRdec/src/sbr_dec.h | 204 --- + libSBRdec/src/sbr_ram.cpp | 191 --- + libSBRdec/src/sbr_ram.h | 186 --- + libSBRdec/src/sbr_rom.cpp | 1705 ------------------- + libSBRdec/src/sbr_rom.h | 216 --- + libSBRdec/src/sbrdec_drc.cpp | 528 ------ + libSBRdec/src/sbrdec_drc.h | 149 -- + libSBRdec/src/sbrdec_freq_sca.cpp | 835 ---------- + libSBRdec/src/sbrdec_freq_sca.h | 127 -- + libSBRdec/src/sbrdecoder.cpp | 2023 ----------------------- + libSBRdec/src/transcendent.h | 372 ----- + libSBRenc/include/sbr_encoder.h | 483 ------ + libSBRenc/src/bit_sbr.cpp | 1049 ------------ + libSBRenc/src/bit_sbr.h | 267 --- + libSBRenc/src/cmondata.h | 127 -- + libSBRenc/src/code_env.cpp | 602 ------- + libSBRenc/src/code_env.h | 161 -- + libSBRenc/src/env_bit.cpp | 257 --- + libSBRenc/src/env_bit.h | 135 -- + libSBRenc/src/env_est.cpp | 1985 ---------------------- + libSBRenc/src/env_est.h | 223 --- + libSBRenc/src/fram_gen.cpp | 1965 ---------------------- + libSBRenc/src/fram_gen.h | 343 ---- + libSBRenc/src/invf_est.cpp | 610 ------- + libSBRenc/src/invf_est.h | 181 --- + libSBRenc/src/mh_det.cpp | 1396 ---------------- + libSBRenc/src/mh_det.h | 204 --- + libSBRenc/src/nf_est.cpp | 612 ------- + libSBRenc/src/nf_est.h | 185 --- + libSBRenc/src/ps_bitenc.cpp | 624 ------- + libSBRenc/src/ps_bitenc.h | 173 -- + libSBRenc/src/ps_const.h | 150 -- + libSBRenc/src/ps_encode.cpp | 1031 ------------ + libSBRenc/src/ps_encode.h | 185 --- + libSBRenc/src/ps_main.cpp | 606 ------- + libSBRenc/src/ps_main.h | 270 --- + libSBRenc/src/resampler.cpp | 444 ----- + libSBRenc/src/resampler.h | 159 -- + libSBRenc/src/sbr.h | 194 --- + libSBRenc/src/sbr_def.h | 276 ---- + libSBRenc/src/sbr_encoder.cpp | 2577 ----------------------------- + libSBRenc/src/sbr_misc.cpp | 265 --- + libSBRenc/src/sbr_misc.h | 127 -- + libSBRenc/src/sbrenc_freq_sca.cpp | 674 -------- + libSBRenc/src/sbrenc_freq_sca.h | 132 -- + libSBRenc/src/sbrenc_ram.cpp | 249 --- + libSBRenc/src/sbrenc_ram.h | 199 --- + libSBRenc/src/sbrenc_rom.cpp | 910 ----------- + libSBRenc/src/sbrenc_rom.h | 145 -- + libSBRenc/src/ton_corr.cpp | 891 ---------- + libSBRenc/src/ton_corr.h | 258 --- + libSBRenc/src/tran_det.cpp | 1092 ------------- + libSBRenc/src/tran_det.h | 191 --- + 99 files changed, 34 insertions(+), 48013 deletions(-) + delete mode 100644 libSBRdec/include/sbrdecoder.h + delete mode 100644 libSBRdec/src/HFgen_preFlat.cpp + delete mode 100644 libSBRdec/src/HFgen_preFlat.h + delete mode 100644 libSBRdec/src/arm/lpp_tran_arm.cpp + delete mode 100644 libSBRdec/src/env_calc.cpp + delete mode 100644 libSBRdec/src/env_calc.h + delete mode 100644 libSBRdec/src/env_dec.cpp + delete mode 100644 libSBRdec/src/env_dec.h + delete mode 100644 libSBRdec/src/env_extr.cpp + delete mode 100644 libSBRdec/src/env_extr.h + delete mode 100644 libSBRdec/src/hbe.cpp + delete mode 100644 libSBRdec/src/hbe.h + delete mode 100644 libSBRdec/src/huff_dec.cpp + delete mode 100644 libSBRdec/src/huff_dec.h + delete mode 100644 libSBRdec/src/lpp_tran.cpp + delete mode 100644 libSBRdec/src/lpp_tran.h + delete mode 100644 libSBRdec/src/psbitdec.cpp + delete mode 100644 libSBRdec/src/psbitdec.h + delete mode 100644 libSBRdec/src/psdec.cpp + delete mode 100644 libSBRdec/src/psdec.h + delete mode 100644 libSBRdec/src/psdec_drm.cpp + delete mode 100644 libSBRdec/src/psdec_drm.h + delete mode 100644 libSBRdec/src/psdecrom_drm.cpp + delete mode 100644 libSBRdec/src/pvc_dec.cpp + delete mode 100644 libSBRdec/src/pvc_dec.h + delete mode 100644 libSBRdec/src/sbr_crc.cpp + delete mode 100644 libSBRdec/src/sbr_crc.h + delete mode 100644 libSBRdec/src/sbr_deb.cpp + delete mode 100644 libSBRdec/src/sbr_deb.h + delete mode 100644 libSBRdec/src/sbr_dec.cpp + delete mode 100644 libSBRdec/src/sbr_dec.h + delete mode 100644 libSBRdec/src/sbr_ram.cpp + delete mode 100644 libSBRdec/src/sbr_ram.h + delete mode 100644 libSBRdec/src/sbr_rom.cpp + delete mode 100644 libSBRdec/src/sbr_rom.h + delete mode 100644 libSBRdec/src/sbrdec_drc.cpp + delete mode 100644 libSBRdec/src/sbrdec_drc.h + delete mode 100644 libSBRdec/src/sbrdec_freq_sca.cpp + delete mode 100644 libSBRdec/src/sbrdec_freq_sca.h + delete mode 100644 libSBRdec/src/sbrdecoder.cpp + delete mode 100644 libSBRdec/src/transcendent.h + delete mode 100644 libSBRenc/include/sbr_encoder.h + delete mode 100644 libSBRenc/src/bit_sbr.cpp + delete mode 100644 libSBRenc/src/bit_sbr.h + delete mode 100644 libSBRenc/src/cmondata.h + delete mode 100644 libSBRenc/src/code_env.cpp + delete mode 100644 libSBRenc/src/code_env.h + delete mode 100644 libSBRenc/src/env_bit.cpp + delete mode 100644 libSBRenc/src/env_bit.h + delete mode 100644 libSBRenc/src/env_est.cpp + delete mode 100644 libSBRenc/src/env_est.h + delete mode 100644 libSBRenc/src/fram_gen.cpp + delete mode 100644 libSBRenc/src/fram_gen.h + delete mode 100644 libSBRenc/src/invf_est.cpp + delete mode 100644 libSBRenc/src/invf_est.h + delete mode 100644 libSBRenc/src/mh_det.cpp + delete mode 100644 libSBRenc/src/mh_det.h + delete mode 100644 libSBRenc/src/nf_est.cpp + delete mode 100644 libSBRenc/src/nf_est.h + delete mode 100644 libSBRenc/src/ps_bitenc.cpp + delete mode 100644 libSBRenc/src/ps_bitenc.h + delete mode 100644 libSBRenc/src/ps_const.h + delete mode 100644 libSBRenc/src/ps_encode.cpp + delete mode 100644 libSBRenc/src/ps_encode.h + delete mode 100644 libSBRenc/src/ps_main.cpp + delete mode 100644 libSBRenc/src/ps_main.h + delete mode 100644 libSBRenc/src/resampler.cpp + delete mode 100644 libSBRenc/src/resampler.h + delete mode 100644 libSBRenc/src/sbr.h + delete mode 100644 libSBRenc/src/sbr_def.h + delete mode 100644 libSBRenc/src/sbr_encoder.cpp + delete mode 100644 libSBRenc/src/sbr_misc.cpp + delete mode 100644 libSBRenc/src/sbr_misc.h + delete mode 100644 libSBRenc/src/sbrenc_freq_sca.cpp + delete mode 100644 libSBRenc/src/sbrenc_freq_sca.h + delete mode 100644 libSBRenc/src/sbrenc_ram.cpp + delete mode 100644 libSBRenc/src/sbrenc_ram.h + delete mode 100644 libSBRenc/src/sbrenc_rom.cpp + delete mode 100644 libSBRenc/src/sbrenc_rom.h + delete mode 100644 libSBRenc/src/ton_corr.cpp + delete mode 100644 libSBRenc/src/ton_corr.h + delete mode 100644 libSBRenc/src/tran_det.cpp + delete mode 100644 libSBRenc/src/tran_det.h + +diff --git a/Android.bp b/Android.bp +index dce6fdd..95d56df 100644 +--- a/Android.bp ++++ b/Android.bp +@@ -9,8 +9,6 @@ cc_library_static { + "libSYS/src/*.cpp", + "libMpegTPDec/src/*.cpp", + "libMpegTPEnc/src/*.cpp", +- "libSBRdec/src/*.cpp", +- "libSBRenc/src/*.cpp", + "libArithCoding/src/*.cpp", + "libDRCdec/src/*.cpp", + "libSACdec/src/*.cpp", +@@ -43,8 +41,6 @@ cc_library_static { + "libSYS/include", + "libMpegTPDec/include", + "libMpegTPEnc/include", +- "libSBRdec/include", +- "libSBRenc/include", + "libArithCoding/include", + "libDRCdec/include", + "libSACdec/include", +diff --git a/Makefile.am b/Makefile.am +index fe6b867..28efc79 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -8,8 +8,6 @@ AM_CPPFLAGS = \ + -I$(top_srcdir)/libDRCdec/include \ + -I$(top_srcdir)/libSACdec/include \ + -I$(top_srcdir)/libSACenc/include \ +- -I$(top_srcdir)/libSBRdec/include \ +- -I$(top_srcdir)/libSBRenc/include \ + -I$(top_srcdir)/libMpegTPDec/include \ + -I$(top_srcdir)/libMpegTPEnc/include \ + -I$(top_srcdir)/libSYS/include \ +@@ -197,49 +195,6 @@ SACENC_SRC = \ + libSACenc/src/sacenc_tree.cpp \ + libSACenc/src/sacenc_vectorfunctions.cpp + +-SBRDEC_SRC = \ +- libSBRdec/src/HFgen_preFlat.cpp \ +- libSBRdec/src/env_calc.cpp \ +- libSBRdec/src/env_dec.cpp \ +- libSBRdec/src/env_extr.cpp \ +- libSBRdec/src/hbe.cpp \ +- libSBRdec/src/huff_dec.cpp \ +- libSBRdec/src/lpp_tran.cpp \ +- libSBRdec/src/psbitdec.cpp \ +- libSBRdec/src/psdec.cpp \ +- libSBRdec/src/psdec_drm.cpp \ +- libSBRdec/src/psdecrom_drm.cpp \ +- libSBRdec/src/pvc_dec.cpp \ +- libSBRdec/src/sbr_crc.cpp \ +- libSBRdec/src/sbr_deb.cpp \ +- libSBRdec/src/sbr_dec.cpp \ +- libSBRdec/src/sbr_ram.cpp \ +- libSBRdec/src/sbr_rom.cpp \ +- libSBRdec/src/sbrdec_drc.cpp \ +- libSBRdec/src/sbrdec_freq_sca.cpp \ +- libSBRdec/src/sbrdecoder.cpp +- +-SBRENC_SRC = \ +- libSBRenc/src/bit_sbr.cpp \ +- libSBRenc/src/code_env.cpp \ +- libSBRenc/src/env_bit.cpp \ +- libSBRenc/src/env_est.cpp \ +- libSBRenc/src/fram_gen.cpp \ +- libSBRenc/src/invf_est.cpp \ +- libSBRenc/src/mh_det.cpp \ +- libSBRenc/src/nf_est.cpp \ +- libSBRenc/src/ps_bitenc.cpp \ +- libSBRenc/src/ps_encode.cpp \ +- libSBRenc/src/ps_main.cpp \ +- libSBRenc/src/resampler.cpp \ +- libSBRenc/src/sbr_encoder.cpp \ +- libSBRenc/src/sbr_misc.cpp \ +- libSBRenc/src/sbrenc_freq_sca.cpp \ +- libSBRenc/src/sbrenc_ram.cpp \ +- libSBRenc/src/sbrenc_rom.cpp \ +- libSBRenc/src/ton_corr.cpp \ +- libSBRenc/src/tran_det.cpp +- + SYS_SRC = \ + libSYS/src/genericStds.cpp \ + libSYS/src/syslib_channelMapDescr.cpp +@@ -250,7 +205,6 @@ libfdk_aac_la_SOURCES = \ + $(DRCDEC_SRC) \ + $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ + $(SACDEC_SRC) $(SACENC_SRC) \ +- $(SBRDEC_SRC) $(SBRENC_SRC) \ + $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) + + EXTRA_DIST = \ +@@ -273,11 +227,6 @@ EXTRA_DIST = \ + $(top_srcdir)/libSACdec/src/*.h \ + $(top_srcdir)/libSACenc/include/*.h \ + $(top_srcdir)/libSACenc/src/*.h \ +- $(top_srcdir)/libSBRenc/src/*.h \ +- $(top_srcdir)/libSBRenc/include/*.h \ +- $(top_srcdir)/libSBRdec/src/*.h \ +- $(top_srcdir)/libSBRdec/src/arm/*.cpp \ +- $(top_srcdir)/libSBRdec/include/*.h \ + $(top_srcdir)/libSYS/include/*.h \ + $(top_srcdir)/libPCMutils/include/*.h \ + $(top_srcdir)/libPCMutils/src/*.h \ +diff --git a/Makefile.vc b/Makefile.vc +index a90b530..ac3c097 100644 +--- a/Makefile.vc ++++ b/Makefile.vc +@@ -23,8 +23,6 @@ AM_CPPFLAGS = \ + -IlibDRCdec/include \ + -IlibSACdec/include \ + -IlibSACenc/include \ +- -IlibSBRdec/include \ +- -IlibSBRenc/include \ + -IlibMpegTPDec/include \ + -IlibMpegTPEnc/include \ + -IlibSYS/include \ +@@ -181,49 +179,6 @@ SACENC_SRC = \ + libSACenc/src/sacenc_tree.cpp \ + libSACenc/src/sacenc_vectorfunctions.cpp + +-SBRDEC_SRC = \ +- libSBRdec/src/HFgen_preFlat.cpp \ +- libSBRdec/src/env_calc.cpp \ +- libSBRdec/src/env_dec.cpp \ +- libSBRdec/src/env_extr.cpp \ +- libSBRdec/src/hbe.cpp \ +- libSBRdec/src/huff_dec.cpp \ +- libSBRdec/src/lpp_tran.cpp \ +- libSBRdec/src/psbitdec.cpp \ +- libSBRdec/src/psdec.cpp \ +- libSBRdec/src/psdec_drm.cpp \ +- libSBRdec/src/psdecrom_drm.cpp \ +- libSBRdec/src/pvc_dec.cpp \ +- libSBRdec/src/sbr_crc.cpp \ +- libSBRdec/src/sbr_deb.cpp \ +- libSBRdec/src/sbr_dec.cpp \ +- libSBRdec/src/sbr_ram.cpp \ +- libSBRdec/src/sbr_rom.cpp \ +- libSBRdec/src/sbrdec_drc.cpp \ +- libSBRdec/src/sbrdec_freq_sca.cpp \ +- libSBRdec/src/sbrdecoder.cpp +- +-SBRENC_SRC = \ +- libSBRenc/src/bit_sbr.cpp \ +- libSBRenc/src/code_env.cpp \ +- libSBRenc/src/env_bit.cpp \ +- libSBRenc/src/env_est.cpp \ +- libSBRenc/src/fram_gen.cpp \ +- libSBRenc/src/invf_est.cpp \ +- libSBRenc/src/mh_det.cpp \ +- libSBRenc/src/nf_est.cpp \ +- libSBRenc/src/ps_bitenc.cpp \ +- libSBRenc/src/ps_encode.cpp \ +- libSBRenc/src/ps_main.cpp \ +- libSBRenc/src/resampler.cpp \ +- libSBRenc/src/sbr_encoder.cpp \ +- libSBRenc/src/sbr_misc.cpp \ +- libSBRenc/src/sbrenc_freq_sca.cpp \ +- libSBRenc/src/sbrenc_ram.cpp \ +- libSBRenc/src/sbrenc_rom.cpp \ +- libSBRenc/src/ton_corr.cpp \ +- libSBRenc/src/tran_det.cpp +- + SYS_SRC = \ + libSYS/src/genericStds.cpp \ + libSYS/src/syslib_channelMapDescr.cpp +@@ -234,7 +189,6 @@ libfdk_aac_SOURCES = \ + $(DRCDEC_SRC) \ + $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ + $(SACDEC_SRC) $(SACENC_SRC) \ +- $(SBRDEC_SRC) $(SBRENC_SRC) \ + $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) + + +@@ -282,8 +236,6 @@ clean: + del /f libPCMutils\src\*.obj 2>NUL + del /f libSACdec\src\*.obj 2>NUL + del /f libSACenc\src\*.obj 2>NUL +- del /f libSBRdec\src\*.obj 2>NUL +- del /f libSBRenc\src\*.obj 2>NUL + del /f libSYS\src\*.obj 2>NUL + + install: $(INST_DIRS) +diff --git a/libAACdec/src/aacdec_drc.cpp b/libAACdec/src/aacdec_drc.cpp +index 922a09e..ae05379 100644 +--- a/libAACdec/src/aacdec_drc.cpp ++++ b/libAACdec/src/aacdec_drc.cpp +@@ -105,8 +105,6 @@ amm-info@iis.fraunhofer.de + #include "channelinfo.h" + #include "aac_rom.h" + +-#include "sbrdecoder.h" +- + /* + * Dynamic Range Control + */ +@@ -832,11 +830,11 @@ static int aacDecoder_drcExtractAndMap( + return result; + } + +-void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec, ++void aacDecoder_drcApply(HANDLE_AAC_DRC self, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + CDrcChannelData *pDrcChData, FIXP_DBL *extGain, + int ch, /* needed only for SBR */ +- int aacFrameSize, int bSbrPresent) { ++ int aacFrameSize) { + int band, bin, numBands; + int bottom = 0; + int modifyBins = 0; +@@ -867,7 +865,6 @@ void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec, + } + + if (self->enable != ON) { +- sbrDecoder_drcDisable((HANDLE_SBRDECODER)pSbrDec, ch); + if (extGain != NULL) { + INT gainScale = (INT)*extGain; + /* The gain scaling must be passed to the function in the buffer pointed +@@ -1020,7 +1017,7 @@ void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec, + * short blocks must take care that bands fall on + * block boundaries! + */ +- if (!bSbrPresent) { ++ { + bottom = 0; + + if (!modifyBins) { +@@ -1058,14 +1055,6 @@ void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec, + pSpecScale[win] += max_exponent; + } + } +- } else { +- HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec; +- numBands = pDrcChData->numBands; +- +- /* feed factors into SBR decoder for application in QMF domain. */ +- sbrDecoder_drcFeedChannel(hSbrDecoder, ch, numBands, fact_mantissa, +- max_exponent, pDrcChData->drcInterpolationScheme, +- winSeq, pDrcChData->bandTop); + } + + return; +diff --git a/libAACdec/src/aacdec_drc.h b/libAACdec/src/aacdec_drc.h +index 924ec6f..19018b6 100644 +--- a/libAACdec/src/aacdec_drc.h ++++ b/libAACdec/src/aacdec_drc.h +@@ -152,10 +152,8 @@ int aacDecoder_drcProlog( + UCHAR pceInstanceTag, UCHAR channelMapping[], int validChannels); + + /** +- * \brief Apply DRC. If SBR is present, DRC data is handed over to the SBR +- * decoder. ++ * \brief Apply DRC. + * \param self AAC decoder instance +- * \param pSbrDec pointer to SBR decoder instance + * \param pAacDecoderChannelInfo AAC decoder channel instance to be processed + * \param pDrcDat DRC channel data + * \param extGain Pointer to a FIXP_DBL where a externally applyable gain will +@@ -164,13 +162,11 @@ int aacDecoder_drcProlog( + * DFRACT_BITS) to be applied on the gain value. + * \param ch channel index + * \param aacFrameSize AAC frame size +- * \param bSbrPresent flag indicating that SBR is present, in which case DRC is +- * handed over to the SBR instance pSbrDec + */ +-void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec, ++void aacDecoder_drcApply(HANDLE_AAC_DRC self, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + CDrcChannelData *pDrcDat, FIXP_DBL *extGain, int ch, +- int aacFrameSize, int bSbrPresent); ++ int aacFrameSize); + + int aacDecoder_drcEpilog( + HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, +diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp +index 8f03328..2419ecc 100644 +--- a/libAACdec/src/aacdecoder.cpp ++++ b/libAACdec/src/aacdecoder.cpp +@@ -161,8 +161,6 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_pns.h" + +-#include "sbrdecoder.h" +- + #include "sac_dec_lib.h" + + #include "aacdec_hcr.h" +@@ -249,9 +247,6 @@ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) { + } + } + +- /* Set SBR to current QMF mode. Error does not matter. */ +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, +- (self->qmfModeCurr == MODE_LP)); + self->psPossible = + ((CAN_DO_PS(self->streamInfo.aot) && + !PS_IS_EXPLICITLY_DISABLED(self->streamInfo.aot, self->flags[0]) && +@@ -936,7 +931,6 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( + FDK_FALLTHROUGH; + case EXT_SBR_DATA: + if (IS_CHANNEL_ELEMENT(previous_element)) { +- SBR_ERROR sbrError; + UCHAR configMode = 0; + UCHAR configChanged = 0; + +@@ -944,29 +938,6 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( + + configMode |= AC_CM_ALLOC_MEM; + +- sbrError = sbrDecoder_InitElement( +- self->hSbrDecoder, self->streamInfo.aacSampleRate, +- self->streamInfo.extSamplingRate, +- self->streamInfo.aacSamplesPerFrame, self->streamInfo.aot, +- previous_element, elIndex, +- 2, /* Signalize that harmonicSBR shall be ignored in the config +- change detection */ +- 0, configMode, &configChanged, self->downscaleFactor); +- +- if (sbrError == SBRDEC_OK) { +- sbrError = sbrDecoder_Parse(self->hSbrDecoder, hBs, +- self->pDrmBsBuffer, self->drmBsBufferSize, +- count, *count, crcFlag, previous_element, +- elIndex, self->flags[0], self->elFlags); +- /* Enable SBR for implicit SBR signalling but only if no severe error +- * happend. */ +- if ((sbrError == SBRDEC_OK) || (sbrError == SBRDEC_PARSE_ERROR)) { +- self->sbrEnabled = 1; +- } +- } else { +- /* Do not try to apply SBR because initializing the element failed. */ +- self->sbrEnabled = 0; +- } + /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2 + Fill elements containing an extension_payload() with an extension_type + of EXT_SBR_DATA or EXT_SBR_DATA_CRC shall not contain any other +@@ -978,9 +949,7 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( + } else { + /* If this is not a fill element with a known length, we are screwed + * and further parsing makes no sense. */ +- if (sbrError != SBRDEC_OK) { +- self->frameOK = 0; +- } ++ self->frameOK = 0; + } + } else { + error = AAC_DEC_PARSE_ERROR; +@@ -1107,54 +1076,10 @@ static AAC_DECODER_ERROR aacDecoder_ParseExplicitMpsAndSbr( + + if ((self->flags[0] & AC_SBR_PRESENT) && + (self->flags[0] & (AC_USAC | AC_RSVD50 | AC_ELD | AC_DRM))) { +- SBR_ERROR err = SBRDEC_OK; +- int chElIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE] + +- el_cnt[ID_LFE] + el_cnt[ID_USAC_SCE] + +- el_cnt[ID_USAC_CPE] + el_cnt[ID_USAC_LFE]; +- INT bitCntTmp = bitCnt; +- +- if (self->flags[0] & AC_USAC) { +- chElIdx = numChElements - 1; +- } else { +- chElIdx = 0; /* ELD case */ +- } +- +- for (; chElIdx < numChElements; chElIdx += 1) { +- MP4_ELEMENT_ID sbrType; +- SBR_ERROR errTmp; +- if (self->flags[0] & (AC_USAC)) { +- FDK_ASSERT((self->elements[element_index] == ID_USAC_SCE) || +- (self->elements[element_index] == ID_USAC_CPE)); +- sbrType = IS_STEREO_SBR(self->elements[element_index], +- self->usacStereoConfigIndex[element_index]) +- ? ID_CPE +- : ID_SCE; +- } else +- sbrType = self->elements[chElIdx]; +- errTmp = sbrDecoder_Parse(self->hSbrDecoder, bs, self->pDrmBsBuffer, +- self->drmBsBufferSize, &bitCnt, -1, +- self->flags[0] & AC_SBRCRC, sbrType, chElIdx, +- self->flags[0], self->elFlags); +- if (errTmp != SBRDEC_OK) { +- err = errTmp; +- bitCntTmp = bitCnt; +- bitCnt = 0; +- } +- } +- switch (err) { +- case SBRDEC_PARSE_ERROR: +- /* Can not go on parsing because we do not +- know the length of the SBR extension data. */ +- FDKpushFor(bs, bitCntTmp); +- bitCnt = 0; +- break; +- case SBRDEC_OK: +- self->sbrEnabled = 1; +- break; +- default: +- self->frameOK = 0; +- break; +- } ++ /* Can not go on parsing because we do not ++ know the length of the SBR extension data. */ ++ FDKpushFor(bs, bitCnt); ++ bitCnt = 0; + } + + if ((bitCnt > 0) && (self->flags[0] & (AC_USAC | AC_RSVD50))) { +@@ -1827,14 +1752,8 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + } + self->flags[streamIndex] |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0; + self->flags[streamIndex] |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0; +- if (asc->m_sbrPresentFlag) { +- self->sbrEnabled = 1; +- self->sbrEnabledPrev = 1; +- } else { +- self->sbrEnabled = 0; +- self->sbrEnabledPrev = 0; +- } +- if (self->sbrEnabled && asc->m_extensionSamplingFrequency) { ++ ++ if (asc->m_sbrPresentFlag && asc->m_extensionSamplingFrequency) { + if (downscaleFactor != 1 && (downscaleFactor)&1) { + return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; /* SBR needs an even downscale + factor */ +@@ -1944,31 +1863,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + /* set AC_USAC_SCFGI3 globally if any usac element uses */ + switch (asc->m_aot) { + case AOT_USAC: +- if (self->sbrEnabled) { +- for (int _el = 0; +- _el < (int)self->pUsacConfig[streamIndex]->m_usacNumElements; +- _el++) { +- int el = elementOffset + _el; +- if (IS_USAC_CHANNEL_ELEMENT(self->elements[el])) { +- if (usacStereoConfigIndex < 0) { +- usacStereoConfigIndex = self->usacStereoConfigIndex[el]; +- } else { +- if ((usacStereoConfigIndex != self->usacStereoConfigIndex[el]) || +- (self->usacStereoConfigIndex[el] > 0)) { +- goto bail; +- } +- } +- } +- } +- +- if (usacStereoConfigIndex < 0) { +- goto bail; +- } +- +- if (usacStereoConfigIndex == 3) { +- self->flags[streamIndex] |= AC_USAC_SCFGI3; +- } +- } + break; + default: + break; +@@ -1981,39 +1875,11 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + */ + switch (asc->m_aot) { + case AOT_USAC: +- if (self->sbrEnabled) { +- const UCHAR map_sbrRatio_2_nAnaBands[] = {16, 24, 32}; +- +- FDK_ASSERT(asc->m_sc.m_usacConfig.m_sbrRatioIndex > 0); +- FDK_ASSERT(streamIndex == 0); +- +- self->qmfDomain.globalConf.nInputChannels_requested = ascChannels; +- self->qmfDomain.globalConf.nOutputChannels_requested = +- (usacStereoConfigIndex == 1) ? 2 : ascChannels; +- self->qmfDomain.globalConf.flags_requested = 0; +- self->qmfDomain.globalConf.nBandsAnalysis_requested = +- map_sbrRatio_2_nAnaBands[asc->m_sc.m_usacConfig.m_sbrRatioIndex - +- 1]; +- self->qmfDomain.globalConf.nBandsSynthesis_requested = 64; +- self->qmfDomain.globalConf.nQmfTimeSlots_requested = +- (asc->m_sc.m_usacConfig.m_sbrRatioIndex == 1) ? 64 : 32; +- self->qmfDomain.globalConf.nQmfOvTimeSlots_requested = +- (asc->m_sc.m_usacConfig.m_sbrRatioIndex == 1) ? 12 : 6; +- self->qmfDomain.globalConf.nQmfProcBands_requested = 64; +- self->qmfDomain.globalConf.nQmfProcChannels_requested = 1; +- self->qmfDomain.globalConf.parkChannel = +- (usacStereoConfigIndex == 3) ? 1 : 0; +- self->qmfDomain.globalConf.parkChannel_requested = +- (usacStereoConfigIndex == 3) ? 1 : 0; +- self->qmfDomain.globalConf.qmfDomainExplicitConfig = 1; +- } + break; + case AOT_ER_AAC_ELD: + if (self->mpsEnableCurr && + asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) { +- SAC_INPUT_CONFIG sac_interface = +- (self->sbrEnabled && self->hSbrDecoder) ? SAC_INTERFACE_QMF +- : SAC_INTERFACE_TIME; ++ SAC_INPUT_CONFIG sac_interface = SAC_INTERFACE_TIME; + mpegSurroundDecoder_ConfigureQmfDomain( + (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, sac_interface, + (UINT)self->streamInfo.aacSampleRate, asc->m_aot); +@@ -2625,34 +2491,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + } else { + self->frameOK = 0; + } +- /* Create SBR element for SBR for upsampling for LFE elements, +- and if SBR was implicitly signaled, because the first frame(s) +- may not contain SBR payload (broken encoder, bit errors). */ +- if (self->frameOK && +- ((self->flags[streamIndex] & AC_SBR_PRESENT) || +- (self->sbrEnabled == 1)) && +- !(self->flags[streamIndex] & +- AC_USAC) /* Is done during explicit config set up */ +- ) { +- SBR_ERROR sbrError; +- UCHAR configMode = 0; +- UCHAR configChanged = 0; +- configMode |= AC_CM_ALLOC_MEM; +- +- sbrError = sbrDecoder_InitElement( +- self->hSbrDecoder, self->streamInfo.aacSampleRate, +- self->streamInfo.extSamplingRate, +- self->streamInfo.aacSamplesPerFrame, self->streamInfo.aot, type, +- previous_element_index, 2, /* Signalize that harmonicSBR shall +- be ignored in the config change +- detection */ +- 0, configMode, &configChanged, self->downscaleFactor); +- if (sbrError != SBRDEC_OK) { +- /* Do not try to apply SBR because initializing the element +- * failed. */ +- self->sbrEnabled = 0; +- } +- } + } + + el_cnt[type]++; +@@ -3047,7 +2885,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + (8) * sizeof(AUDIO_CHANNEL_TYPE)); /* restore */ + FDKmemcpy(self->channelIndices, self->channelIndicesPrev, + (8) * sizeof(UCHAR)); /* restore */ +- self->sbrEnabled = self->sbrEnabledPrev; + } else { + /* store or restore the number of channels and the corresponding info */ + if (self->frameOK && !(flags & AACDEC_CONCEAL)) { +@@ -3056,7 +2893,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + (8) * sizeof(AUDIO_CHANNEL_TYPE)); /* store */ + FDKmemcpy(self->channelIndicesPrev, self->channelIndices, + (8) * sizeof(UCHAR)); /* store */ +- self->sbrEnabledPrev = self->sbrEnabled; + } else { + if (self->aacChannels > 0) { + if ((self->buildUpStatus == AACDEC_RSV60_BUILD_UP_ON) || +@@ -3071,7 +2907,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + (8) * sizeof(AUDIO_CHANNEL_TYPE)); /* restore */ + FDKmemcpy(self->channelIndices, self->channelIndicesPrev, + (8) * sizeof(UCHAR)); /* restore */ +- self->sbrEnabled = self->sbrEnabledPrev; + } + } + } +@@ -3302,9 +3137,9 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING; + /* DRC processing */ + aacDecoder_drcApply( +- self->hDrcInfo, self->hSbrDecoder, pAacDecoderChannelInfo, ++ self->hDrcInfo, pAacDecoderChannelInfo, + &pAacDecoderStaticChannelInfo->drcData, self->extGain, c, +- self->streamInfo.aacSamplesPerFrame, self->sbrEnabled ++ self->streamInfo.aacSamplesPerFrame + + ); + +diff --git a/libAACdec/src/aacdecoder.h b/libAACdec/src/aacdecoder.h +index 20f4c45..0711160 100644 +--- a/libAACdec/src/aacdecoder.h ++++ b/libAACdec/src/aacdecoder.h +@@ -118,8 +118,6 @@ amm-info@iis.fraunhofer.de + + #include "FDK_qmf_domain.h" + +-#include "sbrdecoder.h" +- + #include "aacdec_drc.h" + + #include "pcmdmx_lib.h" +@@ -152,10 +150,6 @@ typedef struct { + + typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE; + +-typedef struct { +- int bsDelay; +-} SBR_PARAMS; +- + enum { + AACDEC_FLUSH_OFF = 0, + AACDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1, +@@ -224,8 +218,6 @@ struct AAC_DECODER_INSTANCE { + UCHAR chMapIndex; /*!< Index to access one line of the channelOutputMapping + table. This is required because not all 8 channel + configurations have the same output mapping. */ +- INT sbrDataLen; /*!< Expected length of the SBR remaining in bitbuffer after +- the AAC payload has been pared. */ + + CProgramConfig pce; + CStreamInfo +@@ -272,12 +264,7 @@ This structure is allocated once for each CPE. */ + supported) ELD downscale factor discovered in + the bitstream */ + +- HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */ +- UCHAR sbrEnabled; /*!< flag to store if SBR has been detected */ +- UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from +- previous frame */ + UCHAR psPossible; /*!< flag to store if PS is possible */ +- SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters */ + + UCHAR *pDrmBsBuffer; /*!< Pointer to dynamic buffer which is used to reverse + the bits of the DRM SBR payload */ +diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp +index 7df17b9..bde978e 100644 +--- a/libAACdec/src/aacdecoder_lib.cpp ++++ b/libAACdec/src/aacdecoder_lib.cpp +@@ -107,8 +107,6 @@ amm-info@iis.fraunhofer.de + #include "tpdec_lib.h" + #include "FDK_core.h" /* FDK_tools version info */ + +-#include "sbrdecoder.h" +- + #include "conceal.h" + + #include "aacdec_drc.h" +@@ -330,13 +328,6 @@ static INT aacDecoder_FreeMemCallback(void *handle, + errTp = TRANSPORTDEC_UNKOWN_ERROR; + } + +- /* free Ram_SbrDecoder and Ram_SbrDecChannel */ +- if (self->hSbrDecoder != NULL) { +- if (sbrDecoder_FreeMem(&self->hSbrDecoder) != SBRDEC_OK) { +- errTp = TRANSPORTDEC_UNKOWN_ERROR; +- } +- } +- + /* free pSpatialDec and mpsData */ + if (self->pMpegSurroundDecoder != NULL) { + if (mpegSurroundDecoder_FreeMem( +@@ -368,23 +359,6 @@ static INT aacDecoder_CtrlCFGChangeCallback( + return errTp; + } + +-static INT aacDecoder_SbrCallback( +- void *handle, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, +- const INT sampleRateOut, const INT samplesPerFrame, +- const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, +- const INT elementIndex, const UCHAR harmonicSBR, +- const UCHAR stereoConfigIndex, const UCHAR configMode, UCHAR *configChanged, +- const INT downscaleFactor) { +- HANDLE_SBRDECODER self = (HANDLE_SBRDECODER)handle; +- +- INT errTp = sbrDecoder_Header(self, hBs, sampleRateIn, sampleRateOut, +- samplesPerFrame, coreCodec, elementID, +- elementIndex, harmonicSBR, stereoConfigIndex, +- configMode, configChanged, downscaleFactor); +- +- return errTp; +-} +- + static INT aacDecoder_SscCallback(void *handle, HANDLE_FDK_BITSTREAM hBs, + const AUDIO_OBJECT_TYPE coreCodec, + const INT samplingRate, const INT frameSize, +@@ -557,7 +531,6 @@ static AAC_DECODER_ERROR setConcealMethod( + AAC_DECODER_ERROR errorStatus = AAC_DEC_OK; + CConcealParams *pConcealData = NULL; + int method_revert = 0; +- HANDLE_SBRDECODER hSbrDec = NULL; + HANDLE_AAC_DRC hDrcInfo = NULL; + HANDLE_PCM_DOWNMIX hPcmDmx = NULL; + CConcealmentMethod backupMethod = ConcealMethodNone; +@@ -567,7 +540,6 @@ static AAC_DECODER_ERROR setConcealMethod( + /* check decoder handle */ + if (self != NULL) { + pConcealData = &self->concealCommonData; +- hSbrDec = self->hSbrDecoder; + hDrcInfo = self->hDrcInfo; + hPcmDmx = self->hPcmUtils; + if (self->flags[0] & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && method >= 2) { +@@ -603,27 +575,6 @@ static AAC_DECODER_ERROR setConcealMethod( + /* Get new delay */ + bsDelay = CConcealment_GetDelay(pConcealData); + +- { +- SBR_ERROR sbrErr = SBRDEC_OK; +- +- /* set SBR bitstream delay */ +- sbrErr = sbrDecoder_SetParam(hSbrDec, SBR_SYSTEM_BITSTREAM_DELAY, bsDelay); +- +- switch (sbrErr) { +- case SBRDEC_OK: +- case SBRDEC_NOT_INITIALIZED: +- if (self != NULL) { +- /* save the param value and set later +- (when SBR has been initialized) */ +- self->sbrParams.bsDelay = bsDelay; +- } +- break; +- default: +- errorStatus = AAC_DEC_SET_PARAM_FAIL; +- goto bail; +- } +- } +- + errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, bsDelay); + if ((errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE)) { + goto bail; +@@ -650,8 +601,6 @@ bail: + pConcealData, (int)backupMethod, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, + AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, + AACDEC_CONCEAL_PARAM_NOT_SPECIFIED); +- /* Revert SBR bitstream delay */ +- sbrDecoder_SetParam(hSbrDec, SBR_SYSTEM_BITSTREAM_DELAY, backupDelay); + /* Revert DRC bitstream delay */ + aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, backupDelay); + /* Revert PCM mixdown bitstream delay */ +@@ -973,14 +922,7 @@ LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, + pIn, aacDecoder_CtrlCFGChangeCallback, (void *)aacDec); + + FDKmemclear(&aacDec->qmfDomain, sizeof(FDK_QMF_DOMAIN)); +- /* open SBR decoder */ +- if (SBRDEC_OK != sbrDecoder_Open(&aacDec->hSbrDecoder, &aacDec->qmfDomain)) { +- err = -1; +- goto bail; +- } + aacDec->qmfModeUser = NOT_DEFINED; +- transportDec_RegisterSbrCallback(aacDec->hInput, aacDecoder_SbrCallback, +- (void *)aacDec->hSbrDecoder); + + if (mpegSurroundDecoder_Open( + (CMpegSurroundDecoder **)&aacDec->pMpegSurroundDecoder, +@@ -1067,9 +1009,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill(HANDLE_AACDECODER self, + static void aacDecoder_SignalInterruption(HANDLE_AACDECODER self) { + CAacDecoder_SignalInterruption(self); + +- if (self->hSbrDecoder != NULL) { +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_BS_INTERRUPTION, 1); +- } + if (self->mpsEnableUser) { + mpegSurroundDecoder_SetParam( + (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +@@ -1274,7 +1213,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + Tell other modules to clear states if required. */ + if (flags & AACDEC_CLRHIST) { + if (!(self->flags[0] & AC_USAC)) { +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_CLEAR_HISTORY, 1); + mpegSurroundDecoder_SetParam( + (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, + SACDEC_CLEAR_HISTORY, 1); +@@ -1393,9 +1331,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + + if (!self->qmfDomain.globalConf.qmfDomainExplicitConfig && + self->mpsEnableCurr) { +- SAC_INPUT_CONFIG sac_interface = (self->sbrEnabled && self->hSbrDecoder) +- ? SAC_INTERFACE_QMF +- : SAC_INTERFACE_TIME; ++ SAC_INPUT_CONFIG sac_interface = SAC_INTERFACE_TIME; + /* needs to be done before first SBR apply. */ + mpegSurroundDecoder_ConfigureQmfDomain( + (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, sac_interface, +@@ -1423,8 +1359,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + break; + } + +- /* sbr decoder */ +- + if ((ErrorStatus != AAC_DEC_OK) || (flags & AACDEC_CONCEAL) || + self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > + ConcealState_FadeIn) { +@@ -1432,110 +1366,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + decoder too */ + } + +- if (self->sbrEnabled && (!(self->flags[0] & AC_USAC_SCFGI3))) { +- SBR_ERROR sbrError = SBRDEC_OK; +- int chIdx, numCoreChannel = self->streamInfo.numChannels; +- +- /* set params */ +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_SYSTEM_BITSTREAM_DELAY, +- self->sbrParams.bsDelay); +- sbrDecoder_SetParam( +- self->hSbrDecoder, SBR_FLUSH_DATA, +- (flags & AACDEC_FLUSH) | +- ((self->flushStatus && !(flags & AACDEC_CONCEAL)) ? AACDEC_FLUSH +- : 0)); +- +- if (self->streamInfo.aot == AOT_ER_AAC_ELD) { +- /* Configure QMF */ +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_LD_QMF_TIME_ALIGN, +- (self->flags[0] & AC_MPS_PRESENT) ? 1 : 0); +- } +- +- { +- PCMDMX_ERROR dmxErr; +- INT maxOutCh = 0; +- +- dmxErr = pcmDmx_GetParam(self->hPcmUtils, +- MAX_NUMBER_OF_OUTPUT_CHANNELS, &maxOutCh); +- if ((dmxErr == PCMDMX_OK) && (maxOutCh == 1)) { +- /* Disable PS processing if we have to create a mono output signal. +- */ +- self->psPossible = 0; +- } +- } +- +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF, +- (self->mpsEnableCurr) ? 2 : 0); +- +- INT_PCM *input; +- input = (INT_PCM *)self->workBufferCore2; +- FDKmemcpy(input, pTimeData, +- sizeof(INT_PCM) * (self->streamInfo.numChannels) * +- (self->streamInfo.frameSize)); +- +- /* apply SBR processing */ +- sbrError = sbrDecoder_Apply(self->hSbrDecoder, input, pTimeData, +- timeDataSize, &self->streamInfo.numChannels, +- &self->streamInfo.sampleRate, +- &self->mapDescr, self->chMapIndex, +- self->frameOK, &self->psPossible); +- +- if (sbrError == SBRDEC_OK) { +- /* Update data in streaminfo structure. Assume that the SBR upsampling +- factor is either 1, 2, 8/3 or 4. Maximum upsampling factor is 4 +- (CELP+SBR or USAC 4:1 SBR) */ +- self->flags[0] |= AC_SBR_PRESENT; +- if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) { +- if (self->streamInfo.aacSampleRate >> 2 == +- self->streamInfo.sampleRate) { +- self->streamInfo.frameSize = +- self->streamInfo.aacSamplesPerFrame >> 2; +- self->streamInfo.outputDelay = self->streamInfo.outputDelay >> 2; +- } else if (self->streamInfo.aacSampleRate >> 1 == +- self->streamInfo.sampleRate) { +- self->streamInfo.frameSize = +- self->streamInfo.aacSamplesPerFrame >> 1; +- self->streamInfo.outputDelay = self->streamInfo.outputDelay >> 1; +- } else if (self->streamInfo.aacSampleRate << 1 == +- self->streamInfo.sampleRate) { +- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame +- << 1; +- self->streamInfo.outputDelay = self->streamInfo.outputDelay << 1; +- } else if (self->streamInfo.aacSampleRate << 2 == +- self->streamInfo.sampleRate) { +- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame +- << 2; +- self->streamInfo.outputDelay = self->streamInfo.outputDelay << 2; +- } else if (self->streamInfo.frameSize == 768) { +- self->streamInfo.frameSize = +- (self->streamInfo.aacSamplesPerFrame << 3) / 3; +- self->streamInfo.outputDelay = +- (self->streamInfo.outputDelay << 3) / 3; +- } else { +- ErrorStatus = AAC_DEC_SET_PARAM_FAIL; +- goto bail; +- } +- } else { +- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame; +- } +- self->streamInfo.outputDelay += +- sbrDecoder_GetDelay(self->hSbrDecoder); +- +- if (self->psPossible) { +- self->flags[0] |= AC_PS_PRESENT; +- } +- for (chIdx = numCoreChannel; chIdx < self->streamInfo.numChannels; +- chIdx += 1) { +- self->channelType[chIdx] = ACT_FRONT; +- self->channelIndices[chIdx] = chIdx; +- } +- } +- if (sbrError == SBRDEC_OUTPUT_BUFFER_TOO_SMALL) { +- ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; +- goto bail; +- } +- } +- + if (self->mpsEnableCurr) { + int err, sac_interface, nChannels, frameSize; + +@@ -1543,8 +1373,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + frameSize = self->streamInfo.frameSize; + sac_interface = SAC_INTERFACE_TIME; + +- if (self->sbrEnabled && self->hSbrDecoder) +- sac_interface = SAC_INTERFACE_QMF; + if (self->streamInfo.aot == AOT_USAC) { + if (self->flags[0] & AC_USAC_SCFGI3) { + sac_interface = SAC_INTERFACE_TIME; +@@ -1593,50 +1421,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + } + } + +- /* SBR decoder for Unified Stereo Config (stereoConfigIndex == 3) */ +- +- if (self->sbrEnabled && (self->flags[0] & AC_USAC_SCFGI3)) { +- SBR_ERROR sbrError = SBRDEC_OK; +- +- /* set params */ +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_SYSTEM_BITSTREAM_DELAY, +- self->sbrParams.bsDelay); +- +- sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF, 1); +- +- /* apply SBR processing */ +- sbrError = sbrDecoder_Apply(self->hSbrDecoder, pTimeData, pTimeData, +- timeDataSize, &self->streamInfo.numChannels, +- &self->streamInfo.sampleRate, +- &self->mapDescr, self->chMapIndex, +- self->frameOK, &self->psPossible); +- +- if (sbrError == SBRDEC_OK) { +- /* Update data in streaminfo structure. Assume that the SBR upsampling +- * factor is either 1,2 or 4 */ +- self->flags[0] |= AC_SBR_PRESENT; +- if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) { +- if (self->streamInfo.frameSize == 768) { +- self->streamInfo.frameSize = +- (self->streamInfo.aacSamplesPerFrame * 8) / 3; +- } else if (self->streamInfo.aacSampleRate << 2 == +- self->streamInfo.sampleRate) { +- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame +- << 2; +- } else { +- self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame +- << 1; +- } +- } +- +- self->flags[0] &= ~AC_PS_PRESENT; +- } +- if (sbrError == SBRDEC_OUTPUT_BUFFER_TOO_SMALL) { +- ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; +- goto bail; +- } +- } +- + /* Use dedicated memory for PCM postprocessing */ + pTimeDataPcmPost = self->pTimeData2; + timeDataPcmPostSize = self->timeData2Size; +@@ -1672,7 +1456,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + /* If SBR and/or MPS is active, the DRC gains are aligned to the QMF + domain signal before the QMF synthesis. Therefore the DRC gains + need to be delayed by the QMF synthesis delay. */ +- if (self->sbrEnabled) drcDelay = 257; + if (self->mpsEnableCurr) drcDelay = 257; + /* Take into account concealment delay */ + drcDelay += CConcealment_GetDelay(&self->concealCommonData) * +@@ -1693,7 +1476,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + * necessary for FDK_drcDec_ProcessTime, which accepts deinterleaved + * audio only. */ + if ((self->streamInfo.numChannels > 1) && +- (0 || (self->sbrEnabled) || (self->mpsEnableCurr))) { ++ (0 || (self->mpsEnableCurr))) { + /* interleaving/deinterleaving is performed on upper part of + * pTimeDataPcmPost. Check if this buffer is large enough. */ + if (timeDataPcmPostSize < +@@ -1766,7 +1549,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + } + + INT interleaved = 0; +- interleaved |= (self->sbrEnabled) ? 1 : 0; + interleaved |= (self->mpsEnableCurr) ? 1 : 0; + + /* do PCM post processing */ +@@ -1804,7 +1586,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + pcmLimiter_SetSampleRate(self->hLimiter, self->streamInfo.sampleRate); + pcmLimiterScale += PCM_OUT_HEADROOM; + +- if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) || ++ if ((self->streamInfo.numChannels == 1) || + (self->mpsEnableCurr)) { + pInterleaveBuffer = (PCM_LIM *)pTimeDataPcmPost; + } else { +@@ -1828,7 +1610,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + /* If numChannels = 1 we do not need interleaving. The same applies if + SBR or MPS are used, since their output is interleaved already + (resampled or not) */ +- if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) || ++ if ((self->streamInfo.numChannels == 1) || + (self->mpsEnableCurr)) { + scaleValuesSaturate( + pTimeData, pTimeDataPcmPost, +@@ -1972,10 +1754,6 @@ LINKSPEC_CPP void aacDecoder_Close(HANDLE_AACDECODER self) { + (CMpegSurroundDecoder *)self->pMpegSurroundDecoder); + } + +- if (self->hSbrDecoder != NULL) { +- sbrDecoder_Close(&self->hSbrDecoder); +- } +- + if (self->hInput != NULL) { + transportDec_Close(&self->hInput); + } +@@ -1994,7 +1772,6 @@ LINKSPEC_CPP INT aacDecoder_GetLibInfo(LIB_INFO *info) { + return -1; + } + +- sbrDecoder_GetLibInfo(info); + mpegSurroundDecoder_GetLibInfo(info); + transportDec_GetLibInfo(info); + FDK_toolsGetLibInfo(info); +diff --git a/libAACenc/src/aacenc.h b/libAACenc/src/aacenc.h +index 291ea54..798730d 100644 +--- a/libAACenc/src/aacenc.h ++++ b/libAACenc/src/aacenc.h +@@ -108,8 +108,6 @@ amm-info@iis.fraunhofer.de + + #include "tpenc_lib.h" + +-#include "sbr_encoder.h" +- + #define MIN_BUFSIZE_PER_EFF_CHAN 6144 + + #ifdef __cplusplus +@@ -243,8 +241,6 @@ struct AACENC_CONFIG { + + INT audioMuxVersion; /* audio mux version in loas/latm transport format */ + +- UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */ +- + UCHAR useTns; /* flag: use temporal noise shaping */ + UCHAR usePns; /* flag: use perceptual noise substitution */ + UCHAR useIS; /* flag: use intensity coding */ +diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp +index 8df33a4..51f3f49 100644 +--- a/libAACenc/src/aacenc_lib.cpp ++++ b/libAACenc/src/aacenc_lib.cpp +@@ -122,8 +122,6 @@ amm-info@iis.fraunhofer.de + + #include "pcm_utils.h" + +-#include "sbr_encoder.h" +-#include "../src/sbrenc_ram.h" + #include "channel_map.h" + + #include "psy_const.h" +@@ -199,22 +197,10 @@ typedef struct { + + UCHAR userMetaDataMode; /*!< Meta data library configuration. */ + +- UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */ +- UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */ +- + UINT userDownscaleFactor; + + } USER_PARAM; + +-/** +- * SBR extenxion payload struct provides buffers to be filled in SBR encoder +- * library. +- */ +-typedef struct { +- UCHAR data[(1)][(8)][MAX_PAYLOAD_SIZE]; /*!< extension payload data buffer */ +- UINT dataSize[(1)][(8)]; /*!< extension payload data size in bits */ +-} SBRENC_EXT_PAYLOAD; +- + //////////////////////////////////////////////////////////////////////////////////// + + /**************************************************************************** +@@ -231,10 +217,6 @@ struct AACENCODER { + AACENC_CONFIG aacConfig; + HANDLE_AAC_ENC hAacEnc; + +- /* SBR */ +- HANDLE_SBR_ENCODER hEnvEnc; /* SBR encoder */ +- SBRENC_EXT_PAYLOAD *pSbrPayload; /* SBR extension payload */ +- + /* Meta Data */ + HANDLE_FDK_METADATA_ENCODER hMetadataEnc; + INT metaDataAllowed; /* Signal whether chosen configuration allows metadata. +@@ -270,8 +252,6 @@ struct AACENCODER { + /* Memory allocation info. */ + INT nMaxAacElements; + INT nMaxAacChannels; +- INT nMaxSbrElements; +- INT nMaxSbrChannels; + + UINT encoder_modis; + +@@ -293,92 +273,6 @@ typedef struct { + + } ELD_SBR_CONFIGURATOR; + +-/** +- * \brief This table defines ELD/SBR default configurations. +- */ +-static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] = { +- {1, 48000, 0, 2, MODE_1}, {1, 48000, 64000, 0, MODE_1}, +- +- {1, 44100, 0, 2, MODE_1}, {1, 44100, 64000, 0, MODE_1}, +- +- {1, 32000, 0, 2, MODE_1}, {1, 32000, 28000, 1, MODE_1}, +- {1, 32000, 56000, 0, MODE_1}, +- +- {1, 24000, 0, 1, MODE_1}, {1, 24000, 40000, 0, MODE_1}, +- +- {1, 16000, 0, 1, MODE_1}, {1, 16000, 28000, 0, MODE_1}, +- +- {1, 15999, 0, 0, MODE_1}, +- +- {2, 48000, 0, 2, MODE_2}, {2, 48000, 44000, 2, MODE_2}, +- {2, 48000, 128000, 0, MODE_2}, +- +- {2, 44100, 0, 2, MODE_2}, {2, 44100, 44000, 2, MODE_2}, +- {2, 44100, 128000, 0, MODE_2}, +- +- {2, 32000, 0, 2, MODE_2}, {2, 32000, 32000, 2, MODE_2}, +- {2, 32000, 68000, 1, MODE_2}, {2, 32000, 96000, 0, MODE_2}, +- +- {2, 24000, 0, 1, MODE_2}, {2, 24000, 48000, 1, MODE_2}, +- {2, 24000, 80000, 0, MODE_2}, +- +- {2, 16000, 0, 1, MODE_2}, {2, 16000, 32000, 1, MODE_2}, +- {2, 16000, 64000, 0, MODE_2}, +- +- {2, 15999, 0, 0, MODE_2} +- +-}; +- +-/* +- * \brief Configure SBR for ELD configuration. +- * +- * This function finds default SBR configuration for ELD based on number of +- * channels, sampling rate and bitrate. +- * +- * \param nChannels Number of audio channels. +- * \param samplingRate Audio signal sampling rate. +- * \param bitrate Encoder bitrate. +- * +- * \return - pointer to eld sbr configuration. +- * - NULL, on failure. +- */ +-static const ELD_SBR_CONFIGURATOR *eldSbrConfigurator(const ULONG nChannels, +- const ULONG samplingRate, +- const ULONG bitrate) { +- int i; +- const ELD_SBR_CONFIGURATOR *pSetup = NULL; +- +- for (i = 0; +- i < (int)(sizeof(eldSbrAutoConfigTab) / sizeof(ELD_SBR_CONFIGURATOR)); +- i++) { +- if ((nChannels == eldSbrAutoConfigTab[i].nChannels) && +- (samplingRate <= eldSbrAutoConfigTab[i].samplingRate) && +- (bitrate >= eldSbrAutoConfigTab[i].bitrateRange)) { +- pSetup = &eldSbrAutoConfigTab[i]; +- } +- } +- +- return pSetup; +-} +- +-static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) { +- INT sbrUsed = 0; +- +- /* Note: Even if implicit signalling was selected, The AOT itself here is not +- * AOT_AAC_LC */ +- if ((hAacConfig->audioObjectType == AOT_SBR) || +- (hAacConfig->audioObjectType == AOT_PS) || +- (hAacConfig->audioObjectType == AOT_MP2_SBR)) { +- sbrUsed = 1; +- } +- if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && +- (hAacConfig->syntaxFlags & AC_SBR_PRESENT)) { +- sbrUsed = 1; +- } +- +- return (sbrUsed); +-} +- + static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType) { + INT psUsed = 0; + +@@ -399,53 +293,6 @@ static CHANNEL_MODE GetCoreChannelMode( + return mappedChannelMode; + } + +-static SBR_PS_SIGNALING getSbrSignalingMode( +- const AUDIO_OBJECT_TYPE audioObjectType, const TRANSPORT_TYPE transportType, +- const UCHAR transportSignaling, const UINT sbrRatio) +- +-{ +- SBR_PS_SIGNALING sbrSignaling; +- +- if (transportType == TT_UNKNOWN || sbrRatio == 0) { +- sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */ +- return sbrSignaling; +- } else { +- sbrSignaling = +- SIG_EXPLICIT_HIERARCHICAL; /* default: explicit hierarchical signaling +- */ +- } +- +- if ((audioObjectType == AOT_AAC_LC) || (audioObjectType == AOT_SBR) || +- (audioObjectType == AOT_PS) || (audioObjectType == AOT_MP2_AAC_LC) || +- (audioObjectType == AOT_MP2_SBR)) { +- switch (transportType) { +- case TT_MP4_ADIF: +- case TT_MP4_ADTS: +- sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only +- implicit signaling is possible */ +- break; +- +- case TT_MP4_RAW: +- case TT_MP4_LATM_MCP1: +- case TT_MP4_LATM_MCP0: +- case TT_MP4_LOAS: +- default: +- if (transportSignaling == 0xFF) { +- /* Defaults */ +- sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; +- } else { +- /* User set parameters */ +- /* Attention: Backward compatible explicit signaling does only work +- * with AMV1 for LATM/LOAS */ +- sbrSignaling = (SBR_PS_SIGNALING)transportSignaling; +- } +- break; +- } +- } +- +- return sbrSignaling; +-} +- + /**************************************************************************** + Allocate Encoder + ****************************************************************************/ +@@ -672,46 +519,14 @@ AAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig, + + config->userAncDataRate = 0; + +- /* SBR rate is set to 0 here, which means it should be set automatically +- in FDKaacEnc_AdjustEncSettings() if the user did not set a rate +- expilicitely. */ +- config->userSbrRatio = 0; +- +- /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable +- * configuration. */ +- config->userSbrEnabled = (UCHAR)-1; +- + return AAC_ENC_OK; + } + +-static void aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, +- SBR_ELEMENT_INFO *sbrElInfo, INT bitRate) { +- INT codebits = bitRate; +- int el; +- +- /* Copy Element info */ +- for (el = 0; el < channelMapping->nElements; el++) { +- sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0]; +- sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1]; +- sbrElInfo[el].elType = channelMapping->elInfo[el].elType; +- sbrElInfo[el].bitRate = +- fMultIfloor(channelMapping->elInfo[el].relativeBits, bitRate); +- sbrElInfo[el].instanceTag = channelMapping->elInfo[el].instanceTag; +- sbrElInfo[el].nChannelsInEl = channelMapping->elInfo[el].nChannelsInEl; +- sbrElInfo[el].fParametricStereo = 0; +- sbrElInfo[el].fDualMono = 0; +- +- codebits -= sbrElInfo[el].bitRate; +- } +- sbrElInfo[0].bitRate += codebits; +-} +- + static INT aacEncoder_LimitBitrate(const HANDLE_TRANSPORTENC hTpEnc, + const INT samplingRate, + const INT frameLength, const INT nChannels, + const CHANNEL_MODE channelMode, INT bitRate, +- const INT nSubFrames, const INT sbrActive, +- const INT sbrDownSampleRate, ++ const INT nSubFrames, + const UINT syntaxFlags, + const AUDIO_OBJECT_TYPE aot) { + INT coreSamplingRate; +@@ -719,89 +534,18 @@ static INT aacEncoder_LimitBitrate(const HANDLE_TRANSPORTENC hTpEnc, + + FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm); + +- if (sbrActive) { +- coreSamplingRate = +- samplingRate >> +- (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate - 1) : 1); +- } else { +- coreSamplingRate = samplingRate; +- } ++ coreSamplingRate = samplingRate; + + /* Limit bit rate in respect to the core coder */ + bitRate = FDKaacEnc_LimitBitrate(hTpEnc, aot, coreSamplingRate, frameLength, + nChannels, cm.nChannelsEff, bitRate, -1, + NULL, AACENC_BR_MODE_INVALID, nSubFrames); + +- /* Limit bit rate in respect to available SBR modes if active */ +- if (sbrActive) { +- int numIterations = 0; +- INT initialBitrate, adjustedBitrate; +- adjustedBitrate = bitRate; +- +- /* Find total bitrate which provides valid configuration for each SBR +- * element. */ +- do { +- int e; +- SBR_ELEMENT_INFO sbrElInfo[((8))]; +- FDK_ASSERT(cm.nElements <= ((8))); +- +- initialBitrate = adjustedBitrate; +- +- /* Get bit rate for each SBR element */ +- aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate); +- +- for (e = 0; e < cm.nElements; e++) { +- INT sbrElementBitRateIn, sbrBitRateOut; +- +- if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) { +- continue; +- } +- sbrElementBitRateIn = sbrElInfo[e].bitRate; +- +- sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn, +- cm.elInfo[e].nChannelsInEl, +- coreSamplingRate, aot); +- +- if (sbrBitRateOut == 0) { +- return 0; +- } +- +- /* If bitrates don't match, distribution and limiting needs to be +- determined again. Abort element loop and restart with adapted +- bitrate. */ +- if (sbrElementBitRateIn != sbrBitRateOut) { +- if (sbrElementBitRateIn < sbrBitRateOut) { +- adjustedBitrate = fMax(initialBitrate, +- (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut + 8), +- cm.elInfo[e].relativeBits)); +- break; +- } +- +- if (sbrElementBitRateIn > sbrBitRateOut) { +- adjustedBitrate = fMin(initialBitrate, +- (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut - 8), +- cm.elInfo[e].relativeBits)); +- break; +- } +- +- } /* sbrElementBitRateIn != sbrBitRateOut */ +- +- } /* elements */ +- +- numIterations++; /* restrict iteration to worst case of num elements */ +- +- } while ((initialBitrate != adjustedBitrate) && +- (numIterations <= cm.nElements)); +- +- /* Unequal bitrates mean that no reasonable bitrate configuration found. */ +- bitRate = (initialBitrate == adjustedBitrate) ? adjustedBitrate : 0; +- } +- + /* Limit bit rate in respect to available MPS modes if active */ + if ((aot == AOT_ER_AAC_ELD) && (syntaxFlags & AC_LD_MPS) && + (channelMode == MODE_1)) { + bitRate = FDK_MpegsEnc_GetClosestBitRate( +- aot, MODE_212, samplingRate, (sbrActive) ? sbrDownSampleRate : 0, ++ aot, MODE_212, samplingRate, 0, + bitRate); + } + +@@ -814,25 +558,13 @@ static INT aacEncoder_LimitBitrate(const HANDLE_TRANSPORTENC hTpEnc, + * \hAacConfig Internal encoder config + * \return Bitrate + */ +-static INT FDKaacEnc_GetCBRBitrate(const HANDLE_AACENC_CONFIG hAacConfig, +- const INT userSbrRatio) { ++static INT FDKaacEnc_GetCBRBitrate(const HANDLE_AACENC_CONFIG hAacConfig) { + INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) + ->nChannelsEff * + hAacConfig->sampleRate; + + if (isPsActive(hAacConfig->audioObjectType)) { + bitrate = 1 * bitrate; /* 0.5 bit per sample */ +- } else if (isSbrActive(hAacConfig)) { +- if ((userSbrRatio == 2) || +- ((userSbrRatio == 0) && +- (hAacConfig->audioObjectType != AOT_ER_AAC_ELD))) { +- bitrate = (bitrate + (bitrate >> 2)) >> 1; /* 0.625 bits per sample */ +- } +- if ((userSbrRatio == 1) || +- ((userSbrRatio == 0) && +- (hAacConfig->audioObjectType == AOT_ER_AAC_ELD))) { +- bitrate = (bitrate + (bitrate >> 3)); /* 1.125 bits per sample */ +- } + } else { + bitrate = bitrate + (bitrate >> 1); /* 1.5 bits per sample */ + } +@@ -886,10 +618,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + return AACENC_INVALID_CONFIG; /* downscaling only allowed for AOT_ER_AAC_ELD + */ + } +- if (config->userDownscaleFactor > 1 && config->userSbrEnabled == 1) { +- return AACENC_INVALID_CONFIG; /* downscaling only allowed for AOT_ER_AAC_ELD +- w/o SBR */ +- } + if (config->userDownscaleFactor > 1 && config->userChannelMode == 128) { + return AACENC_INVALID_CONFIG; /* disallow downscaling for AAC-ELDv2 */ + } +@@ -943,8 +671,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); + hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); + hAacConfig->syntaxFlags |= +- ((config->userSbrEnabled == 1) ? AC_SBR_PRESENT : 0); +- hAacConfig->syntaxFlags |= + ((config->userChannelMode == MODE_212) ? AC_LD_MPS : 0); + config->userTpType = + (config->userTpType != TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; +@@ -974,25 +700,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + break; + } + +- /* Initialize SBR parameters */ +- if ((config->userSbrRatio == 0) && (isSbrActive(hAacConfig))) { +- /* Automatic SBR ratio configuration +- * - downsampled SBR for ELD +- * - otherwise always dualrate SBR +- */ +- if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { +- hAacConfig->sbrRatio = ((hAacConfig->syntaxFlags & AC_LD_MPS) && +- (hAacConfig->sampleRate >= 27713)) +- ? 2 +- : 1; +- } else { +- hAacConfig->sbrRatio = 2; +- } +- } else { +- /* SBR ratio has been set by the user, so use it. */ +- hAacConfig->sbrRatio = isSbrActive(hAacConfig) ? config->userSbrRatio : 0; +- } +- + /* Set default bitrate */ + hAacConfig->bitRate = config->userBitrate; + +@@ -1001,7 +708,7 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + /* Set default bitrate if no external bitrate declared. */ + if (config->userBitrate == (UINT)-1) { + hAacConfig->bitRate = +- FDKaacEnc_GetCBRBitrate(hAacConfig, config->userSbrRatio); ++ FDKaacEnc_GetCBRBitrate(hAacConfig); + } + hAacConfig->averageBits = -1; + break; +@@ -1074,33 +781,8 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + } + } + +- if ((hAacConfig->audioObjectType == AOT_ER_AAC_ELD) && +- !(hAacConfig->syntaxFlags & AC_ELD_DOWNSCALE) && +- (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio == 0) && +- ((hAacConfig->syntaxFlags & AC_LD_MPS) == 0)) { +- const ELD_SBR_CONFIGURATOR *pConfig = NULL; +- +- if (NULL != +- (pConfig = eldSbrConfigurator( +- FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) +- ->nChannels, +- hAacConfig->sampleRate, hAacConfig->bitRate))) { +- hAacConfig->syntaxFlags |= (pConfig->sbrMode == 0) ? 0 : AC_SBR_PRESENT; +- hAacConfig->syntaxFlags |= (pConfig->chMode == MODE_212) ? AC_LD_MPS : 0; +- hAacConfig->channelMode = +- GetCoreChannelMode(pConfig->chMode, hAacConfig->audioObjectType); +- hAacConfig->nChannels = +- FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) +- ->nChannels; +- hAacConfig->sbrRatio = +- (pConfig->sbrMode == 0) ? 0 : (pConfig->sbrMode == 1) ? 1 : 2; +- } +- } +- + { +- UCHAR tpSignaling = +- getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, +- config->userTpSignaling, hAacConfig->sbrRatio); ++ UCHAR tpSignaling = SIG_UNKNOWN; + + if ((hAacConfig->audioObjectType == AOT_AAC_LC || + hAacConfig->audioObjectType == AOT_SBR || +@@ -1112,15 +794,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + /* For backward compatible explicit signaling, AMV1 has to be active */ + return AACENC_INVALID_CONFIG; + } +- +- if ((hAacConfig->audioObjectType == AOT_AAC_LC || +- hAacConfig->audioObjectType == AOT_SBR || +- hAacConfig->audioObjectType == AOT_PS) && +- (tpSignaling == 0) && (hAacConfig->sbrRatio == 1)) { +- /* Downsampled SBR has to be signaled explicitely (for transmission of SBR +- * sampling fequency) */ +- return AACENC_INVALID_CONFIG; +- } + } + + switch (hAacConfig->bitrateMode) { +@@ -1135,7 +808,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + NULL, hAacConfig->sampleRate, hAacConfig->framelength, + hAacConfig->nChannels, hAacConfig->channelMode, + hAacConfig->bitRate, hAacConfig->nSubFrames, +- isSbrActive(hAacConfig), hAacConfig->sbrRatio, + hAacConfig->syntaxFlags, hAacConfig->audioObjectType))) { + return AACENC_INVALID_CONFIG; + } +@@ -1167,13 +839,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + } + } + +- if ((hAacConfig->nChannels > hAacEncoder->nMaxAacChannels) || +- ((FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode) +- ->nChannelsEff > hAacEncoder->nMaxSbrChannels) && +- isSbrActive(hAacConfig))) { +- return AACENC_INVALID_CONFIG; /* not enough channels allocated */ +- } +- + /* Meta data restriction. */ + switch (hAacConfig->audioObjectType) { + /* Allow metadata support */ +@@ -1198,22 +863,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + return err; + } + +-static INT aacenc_SbrCallback(void *self, HANDLE_FDK_BITSTREAM hBs, +- const INT sampleRateIn, const INT sampleRateOut, +- const INT samplesPerFrame, +- const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, +- const INT elementIndex, const UCHAR harmonicSbr, +- const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, +- const INT downscaleFactor) { +- HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; +- +- sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0); +- +- return 0; +-} +- + INT aacenc_SscCallback(void *self, HANDLE_FDK_BITSTREAM hBs, + const AUDIO_OBJECT_TYPE coreCodec, + const INT samplingRate, const INT frameSize, +@@ -1230,7 +879,6 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + AACENC_ERROR err = AACENC_OK; + + INT aacBufferOffset = 0; +- HANDLE_SBR_ENCODER *hSbrEncoder = &hAacEncoder->hEnvEnc; + HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; + + hAacEncoder->nZerosAppended = 0; /* count appended zeros */ +@@ -1245,11 +893,6 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + return err; + } + frameLength = hAacConfig->framelength; /* adapt temporal framelength */ +- +- /* Seamless channel reconfiguration in sbr not fully implemented */ +- if ((prevChMode != hAacConfig->channelMode) && isSbrActive(hAacConfig)) { +- InitFlags |= AACENC_INIT_STATES; +- } + } + + /* Clear input buffer */ +@@ -1275,78 +918,13 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + hAacConfig->ancDataBitRate = 0; + } + +- if ((NULL != hAacEncoder->hEnvEnc) && isSbrActive(hAacConfig) && +- ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES))) { +- INT sbrError; +- UINT initFlag = 0; +- SBR_ELEMENT_INFO sbrElInfo[(8)]; +- CHANNEL_MAPPING channelMapping; +- CHANNEL_MODE channelMode = isPsActive(hAacConfig->audioObjectType) +- ? config->userChannelMode +- : hAacConfig->channelMode; +- INT numChannels = isPsActive(hAacConfig->audioObjectType) +- ? config->nChannels +- : hAacConfig->nChannels; +- +- if (FDKaacEnc_InitChannelMapping(channelMode, hAacConfig->channelOrder, +- &channelMapping) != AAC_ENC_OK) { +- return AACENC_INIT_ERROR; +- } +- +- /* Check return value and if the SBR encoder can handle enough elements */ +- if (channelMapping.nElements > (8)) { +- return AACENC_INIT_ERROR; +- } +- +- aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate); +- +- initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0; +- +- /* Let the SBR encoder take a look at the configuration and change if +- * required. */ +- sbrError = sbrEncoder_Init( +- *hSbrEncoder, sbrElInfo, channelMapping.nElements, +- hAacEncoder->inputBuffer, hAacEncoder->inputBufferSizePerChannel, +- &hAacConfig->bandWidth, &aacBufferOffset, &numChannels, +- hAacConfig->syntaxFlags, &hAacConfig->sampleRate, &hAacConfig->sbrRatio, +- &frameLength, hAacConfig->audioObjectType, &hAacEncoder->nDelay, +- (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC, +- (config->userTpHeaderPeriod != 0xFF) +- ? config->userTpHeaderPeriod +- : DEFAULT_HEADER_PERIOD_REPETITION_RATE, +- initFlag); +- +- /* Suppress AOT reconfiguration and check error status. */ +- if ((sbrError) || (numChannels != hAacConfig->nChannels)) { +- return AACENC_INIT_SBR_ERROR; +- } +- +- if (numChannels == 1) { +- hAacConfig->channelMode = MODE_1; +- } +- +- /* Never use PNS if SBR is active */ +- if (hAacConfig->usePns) { +- hAacConfig->usePns = 0; +- } +- +- /* estimated bitrate consumed by SBR or PS */ +- hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder); +- +- } /* sbr initialization */ +- + if ((hAacEncoder->hMpsEnc != NULL) && (hAacConfig->syntaxFlags & AC_LD_MPS)) { + int coreCoderDelay = DELAY_AACELD(hAacConfig->framelength); + +- if (isSbrActive(hAacConfig)) { +- coreCoderDelay = hAacConfig->sbrRatio * coreCoderDelay + +- sbrEncoder_GetInputDataDelay(*hSbrEncoder); +- } +- + if (MPS_ENCODER_OK != + FDK_MpegsEnc_Init(hAacEncoder->hMpsEnc, hAacConfig->audioObjectType, + config->userSamplerate, hAacConfig->bitRate, +- isSbrActive(hAacConfig) ? hAacConfig->sbrRatio : 0, ++ 0, + frameLength, /* for dual rate sbr this value is + already multiplied by 2 */ + hAacEncoder->inputBufferSizePerChannel, +@@ -1365,8 +943,7 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + + FDKaacEnc_MapConfig( + &hAacEncoder->coderConfig, config, +- getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, +- config->userTpSignaling, hAacConfig->sbrRatio), ++ SIG_UNKNOWN, + hAacConfig); + + /* create flags for transport encoder */ +@@ -1405,11 +982,6 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES))) { + INT inputDataDelay = DELAY_AAC(hAacConfig->framelength); + +- if (isSbrActive(hAacConfig) && hSbrEncoder != NULL) { +- inputDataDelay = hAacConfig->sbrRatio * inputDataDelay + +- sbrEncoder_GetInputDataDelay(*hSbrEncoder); +- } +- + if (FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc, + ((InitFlags & AACENC_INIT_STATES) ? 1 : 0), + config->userMetaDataMode, inputDataDelay, +@@ -1428,10 +1000,6 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + hAacEncoder->nDelayCore = + hAacEncoder->nDelay - + fMax(0, FDK_MpegsEnc_GetDecDelay(hAacEncoder->hMpsEnc)); +- } else if (isSbrActive(hAacConfig) && hSbrEncoder != NULL) { +- hAacEncoder->nDelayCore = +- hAacEncoder->nDelay - +- fMax(0, sbrEncoder_GetSbrDecDelay(hAacEncoder->hEnvEnc)); + } else { + hAacEncoder->nDelayCore = hAacEncoder->nDelay; + } +@@ -1497,17 +1065,10 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + /* Determine max channel configuration. */ + if (maxChannels == 0) { + hAacEncoder->nMaxAacChannels = (8); +- hAacEncoder->nMaxSbrChannels = (8); + } else { + hAacEncoder->nMaxAacChannels = (maxChannels & 0x00FF); +- if ((hAacEncoder->encoder_modis & ENC_MODE_FLAG_SBR)) { +- hAacEncoder->nMaxSbrChannels = (maxChannels & 0xFF00) +- ? (maxChannels >> 8) +- : hAacEncoder->nMaxAacChannels; +- } + +- if ((hAacEncoder->nMaxAacChannels > (8)) || +- (hAacEncoder->nMaxSbrChannels > (8))) { ++ if ((hAacEncoder->nMaxAacChannels > (8))) { + err = AACENC_INVALID_CONFIG; + goto bail; + } +@@ -1515,7 +1076,6 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + + /* Max number of elements could be tuned any more. */ + hAacEncoder->nMaxAacElements = fixMin(((8)), hAacEncoder->nMaxAacChannels); +- hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels); + + /* In case of memory overlay, allocate memory out of libraries */ + +@@ -1533,23 +1093,6 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + goto bail; + } + +- /* Open SBR Encoder */ +- if (hAacEncoder->encoder_modis & ENC_MODE_FLAG_SBR) { +- if (sbrEncoder_Open( +- &hAacEncoder->hEnvEnc, hAacEncoder->nMaxSbrElements, +- hAacEncoder->nMaxSbrChannels, +- (hAacEncoder->encoder_modis & ENC_MODE_FLAG_PS) ? 1 : 0)) { +- err = AACENC_MEMORY_ERROR; +- goto bail; +- } +- +- if (NULL == (hAacEncoder->pSbrPayload = (SBRENC_EXT_PAYLOAD *)FDKcalloc( +- 1, sizeof(SBRENC_EXT_PAYLOAD)))) { +- err = AACENC_MEMORY_ERROR; +- goto bail; +- } +- } /* (encoder_modis&ENC_MODE_FLAG_SBR) */ +- + /* Open Aac Encoder */ + if (FDKaacEnc_Open(&hAacEncoder->hAacEnc, hAacEncoder->nMaxAacElements, + hAacEncoder->nMaxAacChannels, (1)) != AAC_ENC_OK) { +@@ -1603,11 +1146,6 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + + C_ALLOC_SCRATCH_END(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) + } +- if (transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, +- hAacEncoder) != 0) { +- err = AACENC_INIT_TP_ERROR; +- goto bail; +- } + if (transportEnc_RegisterSscCallback(hAacEncoder->hTpEnc, aacenc_SscCallback, + hAacEncoder) != 0) { + err = AACENC_INIT_TP_ERROR; +@@ -1655,13 +1193,6 @@ AACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder) { + hAacEncoder->outBuffer = NULL; + } + +- if (hAacEncoder->hEnvEnc) { +- sbrEncoder_Close(&hAacEncoder->hEnvEnc); +- } +- if (hAacEncoder->pSbrPayload != NULL) { +- FDKfree(hAacEncoder->pSbrPayload); +- hAacEncoder->pSbrPayload = NULL; +- } + if (hAacEncoder->hAacEnc) { + FDKaacEnc_Close(&hAacEncoder->hAacEnc); + } +@@ -1825,9 +1356,6 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, + for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) { + hAacEncoder->extPayload[i].associatedChElement = -1; + } +- if (hAacEncoder->pSbrPayload != NULL) { +- FDKmemclear(hAacEncoder->pSbrPayload, sizeof(*hAacEncoder->pSbrPayload)); +- } + + /* + * Calculate Meta Data info. +@@ -1895,41 +1423,6 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, + } + } + +- if ((NULL != hAacEncoder->hEnvEnc) && (NULL != hAacEncoder->pSbrPayload) && +- isSbrActive(&hAacEncoder->aacConfig)) { +- INT nPayload = 0; +- +- /* +- * Encode SBR data. +- */ +- if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer, +- hAacEncoder->inputBufferSizePerChannel, +- hAacEncoder->pSbrPayload->dataSize[nPayload], +- hAacEncoder->pSbrPayload->data[nPayload])) { +- err = AACENC_ENCODE_ERROR; +- goto bail; +- } else { +- /* Add SBR extension payload */ +- for (i = 0; i < (8); i++) { +- if (hAacEncoder->pSbrPayload->dataSize[nPayload][i] > 0) { +- hAacEncoder->extPayload[nExtensions].pData = +- hAacEncoder->pSbrPayload->data[nPayload][i]; +- { +- hAacEncoder->extPayload[nExtensions].dataSize = +- hAacEncoder->pSbrPayload->dataSize[nPayload][i]; +- hAacEncoder->extPayload[nExtensions].associatedChElement = i; +- } +- hAacEncoder->extPayload[nExtensions].dataType = +- EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set +- EXT_SBR_DATA_CRC */ +- nExtensions++; /* or EXT_SBR_DATA according to configuration. */ +- FDK_ASSERT(nExtensions <= MAX_TOTAL_EXT_PAYLOADS); +- } +- } +- nPayload++; +- } +- } /* sbrEnabled */ +- + if ((inargs->numAncBytes > 0) && + (getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA) != -1)) { + INT idx = getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA); +@@ -1962,14 +1455,6 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, + hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead; + + /* +- * Delay balancing buffer handling +- */ +- if (isSbrActive(&hAacEncoder->aacConfig)) { +- sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer, +- hAacEncoder->inputBufferSizePerChannel); +- } +- +- /* + * Make bitstream public + */ + if ((outBufDesc != NULL) && (outBufDesc->numBufs >= 1)) { +@@ -2043,7 +1528,6 @@ AACENC_ERROR aacEncGetLibInfo(LIB_INFO *info) { + + FDK_toolsGetLibInfo(info); + transportEnc_GetLibInfo(info); +- sbrEncoder_GetLibInfo(info); + FDK_MpegsEnc_GetLibInfo(info); + + /* search for next free tab */ +@@ -2242,23 +1726,10 @@ AACENC_ERROR aacEncoder_SetParam(const HANDLE_AACENCODER hAacEncoder, + } + break; + case AACENC_SBR_RATIO: +- if (settings->userSbrRatio != value) { +- if (!((value == 0) || (value == 1) || (value == 2))) { +- err = AACENC_INVALID_CONFIG; +- break; +- } +- settings->userSbrRatio = value; +- hAacEncoder->InitFlags |= +- AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; +- } ++ err = AACENC_INVALID_CONFIG; + break; + case AACENC_SBR_MODE: +- if ((settings->userSbrEnabled != value) && +- (NULL != hAacEncoder->hEnvEnc)) { +- settings->userSbrEnabled = value; +- hAacEncoder->InitFlags |= +- AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; +- } ++ err = AACENC_INVALID_CONFIG; + break; + case AACENC_TRANSMUX: + if (settings->userTpType != (TRANSPORT_TYPE)value) { +@@ -2421,21 +1892,16 @@ UINT aacEncoder_GetParam(const HANDLE_AACENCODER hAacEncoder, + value = (UINT)hAacEncoder->aacConfig.framelength; + break; + case AACENC_SBR_RATIO: +- value = isSbrActive(&hAacEncoder->aacConfig) +- ? hAacEncoder->aacConfig.sbrRatio +- : 0; ++ value = 0; + break; + case AACENC_SBR_MODE: +- value = +- (UINT)(hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0; ++ value = 0; + break; + case AACENC_TRANSMUX: + value = (UINT)settings->userTpType; + break; + case AACENC_SIGNALING_MODE: +- value = (UINT)getSbrSignalingMode( +- hAacEncoder->aacConfig.audioObjectType, settings->userTpType, +- settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio); ++ value = SIG_UNKNOWN; + break; + case AACENC_PROTECTION: + value = (UINT)settings->userTpProtection; +diff --git a/libMpegTPDec/include/tp_data.h b/libMpegTPDec/include/tp_data.h +index b015332..180b097 100644 +--- a/libMpegTPDec/include/tp_data.h ++++ b/libMpegTPDec/include/tp_data.h +@@ -372,15 +372,6 @@ typedef INT (*cbSsc_t)(void *, HANDLE_FDK_BITSTREAM, + const INT coreSbrFrameLengthIndex, const INT configBytes, + const UCHAR configMode, UCHAR *configChanged); + +-typedef INT (*cbSbr_t)(void *self, HANDLE_FDK_BITSTREAM hBs, +- const INT sampleRateIn, const INT sampleRateOut, +- const INT samplesPerFrame, +- const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, const INT elementIndex, +- const UCHAR harmonicSbr, const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, +- const INT downscaleFactor); +- + typedef INT (*cbUsac_t)(void *self, HANDLE_FDK_BITSTREAM hBs); + + typedef INT (*cbUniDrc_t)(void *self, HANDLE_FDK_BITSTREAM hBs, +@@ -401,8 +392,6 @@ typedef struct { + callback. */ + cbSsc_t cbSsc; /*!< Function pointer for SSC parser callback. */ + void *cbSscData; /*!< User data pointer for SSC parser callback. */ +- cbSbr_t cbSbr; /*!< Function pointer for SBR header parser callback. */ +- void *cbSbrData; /*!< User data pointer for SBR header parser callback. */ + cbUsac_t cbUsac; + void *cbUsacData; + cbUniDrc_t cbUniDrc; /*!< Function pointer for uniDrcConfig and +diff --git a/libMpegTPDec/include/tpdec_lib.h b/libMpegTPDec/include/tpdec_lib.h +index 30e53c1..04e3d07 100644 +--- a/libMpegTPDec/include/tpdec_lib.h ++++ b/libMpegTPDec/include/tpdec_lib.h +@@ -435,18 +435,6 @@ int transportDec_RegisterSscCallback(HANDLE_TRANSPORTDEC hTp, + const cbSsc_t cbSscParse, void *user_data); + + /** +- * \brief Register SBR header parser callback. +- * \param hTp Handle of transport decoder. +- * \param cbUpdateConfig Pointer to a callback function to handle SBR header +- * parsing. +- * \param user_data void pointer for user data passed to the callback as +- * first parameter. +- * \return 0 on success. +- */ +-int transportDec_RegisterSbrCallback(HANDLE_TRANSPORTDEC hTpDec, +- const cbSbr_t cbSbr, void *user_data); +- +-/** + * \brief Register USAC SC parser callback. + * \param hTp Handle of transport decoder. + * \param cbUpdateConfig Pointer to a callback function to handle USAC SC +diff --git a/libMpegTPDec/src/tpdec_asc.cpp b/libMpegTPDec/src/tpdec_asc.cpp +index 28bc22d..bee0917 100644 +--- a/libMpegTPDec/src/tpdec_asc.cpp ++++ b/libMpegTPDec/src/tpdec_asc.cpp +@@ -1296,27 +1296,6 @@ static INT ld_sbr_header(CSAudioSpecificConfig *asc, const INT dsFactor, + 1)) { + return TRANSPORTDEC_PARSE_ERROR; + } +- +- /* read elements of the passed channel_configuration until there is ID_NONE */ +- while ((element = channel_configuration_array[channelConfiguration][j]) != +- ID_NONE) { +- /* Setup LFE element for upsampling too. This is essential especially for +- * channel configs where the LFE element is not at the last position for +- * example in channel config 13 or 14. It leads to memory leaks if the setup +- * of the LFE element would be done later in the core. */ +- if (element == ID_SCE || element == ID_CPE || element == ID_LFE) { +- error |= cb->cbSbr( +- cb->cbSbrData, hBs, asc->m_samplingFrequency / dsFactor, +- asc->m_extensionSamplingFrequency / dsFactor, +- asc->m_samplesPerFrame / dsFactor, AOT_ER_AAC_ELD, element, i++, 0, 0, +- asc->configMode, &asc->SbrConfigChanged, dsFactor); +- if (error != TRANSPORTDEC_OK) { +- goto bail; +- } +- } +- j++; +- } +-bail: + return error; + } + +@@ -1353,40 +1332,6 @@ static TRANSPORTDEC_ERROR EldSpecificConfig_Parse(CSAudioSpecificConfig *asc, + + asc->m_extensionSamplingFrequency = asc->m_samplingFrequency + << esc->m_sbrSamplingRate; +- +- if (cb->cbSbr != NULL) { +- /* ELD reduced delay mode: LD-SBR initialization has to know the downscale +- information. Postpone LD-SBR initialization and read ELD extension +- information first. */ +- switch (asc->m_channelConfiguration) { +- case 1: +- case 2: +- numSbrHeader = 1; +- break; +- case 3: +- numSbrHeader = 2; +- break; +- case 4: +- case 5: +- case 6: +- numSbrHeader = 3; +- break; +- case 7: +- case 11: +- case 12: +- case 14: +- numSbrHeader = 4; +- break; +- default: +- numSbrHeader = 0; +- break; +- } +- for (sbrIndex = 0; sbrIndex < numSbrHeader; sbrIndex++) { +- ldSbrLen += skipSbrHeader(hBs, 0); +- } +- } else { +- return TRANSPORTDEC_UNSUPPORTED_FORMAT; +- } + } + esc->m_useLdQmfTimeAlign = 0; + +@@ -1751,21 +1696,10 @@ static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse( + usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1); + /* end of UsacCoreConfig() */ + if (usc->m_sbrRatioIndex > 0) { +- if (cb->cbSbr == NULL) { +- return TRANSPORTDEC_UNKOWN_ERROR; +- } + /* SbrConfig() ISO/IEC FDIS 23003-3 Table 11 */ + usc->element[i].m_harmonicSBR = FDKreadBit(hBs); + usc->element[i].m_interTes = FDKreadBit(hBs); + usc->element[i].m_pvc = FDKreadBit(hBs); +- if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, +- asc->m_extensionSamplingFrequency, +- asc->m_samplesPerFrame, asc->m_aot, ID_SCE, +- channelElementIdx, usc->element[i].m_harmonicSBR, +- usc->element[i].m_stereoConfigIndex, asc->configMode, +- &asc->SbrConfigChanged, 1)) { +- return TRANSPORTDEC_PARSE_ERROR; +- } + /* end of SbrConfig() */ + } + usc->m_nUsacChannels += 1; +@@ -1780,7 +1714,6 @@ static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse( + usc->element[i].m_noiseFilling = FDKreadBits(hBs, 1); + /* end of UsacCoreConfig() */ + if (usc->m_sbrRatioIndex > 0) { +- if (cb->cbSbr == NULL) return TRANSPORTDEC_UNKOWN_ERROR; + /* SbrConfig() ISO/IEC FDIS 23003-3 */ + usc->element[i].m_harmonicSBR = FDKreadBit(hBs); + usc->element[i].m_interTes = FDKreadBit(hBs); +@@ -1798,14 +1731,6 @@ static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse( + usc->element[i].m_stereoConfigIndex == 2) + ? ID_SCE + : ID_CPE; +- if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, +- asc->m_extensionSamplingFrequency, +- asc->m_samplesPerFrame, asc->m_aot, el_type, +- channelElementIdx, usc->element[i].m_harmonicSBR, +- usc->element[i].m_stereoConfigIndex, asc->configMode, +- &asc->SbrConfigChanged, 1)) { +- return TRANSPORTDEC_PARSE_ERROR; +- } + } + /* end of SbrConfig() */ + +@@ -1847,19 +1772,9 @@ static TRANSPORTDEC_ERROR UsacRsv60DecoderConfig_Parse( + usc->element[i].m_noiseFilling = 0; + usc->m_nUsacChannels += 1; + if (usc->m_sbrRatioIndex > 0) { +- /* Use SBR for upsampling */ +- if (cb->cbSbr == NULL) return ErrorStatus = TRANSPORTDEC_UNKOWN_ERROR; + usc->element[i].m_harmonicSBR = (UCHAR)0; + usc->element[i].m_interTes = (UCHAR)0; + usc->element[i].m_pvc = (UCHAR)0; +- if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, +- asc->m_extensionSamplingFrequency, +- asc->m_samplesPerFrame, asc->m_aot, ID_LFE, +- channelElementIdx, usc->element[i].m_harmonicSBR, +- usc->element[i].m_stereoConfigIndex, asc->configMode, +- &asc->SbrConfigChanged, 1)) { +- return ErrorStatus = TRANSPORTDEC_PARSE_ERROR; +- } + } + channelElementIdx++; + break; +@@ -2301,19 +2216,6 @@ static TRANSPORTDEC_ERROR Drm_xHEAACDecoderConfig( + if (cb == NULL) { + return ErrorStatus; + } +- if (cb->cbSbr != NULL) { +- usc->element[elemIdx].m_harmonicSBR = FDKreadBit(hBs); +- usc->element[elemIdx].m_interTes = FDKreadBit(hBs); +- usc->element[elemIdx].m_pvc = FDKreadBit(hBs); +- if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, +- asc->m_extensionSamplingFrequency, +- asc->m_samplesPerFrame, asc->m_aot, ID_SCE, elemIdx, +- usc->element[elemIdx].m_harmonicSBR, +- usc->element[elemIdx].m_stereoConfigIndex, +- asc->configMode, &asc->SbrConfigChanged, 1)) { +- return ErrorStatus = TRANSPORTDEC_PARSE_ERROR; +- } +- } + } + break; + case 2: /* stereo: ID_USAC_CPE */ +@@ -2362,15 +2264,6 @@ static TRANSPORTDEC_ERROR Drm_xHEAACDecoderConfig( + usc->element[elemIdx].m_stereoConfigIndex == 2) + ? ID_SCE + : ID_CPE; +- if (cb->cbSbr == NULL) return ErrorStatus = TRANSPORTDEC_UNKOWN_ERROR; +- if (cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, +- asc->m_extensionSamplingFrequency, +- asc->m_samplesPerFrame, asc->m_aot, el_type, elemIdx, +- usc->element[elemIdx].m_harmonicSBR, +- usc->element[elemIdx].m_stereoConfigIndex, +- asc->configMode, &asc->SbrConfigChanged, 1)) { +- return ErrorStatus = TRANSPORTDEC_PARSE_ERROR; +- } + } + /*usc->element[elemIdx].m_stereoConfigIndex =*/FDKreadBits(hBs, 2); + if (usc->element[elemIdx].m_stereoConfigIndex > 0) { +diff --git a/libMpegTPDec/src/tpdec_lib.cpp b/libMpegTPDec/src/tpdec_lib.cpp +index 1976cb9..75b5150 100644 +--- a/libMpegTPDec/src/tpdec_lib.cpp ++++ b/libMpegTPDec/src/tpdec_lib.cpp +@@ -602,16 +602,6 @@ int transportDec_RegisterSscCallback(HANDLE_TRANSPORTDEC hTpDec, + return 0; + } + +-int transportDec_RegisterSbrCallback(HANDLE_TRANSPORTDEC hTpDec, +- const cbSbr_t cbSbr, void *user_data) { +- if (hTpDec == NULL) { +- return -1; +- } +- hTpDec->callbacks.cbSbr = cbSbr; +- hTpDec->callbacks.cbSbrData = user_data; +- return 0; +-} +- + int transportDec_RegisterUsacCallback(HANDLE_TRANSPORTDEC hTpDec, + const cbUsac_t cbUsac, void *user_data) { + if (hTpDec == NULL) { +diff --git a/libMpegTPEnc/include/tpenc_lib.h b/libMpegTPEnc/include/tpenc_lib.h +index 4eb89a7..ba6d672 100644 +--- a/libMpegTPEnc/include/tpenc_lib.h ++++ b/libMpegTPEnc/include/tpenc_lib.h +@@ -148,18 +148,6 @@ typedef struct TRANSPORTENC *HANDLE_TRANSPORTENC; + CHANNEL_MODE transportEnc_GetChannelMode(int noChannels); + + /** +- * \brief Register SBR heaqder writer callback. +- * \param hTp Handle of transport decoder. +- * \param cbUpdateConfig Pointer to a callback function to handle SBR header +- * writing. +- * \param user_data void pointer for user data passed to the callback as +- * first parameter. +- * \return 0 on success. +- */ +-int transportEnc_RegisterSbrCallback(HANDLE_TRANSPORTENC hTpEnc, +- const cbSbr_t cbSbr, void *user_data); +- +-/** + * \brief Register USAC SC writer callback. + * \param hTp Handle of transport decoder. + * \param cbUpdateConfig Pointer to a callback function to handle USAC +diff --git a/libMpegTPEnc/src/tpenc_asc.cpp b/libMpegTPEnc/src/tpenc_asc.cpp +index 0b484a0..0f84b45 100644 +--- a/libMpegTPEnc/src/tpenc_asc.cpp ++++ b/libMpegTPEnc/src/tpenc_asc.cpp +@@ -769,25 +769,6 @@ static int transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs, + FDKwriteBits(hBs, (config->samplingRate == config->extSamplingRate) ? 0 : 1, + 1); /* Samplerate Flag */ + FDKwriteBits(hBs, (config->flags & CC_SBRCRC) ? 1 : 0, 1); /* SBR CRC flag*/ +- +- if (cb->cbSbr != NULL) { +- const PCE_CONFIGURATION *pPce; +- int e, sbrElementIndex = 0; +- +- pPce = getPceEntry(config->channelMode); +- +- for (e = 0; e < pPce->num_front_channel_elements + +- pPce->num_side_channel_elements + +- pPce->num_back_channel_elements + +- pPce->num_lfe_channel_elements; +- e++) { +- if ((pPce->pEl_type[e] == ID_SCE) || (pPce->pEl_type[e] == ID_CPE)) { +- cb->cbSbr(cb->cbSbrData, hBs, 0, 0, 0, config->aot, pPce->pEl_type[e], +- sbrElementIndex, 0, 0, 0, NULL, 1); +- sbrElementIndex++; +- } +- } +- } + } + + if ((config->flags & CC_SAC) && (cb->cbSsc != NULL)) { +diff --git a/libSBRdec/include/sbrdecoder.h b/libSBRdec/include/sbrdecoder.h +deleted file mode 100644 +index cc55572..0000000 +--- a/libSBRdec/include/sbrdecoder.h ++++ /dev/null +@@ -1,401 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: SBR decoder front-end prototypes and definitions. +- +-*******************************************************************************/ +- +-#ifndef SBRDECODER_H +-#define SBRDECODER_H +- +-#include "common_fix.h" +- +-#include "FDK_bitstream.h" +-#include "FDK_audio.h" +- +-#include "FDK_qmf_domain.h" +- +-#define SBR_DEBUG_EXTHLP \ +- "\ +---- SBR ---\n\ +- 0x00000010 Ancillary data and SBR-Header\n\ +- 0x00000020 SBR-Side info\n\ +- 0x00000040 Decoded SBR-bitstream data, e.g. envelope data\n\ +- 0x00000080 SBR-Bitstream statistics\n\ +- 0x00000100 Miscellaneous SBR-messages\n\ +- 0x00000200 SBR-Energies and gains in the adjustor\n\ +- 0x00000400 Fatal SBR errors\n\ +- 0x00000800 Transposer coefficients for inverse filtering\n\ +-" +- +-/* Capability flags */ +-#define CAPF_SBR_LP \ +- 0x00000001 /*!< Flag indicating library's capability of Low Power mode. */ +-#define CAPF_SBR_HQ \ +- 0x00000002 /*!< Flag indicating library's capability of High Quality mode. \ +- */ +-#define CAPF_SBR_DRM_BS \ +- 0x00000004 /*!< Flag indicating library's capability to decode DRM SBR data. \ +- */ +-#define CAPF_SBR_CONCEALMENT \ +- 0x00000008 /*!< Flag indicating library's capability to conceal erroneous \ +- frames. */ +-#define CAPF_SBR_DRC \ +- 0x00000010 /*!< Flag indicating library's capability for Dynamic Range \ +- Control. */ +-#define CAPF_SBR_PS_MPEG \ +- 0x00000020 /*!< Flag indicating library's capability to do MPEG Parametric \ +- Stereo. */ +-#define CAPF_SBR_PS_DRM \ +- 0x00000040 /*!< Flag indicating library's capability to do DRM Parametric \ +- Stereo. */ +-#define CAPF_SBR_ELD_DOWNSCALE \ +- 0x00000080 /*!< Flag indicating library's capability to do ELD decoding in \ +- downscaled mode */ +-#define CAPF_SBR_HBEHQ \ +- 0x00000100 /*!< Flag indicating library's capability to do HQ Harmonic \ +- transposing */ +- +-typedef enum { +- SBRDEC_OK = 0, /*!< All fine. */ +- /* SBRDEC_CONCEAL, */ +- /* SBRDEC_NOSYNCH, */ +- /* SBRDEC_ILLEGAL_PROGRAM, */ +- /* SBRDEC_ILLEGAL_TAG, */ +- /* SBRDEC_ILLEGAL_CHN_CONFIG, */ +- /* SBRDEC_ILLEGAL_SECTION, */ +- /* SBRDEC_ILLEGAL_SCFACTORS, */ +- /* SBRDEC_ILLEGAL_PULSE_DATA, */ +- /* SBRDEC_MAIN_PROFILE_NOT_IMPLEMENTED, */ +- /* SBRDEC_GC_NOT_IMPLEMENTED, */ +- /* SBRDEC_ILLEGAL_PLUS_ELE_ID, */ +- SBRDEC_INVALID_ARGUMENT, /*!< */ +- SBRDEC_CREATE_ERROR, /*!< */ +- SBRDEC_NOT_INITIALIZED, /*!< */ +- SBRDEC_MEM_ALLOC_FAILED, /*!< Memory allocation failed. Probably not enough +- memory available. */ +- SBRDEC_PARSE_ERROR, /*!< */ +- SBRDEC_UNSUPPORTED_CONFIG, /*!< */ +- SBRDEC_SET_PARAM_FAIL, /*!< */ +- SBRDEC_OUTPUT_BUFFER_TOO_SMALL /*!< */ +-} SBR_ERROR; +- +-typedef enum { +- SBR_SYSTEM_BITSTREAM_DELAY, /*!< System: Switch to enable an additional SBR +- bitstream delay of one frame. */ +- SBR_QMF_MODE, /*!< Set QMF mode, either complex or low power. */ +- SBR_LD_QMF_TIME_ALIGN, /*!< Set QMF type, either LD-MPS or CLDFB. Relevant for +- ELD streams only. */ +- SBR_FLUSH_DATA, /*!< Set internal state to flush the decoder with the next +- process call. */ +- SBR_CLEAR_HISTORY, /*!< Clear all internal states (delay lines, QMF states, +- ...). */ +- SBR_BS_INTERRUPTION /*!< Signal bit stream interruption. Value is ignored. */ +- , +- SBR_SKIP_QMF /*!< Enable skipping of QMF step: 1 skip analysis, 2 skip +- synthesis */ +-} SBRDEC_PARAM; +- +-typedef struct SBR_DECODER_INSTANCE *HANDLE_SBRDECODER; +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-/** +- * \brief Allocates and initializes one SBR decoder instance. +- * \param pSelf Pointer to where a SBR decoder handle is copied into. +- * \param pQmfDomain Pointer to QMF domain data structure. +- * +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain); +- +-/** +- * \brief Initialize a SBR decoder runtime instance. Must be called before +- * decoding starts. +- * +- * \param self Handle to a SBR decoder instance. +- * \param sampleRateIn Input samplerate of the SBR decoder instance. +- * \param sampleRateOut Output samplerate of the SBR decoder instance. +- * \param samplesPerFrame Number of samples per frames. +- * \param coreCodec Audio Object Type (AOT) of the core codec. +- * \param elementID Table with MPEG-4 element Ids in canonical order. +- * \param elementIndex SBR element index +- * \param harmonicSBR +- * \param stereoConfigIndex +- * \param downscaleFactor ELD downscale factor +- * \param configMode Table with MPEG-4 element Ids in canonical order. +- * \param configChanged Flag that enforces a complete decoder reset. +- * +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_InitElement( +- HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, +- const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, const int elementIndex, +- const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor); +- +-/** +- * \brief Free config dependent SBR memory. +- * \param self SBR decoder instance handle +- */ +-SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self); +- +-/** +- * \brief pass out of band SBR header to SBR decoder +- * +- * \param self Handle to a SBR decoder instance. +- * \param hBs bit stream handle data source. +- * \param sampleRateIn SBR input sampling rate +- * \param sampleRateOut SBR output sampling rate +- * \param samplesPerFrame frame length +- * \param elementID SBR element ID. +- * \param elementIndex SBR element index. +- * \param harmonicSBR +- * \param stereoConfigIndex +- * \param downscaleFactor ELD downscale factor +- * +- * \return Error code. +- */ +-INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, +- const INT sampleRateIn, const INT sampleRateOut, +- const INT samplesPerFrame, +- const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, const INT elementIndex, +- const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, +- const INT downscaleFactor); +- +-/** +- * \brief Set a parameter of the SBR decoder runtime instance. +- * \param self SBR decoder handle. +- * \param param Parameter which will be set if successfull. +- * \param value New parameter value. +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param, +- const INT value); +- +-/** +- * \brief Feed DRC channel data into a SBR decoder runtime instance. +- * +- * \param self SBR decoder handle. +- * \param ch Channel number to which the DRC data is +- * associated to. +- * \param numBands Number of DRC bands. +- * \param pNextFact_mag Pointer to a table with the DRC factor +- * magnitudes. +- * \param nextFact_exp Exponent for all DRC factors. +- * \param drcInterpolationScheme DRC interpolation scheme. +- * \param winSequence Window sequence from core coder (eight short +- * or one long window). +- * \param pBandTop Pointer to a table with the top borders for +- * all DRC bands. +- * +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch, +- UINT numBands, FIXP_DBL *pNextFact_mag, +- INT nextFact_exp, +- SHORT drcInterpolationScheme, +- UCHAR winSequence, USHORT *pBandTop); +- +-/** +- * \brief Disable SBR DRC for a certain channel. +- * +- * \param hSbrDecoder SBR decoder handle. +- * \param ch Number of the channel that has to be disabled. +- * +- * \return None. +- */ +-void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch); +- +-/** +- * \brief Parse one SBR element data extension data block. The bit stream +- * position will be placed at the end of the SBR payload block. The remaining +- * bits will be returned into *count if a payload length is given +- * (byPayLen > 0). If no SBR payload length is given (bsPayLen < 0) then +- * the bit stream position on return will be random after this function +- * call in case of errors, and any further decoding will be completely +- * pointless. This function accepts either normal ordered SBR data or reverse +- * ordered DRM SBR data. +- * +- * \param self SBR decoder handle. +- * \param hBs Bit stream handle as data source. +- * \param count Pointer to an integer where the amount of parsed SBR +- * payload bits is stored into. +- * \param bsPayLen If > 0 this value is the SBR payload length. If < 0, +- * the SBR payload length is unknown. +- * \param flags CRC flag (0: EXT_SBR_DATA; 1: EXT_SBR_DATA_CRC) +- * \param prev_element Previous MPEG-4 element ID. +- * \param element_index Index of the current element. +- * \param acFlags Audio codec flags +- * +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, +- UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize, +- int *count, int bsPayLen, int crcFlag, +- MP4_ELEMENT_ID prev_element, int element_index, +- UINT acFlags, UINT acElFlags[]); +- +-/** +- * \brief This function decodes the given SBR bitstreams and applies SBR to the +- * given time data. +- * +- * SBR-processing works InPlace. I.e. the calling function has to provide +- * a time domain buffer timeData which can hold the completely decoded +- * result. +- * +- * Left and right channel are read and stored according to the +- * interleaving flag, frame length and number of channels. +- * +- * \param self Handle of an open SBR decoder instance. +- * \param hSbrBs SBR Bitstream handle. +- * \param input Pointer to input data. +- * \param timeData Pointer to upsampled output data. +- * \param timeDataSize Size of timeData. +- * \param numChannels Pointer to a buffer holding the number of channels in +- * time data buffer. +- * \param sampleRate Output samplerate. +- * \param channelMapping Channel mapping indices. +- * \param coreDecodedOk Flag indicating if the core decoder did not find any +- * error (0: core decoder found errors, 1: no errors). +- * \param psDecoded Pointer to a buffer holding a flag. Input: PS is +- * possible, Output: PS has been rendered. +- * +- * \return Error code. +- */ +-SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, +- INT_PCM *timeData, const int timeDataSize, +- int *numChannels, int *sampleRate, +- const FDK_channelMapDescr *const mapDescr, +- const int mapIdx, const int coreDecodedOk, +- UCHAR *psDecoded); +- +-/** +- * \brief Close SBR decoder instance and free memory. +- * \param self SBR decoder handle. +- * \return Error Code. +- */ +-SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *self); +- +-/** +- * \brief Get SBR decoder library information. +- * \param info Pointer to a LIB_INFO struct, where library information is +- * written to. +- * \return 0 on success, -1 if invalid handle or if no free element is +- * available to write information to. +- */ +-INT sbrDecoder_GetLibInfo(LIB_INFO *info); +- +-/** +- * \brief Determine the modules output signal delay in samples. +- * \param self SBR decoder handle. +- * \return The number of samples signal delay added by the module. +- */ +-UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif +diff --git a/libSBRdec/src/HFgen_preFlat.cpp b/libSBRdec/src/HFgen_preFlat.cpp +deleted file mode 100644 +index 96adbb9..0000000 +--- a/libSBRdec/src/HFgen_preFlat.cpp ++++ /dev/null +@@ -1,993 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Oliver Moser, Manuel Jander, Matthias Hildenbrand +- +- Description: QMF frequency pre-whitening for SBR. +- In the documentation the terms "scale factor" and "exponent" +- mean the same. Variables containing such information have +- the suffix "_sf". +- +-*******************************************************************************/ +- +-#include "HFgen_preFlat.h" +- +-#define POLY_ORDER 3 +-#define MAXLOWBANDS 32 +-#define LOG10FAC 0.752574989159953f /* == 10/log2(10) * 2^-2 */ +-#define LOG10FAC_INV 0.664385618977472f /* == log2(10)/20 * 2^2 */ +- +-#define FIXP_CHB FIXP_SGL /* STB sinus Tab used in transformation */ +-#define CHC(a) (FX_DBL2FXCONST_SGL(a)) +-#define FX_CHB2FX_DBL(a) FX_SGL2FX_DBL(a) +- +-typedef struct backsubst_data { +- FIXP_CHB Lnorm1d[3]; /*!< Normalized L matrix */ +- SCHAR Lnorm1d_sf[3]; +- FIXP_CHB Lnormii +- [3]; /*!< The diagonal data points [i][i] of the normalized L matrix */ +- SCHAR Lnormii_sf[3]; +- FIXP_CHB Bmul0 +- [4]; /*!< To normalize L*x=b, Bmul0 is what we need to multiply b with. */ +- SCHAR Bmul0_sf[4]; +- FIXP_CHB LnormInv1d[6]; /*!< Normalized inverted L matrix (L') */ +- SCHAR LnormInv1d_sf[6]; +- FIXP_CHB +- Bmul1[4]; /*!< To normalize L'*x=b, Bmul1 is what we need to multiply b +- with. */ +- SCHAR Bmul1_sf[4]; +-} backsubst_data; +- +-/* for each element n do, f(n) = trunc(log2(n))+1 */ +-const UCHAR getLog2[32] = {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, +- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; +- +-/** \def BSD_IDX_OFFSET +- * +- * bsd[] begins at index 0 with data for numBands=5. The correct bsd[] is +- * indexed like bsd[numBands-BSD_IDX_OFFSET]. +- */ +-#define BSD_IDX_OFFSET 5 +- +-#define N_NUMBANDS \ +- MAXLOWBANDS - BSD_IDX_OFFSET + \ +- 1 /*!< Number of backsubst_data elements in bsd */ +- +-const backsubst_data bsd[N_NUMBANDS] = { +- { +- /* numBands=5 */ +- {CHC(0x66c85a52), CHC(0x4278e587), CHC(0x697dcaff)}, +- {-1, 0, 0}, +- {CHC(0x66a61789), CHC(0x5253b8e3), CHC(0x5addad81)}, +- {3, 4, 1}, +- {CHC(0x7525ee90), CHC(0x6e2a1210), CHC(0x6523bb40), CHC(0x59822ead)}, +- {-6, -4, -2, 0}, +- {CHC(0x609e4cad), CHC(0x59c7e312), CHC(0x681eecac), CHC(0x440ea893), +- CHC(0x4a214bb3), CHC(0x53c345a1)}, +- {1, 0, -1, -1, -3, -5}, +- {CHC(0x7525ee90), CHC(0x58587936), CHC(0x410d0b38), CHC(0x7f1519d6)}, +- {-6, -1, 2, 0}, +- }, +- { +- /* numBands=6 */ +- {CHC(0x68943285), CHC(0x4841d2c3), CHC(0x6a6214c7)}, +- {-1, 0, 0}, +- {CHC(0x63c5923e), CHC(0x4e906e18), CHC(0x6285af8a)}, +- {3, 4, 1}, +- {CHC(0x7263940b), CHC(0x424a69a5), CHC(0x4ae8383a), CHC(0x517b7730)}, +- {-7, -4, -2, 0}, +- {CHC(0x518aee5f), CHC(0x4823a096), CHC(0x43764a39), CHC(0x6e6faf23), +- CHC(0x61bba44f), CHC(0x59d8b132)}, +- {1, 0, -1, -2, -4, -6}, +- {CHC(0x7263940b), CHC(0x6757bff2), CHC(0x5bf40fe0), CHC(0x7d6f4292)}, +- {-7, -2, 1, 0}, +- }, +- { +- /* numBands=7 */ +- {CHC(0x699b4c3c), CHC(0x4b8b702f), CHC(0x6ae51a4f)}, +- {-1, 0, 0}, +- {CHC(0x623a7f49), CHC(0x4ccc91fc), CHC(0x68f048dd)}, +- {3, 4, 1}, +- {CHC(0x7e6ebe18), CHC(0x5701daf2), CHC(0x74a8198b), CHC(0x4b399aa1)}, +- {-8, -5, -3, 0}, +- {CHC(0x464a64a6), CHC(0x78e42633), CHC(0x5ee174ba), CHC(0x5d0008c8), +- CHC(0x455cff0f), CHC(0x6b9100e7)}, +- {1, -1, -2, -2, -4, -7}, +- {CHC(0x7e6ebe18), CHC(0x42c52efe), CHC(0x45fe401f), CHC(0x7b5808ef)}, +- {-8, -2, 1, 0}, +- }, +- { +- /* numBands=8 */ +- {CHC(0x6a3fd9b4), CHC(0x4d99823f), CHC(0x6b372a94)}, +- {-1, 0, 0}, +- {CHC(0x614c6ef7), CHC(0x4bd06699), CHC(0x6e59cfca)}, +- {3, 4, 1}, +- {CHC(0x4c389cc5), CHC(0x79686681), CHC(0x5e2544c2), CHC(0x46305b43)}, +- {-8, -6, -3, 0}, +- {CHC(0x7b4ca7c6), CHC(0x68270ac5), CHC(0x467c644c), CHC(0x505c1b0f), +- CHC(0x67a14778), CHC(0x45801767)}, +- {0, -1, -2, -2, -5, -7}, +- {CHC(0x4c389cc5), CHC(0x5c499ceb), CHC(0x6f863c9f), CHC(0x79059bfc)}, +- {-8, -3, 0, 0}, +- }, +- { +- /* numBands=9 */ +- {CHC(0x6aad9988), CHC(0x4ef8ac18), CHC(0x6b6df116)}, +- {-1, 0, 0}, +- {CHC(0x60b159b0), CHC(0x4b33f772), CHC(0x72f5573d)}, +- {3, 4, 1}, +- {CHC(0x6206cb18), CHC(0x58a7d8dc), CHC(0x4e0b2d0b), CHC(0x4207ad84)}, +- {-9, -6, -3, 0}, +- {CHC(0x6dadadae), CHC(0x5b8b2cfc), CHC(0x6cf61db2), CHC(0x46c3c90b), +- CHC(0x506314ea), CHC(0x5f034acd)}, +- {0, -1, -3, -2, -5, -8}, +- {CHC(0x6206cb18), CHC(0x42f8b8de), CHC(0x5bb4776f), CHC(0x769acc79)}, +- {-9, -3, 0, 0}, +- }, +- { +- /* numBands=10 */ +- {CHC(0x6afa7252), CHC(0x4feed3ed), CHC(0x6b94504d)}, +- {-1, 0, 0}, +- {CHC(0x60467899), CHC(0x4acbafba), CHC(0x76eb327f)}, +- {3, 4, 1}, +- {CHC(0x42415b15), CHC(0x431080da), CHC(0x420f1c32), CHC(0x7d0c1aeb)}, +- {-9, -6, -3, -1}, +- {CHC(0x62b2c7a4), CHC(0x51b040a6), CHC(0x56caddb4), CHC(0x7e74a2c8), +- CHC(0x4030adf5), CHC(0x43d1dc4f)}, +- {0, -1, -3, -3, -5, -8}, +- {CHC(0x42415b15), CHC(0x64e299b3), CHC(0x4d33b5e8), CHC(0x742cee5f)}, +- {-9, -4, 0, 0}, +- }, +- { +- /* numBands=11 */ +- {CHC(0x6b3258bb), CHC(0x50a21233), CHC(0x6bb03c19)}, +- {-1, 0, 0}, +- {CHC(0x5ff997c6), CHC(0x4a82706e), CHC(0x7a5aae36)}, +- {3, 4, 1}, +- {CHC(0x5d2fb4fb), CHC(0x685bddd8), CHC(0x71b5e983), CHC(0x7708c90b)}, +- {-10, -7, -4, -1}, +- {CHC(0x59aceea2), CHC(0x49c428a0), CHC(0x46ca5527), CHC(0x724be884), +- CHC(0x68e586da), CHC(0x643485b6)}, +- {0, -1, -3, -3, -6, -9}, +- {CHC(0x5d2fb4fb), CHC(0x4e3fad1a), CHC(0x42310ba2), CHC(0x71c8b3ce)}, +- {-10, -4, 0, 0}, +- }, +- { +- /* numBands=12 */ +- {CHC(0x6b5c4726), CHC(0x5128a4a8), CHC(0x6bc52ee1)}, +- {-1, 0, 0}, +- {CHC(0x5fc06618), CHC(0x4a4ce559), CHC(0x7d5c16e9)}, +- {3, 4, 1}, +- {CHC(0x43af8342), CHC(0x531533d3), CHC(0x633660a6), CHC(0x71ce6052)}, +- {-10, -7, -4, -1}, +- {CHC(0x522373d7), CHC(0x434150cb), CHC(0x75b58afc), CHC(0x68474f2d), +- CHC(0x575348a5), CHC(0x4c20973f)}, +- {0, -1, -4, -3, -6, -9}, +- {CHC(0x43af8342), CHC(0x7c4d3d11), CHC(0x732e13db), CHC(0x6f756ac4)}, +- {-10, -5, -1, 0}, +- }, +- { +- /* numBands=13 */ +- {CHC(0x6b7c8953), CHC(0x51903fcd), CHC(0x6bd54d2e)}, +- {-1, 0, 0}, +- {CHC(0x5f94abf0), CHC(0x4a2480fa), CHC(0x40013553)}, +- {3, 4, 2}, +- {CHC(0x6501236e), CHC(0x436b9c4e), CHC(0x578d7881), CHC(0x6d34f92e)}, +- {-11, -7, -4, -1}, +- {CHC(0x4bc0e2b2), CHC(0x7b9d12ac), CHC(0x636c1c1b), CHC(0x5fe15c2b), +- CHC(0x49d54879), CHC(0x7662cfa5)}, +- {0, -2, -4, -3, -6, -10}, +- {CHC(0x6501236e), CHC(0x64b059fe), CHC(0x656d8359), CHC(0x6d370900)}, +- {-11, -5, -1, 0}, +- }, +- { +- /* numBands=14 */ +- {CHC(0x6b95e276), CHC(0x51e1b637), CHC(0x6be1f7ed)}, +- {-1, 0, 0}, +- {CHC(0x5f727a1c), CHC(0x4a053e9c), CHC(0x412e528c)}, +- {3, 4, 2}, +- {CHC(0x4d178bd4), CHC(0x6f33b4e8), CHC(0x4e028f7f), CHC(0x691ee104)}, +- {-11, -8, -4, -1}, +- {CHC(0x46473d3f), CHC(0x725bd0a6), CHC(0x55199885), CHC(0x58bcc56b), +- CHC(0x7e7e6288), CHC(0x5ddef6eb)}, +- {0, -2, -4, -3, -7, -10}, +- {CHC(0x4d178bd4), CHC(0x52ebd467), CHC(0x5a395a6e), CHC(0x6b0f724f)}, +- {-11, -5, -1, 0}, +- }, +- { +- /* numBands=15 */ +- {CHC(0x6baa2a22), CHC(0x5222eb91), CHC(0x6bec1a86)}, +- {-1, 0, 0}, +- {CHC(0x5f57393b), CHC(0x49ec8934), CHC(0x423b5b58)}, +- {3, 4, 2}, +- {CHC(0x77fd2486), CHC(0x5cfbdf2c), CHC(0x46153bd1), CHC(0x65757ed9)}, +- {-12, -8, -4, -1}, +- {CHC(0x41888ee6), CHC(0x6a661db3), CHC(0x49abc8c8), CHC(0x52965848), +- CHC(0x6d9301b7), CHC(0x4bb04721)}, +- {0, -2, -4, -3, -7, -10}, +- {CHC(0x77fd2486), CHC(0x45424c68), CHC(0x50f33cc6), CHC(0x68ff43f0)}, +- {-12, -5, -1, 0}, +- }, +- { +- /* numBands=16 */ +- {CHC(0x6bbaa499), CHC(0x5257ed94), CHC(0x6bf456e4)}, +- {-1, 0, 0}, +- {CHC(0x5f412594), CHC(0x49d8a766), CHC(0x432d1dbd)}, +- {3, 4, 2}, +- {CHC(0x5ef5cfde), CHC(0x4eafcd2d), CHC(0x7ed36893), CHC(0x62274b45)}, +- {-12, -8, -5, -1}, +- {CHC(0x7ac438f5), CHC(0x637aab21), CHC(0x4067617a), CHC(0x4d3c6ec7), +- CHC(0x5fd6e0dd), CHC(0x7bd5f024)}, +- {-1, -2, -4, -3, -7, -11}, +- {CHC(0x5ef5cfde), CHC(0x751d0d4f), CHC(0x492b3c41), CHC(0x67065409)}, +- {-12, -6, -1, 0}, +- }, +- { +- /* numBands=17 */ +- {CHC(0x6bc836c9), CHC(0x5283997e), CHC(0x6bfb1f5e)}, +- {-1, 0, 0}, +- {CHC(0x5f2f02b6), CHC(0x49c868e9), CHC(0x44078151)}, +- {3, 4, 2}, +- {CHC(0x4c43b65a), CHC(0x4349dcf6), CHC(0x73799e2d), CHC(0x5f267274)}, +- {-12, -8, -5, -1}, +- {CHC(0x73726394), CHC(0x5d68511a), CHC(0x7191bbcc), CHC(0x48898c70), +- CHC(0x548956e1), CHC(0x66981ce8)}, +- {-1, -2, -5, -3, -7, -11}, +- {CHC(0x4c43b65a), CHC(0x64131116), CHC(0x429028e2), CHC(0x65240211)}, +- {-12, -6, -1, 0}, +- }, +- { +- /* numBands=18 */ +- {CHC(0x6bd3860d), CHC(0x52a80156), CHC(0x6c00c68d)}, +- {-1, 0, 0}, +- {CHC(0x5f1fed86), CHC(0x49baf636), CHC(0x44cdb9dc)}, +- {3, 4, 2}, +- {CHC(0x7c189389), CHC(0x742666d8), CHC(0x69b8c776), CHC(0x5c67e27d)}, +- {-13, -9, -5, -1}, +- {CHC(0x6cf1ea76), CHC(0x58095703), CHC(0x64e351a9), CHC(0x4460da90), +- CHC(0x4b1f8083), CHC(0x55f2d3e1)}, +- {-1, -2, -5, -3, -7, -11}, +- {CHC(0x7c189389), CHC(0x5651792a), CHC(0x79cb9b3d), CHC(0x635769c0)}, +- {-13, -6, -2, 0}, +- }, +- { +- /* numBands=19 */ +- {CHC(0x6bdd0c40), CHC(0x52c6abf6), CHC(0x6c058950)}, +- {-1, 0, 0}, +- {CHC(0x5f133f88), CHC(0x49afb305), CHC(0x45826d73)}, +- {3, 4, 2}, +- {CHC(0x6621a164), CHC(0x6512528e), CHC(0x61449fc8), CHC(0x59e2a0c0)}, +- {-13, -9, -5, -1}, +- {CHC(0x6721cadb), CHC(0x53404cd4), CHC(0x5a389e91), CHC(0x40abcbd2), +- CHC(0x43332f01), CHC(0x48b82e46)}, +- {-1, -2, -5, -3, -7, -11}, +- {CHC(0x6621a164), CHC(0x4b12cc28), CHC(0x6ffd4df8), CHC(0x619f835e)}, +- {-13, -6, -2, 0}, +- }, +- { +- /* numBands=20 */ +- {CHC(0x6be524c5), CHC(0x52e0beb3), CHC(0x6c099552)}, +- {-1, 0, 0}, +- {CHC(0x5f087c68), CHC(0x49a62bb5), CHC(0x4627d175)}, +- {3, 4, 2}, +- {CHC(0x54ec6afe), CHC(0x58991a42), CHC(0x59e23e8c), CHC(0x578f4ef4)}, +- {-13, -9, -5, -1}, +- {CHC(0x61e78f6f), CHC(0x4ef5e1e9), CHC(0x5129c3b8), CHC(0x7ab0f7b2), +- CHC(0x78efb076), CHC(0x7c2567ea)}, +- {-1, -2, -5, -4, -8, -12}, +- {CHC(0x54ec6afe), CHC(0x41c7812c), CHC(0x676f6f8d), CHC(0x5ffb383f)}, +- {-13, -6, -2, 0}, +- }, +- { +- /* numBands=21 */ +- {CHC(0x6bec1542), CHC(0x52f71929), CHC(0x6c0d0d5e)}, +- {-1, 0, 0}, +- {CHC(0x5eff45c5), CHC(0x499e092d), CHC(0x46bfc0c9)}, +- {3, 4, 2}, +- {CHC(0x47457a78), CHC(0x4e2d99b3), CHC(0x53637ea5), CHC(0x5567d0e9)}, +- {-13, -9, -5, -1}, +- {CHC(0x5d2dc61b), CHC(0x4b1760c8), CHC(0x4967cf39), CHC(0x74b113d8), +- CHC(0x6d6676b6), CHC(0x6ad114e9)}, +- {-1, -2, -5, -4, -8, -12}, +- {CHC(0x47457a78), CHC(0x740accaa), CHC(0x5feb6609), CHC(0x5e696f95)}, +- {-13, -7, -2, 0}, +- }, +- { +- /* numBands=22 */ +- {CHC(0x6bf21387), CHC(0x530a683c), CHC(0x6c100c59)}, +- {-1, 0, 0}, +- {CHC(0x5ef752ea), CHC(0x499708c6), CHC(0x474bcd1b)}, +- {3, 4, 2}, +- {CHC(0x78a21ab7), CHC(0x45658aec), CHC(0x4da3c4fe), CHC(0x5367094b)}, +- {-14, -9, -5, -1}, +- {CHC(0x58e2df6a), CHC(0x4795990e), CHC(0x42b5e0f7), CHC(0x6f408c64), +- CHC(0x6370bebf), CHC(0x5c91ca85)}, +- {-1, -2, -5, -4, -8, -12}, +- {CHC(0x78a21ab7), CHC(0x66f951d6), CHC(0x594605bb), CHC(0x5ce91657)}, +- {-14, -7, -2, 0}, +- }, +- { +- /* numBands=23 */ +- {CHC(0x6bf749b2), CHC(0x531b3348), CHC(0x6c12a750)}, +- {-1, 0, 0}, +- {CHC(0x5ef06b17), CHC(0x4990f6c9), CHC(0x47cd4c5b)}, +- {3, 4, 2}, +- {CHC(0x66dede36), CHC(0x7bdf90a9), CHC(0x4885b2b9), CHC(0x5188a6b7)}, +- {-14, -10, -5, -1}, +- {CHC(0x54f85812), CHC(0x446414ae), CHC(0x79c8d519), CHC(0x6a4c2f31), +- CHC(0x5ac8325f), CHC(0x50bf9200)}, +- {-1, -2, -6, -4, -8, -12}, +- {CHC(0x66dede36), CHC(0x5be0d90e), CHC(0x535cc453), CHC(0x5b7923f0)}, +- {-14, -7, -2, 0}, +- }, +- { +- /* numBands=24 */ +- {CHC(0x6bfbd91d), CHC(0x5329e580), CHC(0x6c14eeed)}, +- {-1, 0, 0}, +- {CHC(0x5eea6179), CHC(0x498baa90), CHC(0x4845635d)}, +- {3, 4, 2}, +- {CHC(0x58559b7e), CHC(0x6f1b231f), CHC(0x43f1789b), CHC(0x4fc8fcb8)}, +- {-14, -10, -5, -1}, +- {CHC(0x51621775), CHC(0x417881a3), CHC(0x6f9ba9b6), CHC(0x65c412b2), +- CHC(0x53352c61), CHC(0x46db9caf)}, +- {-1, -2, -6, -4, -8, -12}, +- {CHC(0x58559b7e), CHC(0x52636003), CHC(0x4e13b316), CHC(0x5a189cdf)}, +- {-14, -7, -2, 0}, +- }, +- { +- /* numBands=25 */ +- {CHC(0x6bffdc73), CHC(0x5336d4af), CHC(0x6c16f084)}, +- {-1, 0, 0}, +- {CHC(0x5ee51249), CHC(0x498703cc), CHC(0x48b50e4f)}, +- {3, 4, 2}, +- {CHC(0x4c5616cf), CHC(0x641b9fad), CHC(0x7fa735e0), CHC(0x4e24e57a)}, +- {-14, -10, -6, -1}, +- {CHC(0x4e15f47a), CHC(0x7d9481d6), CHC(0x66a82f8a), CHC(0x619ae971), +- CHC(0x4c8b2f5f), CHC(0x7d09ec11)}, +- {-1, -3, -6, -4, -8, -13}, +- {CHC(0x4c5616cf), CHC(0x4a3770fb), CHC(0x495402de), CHC(0x58c693fa)}, +- {-14, -7, -2, 0}, +- }, +- { +- /* numBands=26 */ +- {CHC(0x6c036943), CHC(0x53424625), CHC(0x6c18b6dc)}, +- {-1, 0, 0}, +- {CHC(0x5ee060aa), CHC(0x4982e88a), CHC(0x491d277f)}, +- {3, 4, 2}, +- {CHC(0x425ada5b), CHC(0x5a9368ac), CHC(0x78380a42), CHC(0x4c99aa05)}, +- {-14, -10, -6, -1}, +- {CHC(0x4b0b569c), CHC(0x78a420da), CHC(0x5ebdf203), CHC(0x5dc57e63), +- CHC(0x46a650ff), CHC(0x6ee13fb8)}, +- {-1, -3, -6, -4, -8, -13}, +- {CHC(0x425ada5b), CHC(0x4323073c), CHC(0x450ae92b), CHC(0x57822ad5)}, +- {-14, -7, -2, 0}, +- }, +- { +- /* numBands=27 */ +- {CHC(0x6c06911a), CHC(0x534c7261), CHC(0x6c1a4aba)}, +- {-1, 0, 0}, +- {CHC(0x5edc3524), CHC(0x497f43c0), CHC(0x497e6cd8)}, +- {3, 4, 2}, +- {CHC(0x73fb550e), CHC(0x5244894f), CHC(0x717aad78), CHC(0x4b24ef6c)}, +- {-15, -10, -6, -1}, +- {CHC(0x483aebe4), CHC(0x74139116), CHC(0x57b58037), CHC(0x5a3a4f3c), +- CHC(0x416950fe), CHC(0x62c7f4f2)}, +- {-1, -3, -6, -4, -8, -13}, +- {CHC(0x73fb550e), CHC(0x79efb994), CHC(0x4128cab7), CHC(0x564a919a)}, +- {-15, -8, -2, 0}, +- }, +- { +- /* numBands=28 */ +- {CHC(0x6c096264), CHC(0x535587cd), CHC(0x6c1bb355)}, +- {-1, 0, 0}, +- {CHC(0x5ed87c76), CHC(0x497c0439), CHC(0x49d98452)}, +- {3, 4, 2}, +- {CHC(0x65dec5bf), CHC(0x4afd1ba3), CHC(0x6b58b4b3), CHC(0x49c4a7b0)}, +- {-15, -10, -6, -1}, +- {CHC(0x459e6eb1), CHC(0x6fd850b7), CHC(0x516e7be9), CHC(0x56f13d05), +- CHC(0x79785594), CHC(0x58617de7)}, +- {-1, -3, -6, -4, -9, -13}, +- {CHC(0x65dec5bf), CHC(0x6f2168aa), CHC(0x7b41310f), CHC(0x551f0692)}, +- {-15, -8, -3, 0}, +- }, +- { +- /* numBands=29 */ +- {CHC(0x6c0be913), CHC(0x535dacd5), CHC(0x6c1cf6a3)}, +- {-1, 0, 0}, +- {CHC(0x5ed526b4), CHC(0x49791bc5), CHC(0x4a2eff99)}, +- {3, 4, 2}, +- {CHC(0x59e44afe), CHC(0x44949ada), CHC(0x65bf36f5), CHC(0x487705a0)}, +- {-15, -10, -6, -1}, +- {CHC(0x43307779), CHC(0x6be959c4), CHC(0x4bce2122), CHC(0x53e34d89), +- CHC(0x7115ff82), CHC(0x4f6421a1)}, +- {-1, -3, -6, -4, -9, -13}, +- {CHC(0x59e44afe), CHC(0x659eab7d), CHC(0x74cea459), CHC(0x53fed574)}, +- {-15, -8, -3, 0}, +- }, +- { +- /* numBands=30 */ +- {CHC(0x6c0e2f17), CHC(0x53650181), CHC(0x6c1e199d)}, +- {-1, 0, 0}, +- {CHC(0x5ed2269f), CHC(0x49767e9e), CHC(0x4a7f5f0b)}, +- {3, 4, 2}, +- {CHC(0x4faa4ae6), CHC(0x7dd3bf11), CHC(0x609e2732), CHC(0x473a72e9)}, +- {-15, -11, -6, -1}, +- {CHC(0x40ec57c6), CHC(0x683ee147), CHC(0x46be261d), CHC(0x510a7983), +- CHC(0x698a84cb), CHC(0x4794a927)}, +- {-1, -3, -6, -4, -9, -13}, +- {CHC(0x4faa4ae6), CHC(0x5d3615ad), CHC(0x6ee74773), CHC(0x52e956a1)}, +- {-15, -8, -3, 0}, +- }, +- { +- /* numBands=31 */ +- {CHC(0x6c103cc9), CHC(0x536ba0ac), CHC(0x6c1f2070)}, +- {-1, 0, 0}, +- {CHC(0x5ecf711e), CHC(0x497422ea), CHC(0x4acb1438)}, +- {3, 4, 2}, +- {CHC(0x46e322ad), CHC(0x73c32f3c), CHC(0x5be7d172), CHC(0x460d8800)}, +- {-15, -11, -6, -1}, +- {CHC(0x7d9bf8ad), CHC(0x64d22351), CHC(0x422bdc81), CHC(0x4e6184aa), +- CHC(0x62ba2375), CHC(0x40c325de)}, +- {-2, -3, -6, -4, -9, -13}, +- {CHC(0x46e322ad), CHC(0x55bef2a3), CHC(0x697b3135), CHC(0x51ddee4d)}, +- {-15, -8, -3, 0}, +- }, +- { +- // numBands=32 +- {CHC(0x6c121933), CHC(0x5371a104), CHC(0x6c200ea0)}, +- {-1, 0, 0}, +- {CHC(0x5eccfcd3), CHC(0x49720060), CHC(0x4b1283f0)}, +- {3, 4, 2}, +- {CHC(0x7ea12a52), CHC(0x6aca3303), CHC(0x579072bf), CHC(0x44ef056e)}, +- {-16, -11, -6, -1}, +- {CHC(0x79a3a9ab), CHC(0x619d38fc), CHC(0x7c0f0734), CHC(0x4be3dd5d), +- CHC(0x5c8d7163), CHC(0x7591065f)}, +- {-2, -3, -7, -4, -9, -14}, +- {CHC(0x7ea12a52), CHC(0x4f1782a6), CHC(0x647cbcb2), CHC(0x50dc0bb1)}, +- {-16, -8, -3, 0}, +- }, +-}; +- +-/** \def SUM_SAFETY +- * +- * SUM_SAFTEY defines the bits needed to right-shift every summand in +- * order to be overflow-safe. In the two backsubst functions we sum up 4 +- * values. Since one of which is definitely not MAXVAL_DBL (the L[x][y]), +- * we spare just 2 safety bits instead of 3. +- */ +-#define SUM_SAFETY 2 +- +-/** +- * \brief Solves L*x=b via backsubstitution according to the following +- * structure: +- * +- * x[0] = b[0]; +- * x[1] = (b[1] - x[0]) / L[1][1]; +- * x[2] = (b[2] - x[1]*L[2][1] - x[0]) / L[2][2]; +- * x[3] = (b[3] - x[2]*L[3][2] - x[1]*L[3][1] - x[0]) / L[3][3]; +- * +- * \param[in] numBands SBR crossover band index +- * \param[in] b the b in L*x=b (one-dimensional) +- * \param[out] x output polynomial coefficients (mantissa) +- * \param[out] x_sf exponents of x[] +- */ +-static void backsubst_fw(const int numBands, const FIXP_DBL *const b, +- FIXP_DBL *RESTRICT x, int *RESTRICT x_sf) { +- int i, k; +- int m; /* the trip counter that indexes incrementally through Lnorm1d[] */ +- +- const FIXP_CHB *RESTRICT pLnorm1d = bsd[numBands - BSD_IDX_OFFSET].Lnorm1d; +- const SCHAR *RESTRICT pLnorm1d_sf = bsd[numBands - BSD_IDX_OFFSET].Lnorm1d_sf; +- const FIXP_CHB *RESTRICT pLnormii = bsd[numBands - BSD_IDX_OFFSET].Lnormii; +- const SCHAR *RESTRICT pLnormii_sf = bsd[numBands - BSD_IDX_OFFSET].Lnormii_sf; +- +- x[0] = b[0]; +- +- for (i = 1, m = 0; i <= POLY_ORDER; ++i) { +- FIXP_DBL sum = b[i] >> SUM_SAFETY; +- int sum_sf = x_sf[i]; +- for (k = i - 1; k > 0; --k, ++m) { +- int e; +- FIXP_DBL mult = fMultNorm(FX_CHB2FX_DBL(pLnorm1d[m]), x[k], &e); +- int mult_sf = pLnorm1d_sf[m] + x_sf[k] + e; +- +- /* check if the new summand mult has a different sf than the sum currently +- * has */ +- int diff = mult_sf - sum_sf; +- +- if (diff > 0) { +- /* yes, and it requires the sum to be adjusted (scaled down) */ +- sum >>= diff; +- sum_sf = mult_sf; +- } else if (diff < 0) { +- /* yes, but here mult needs to be scaled down */ +- mult >>= -diff; +- } +- sum -= (mult >> SUM_SAFETY); +- } +- +- /* - x[0] */ +- if (x_sf[0] > sum_sf) { +- sum >>= (x_sf[0] - sum_sf); +- sum_sf = x_sf[0]; +- } +- sum -= (x[0] >> (sum_sf - x_sf[0] + SUM_SAFETY)); +- +- /* instead of the division /L[i][i], we multiply by the inverse */ +- int e; +- x[i] = fMultNorm(sum, FX_CHB2FX_DBL(pLnormii[i - 1]), &e); +- x_sf[i] = sum_sf + pLnormii_sf[i - 1] + e + SUM_SAFETY; +- } +-} +- +-/** +- * \brief Solves L*x=b via backsubstitution according to the following +- * structure: +- * +- * x[3] = b[3]; +- * x[2] = b[2] - L[2][3]*x[3]; +- * x[1] = b[1] - L[1][2]*x[2] - L[1][3]*x[3]; +- * x[0] = b[0] - L[0][1]*x[1] - L[0][2]*x[2] - L[0][3]*x[3]; +- * +- * \param[in] numBands SBR crossover band index +- * \param[in] b the b in L*x=b (one-dimensional) +- * \param[out] x solution vector +- * \param[out] x_sf exponents of x[] +- */ +-static void backsubst_bw(const int numBands, const FIXP_DBL *const b, +- FIXP_DBL *RESTRICT x, int *RESTRICT x_sf) { +- int i, k; +- int m; /* the trip counter that indexes incrementally through LnormInv1d[] */ +- +- const FIXP_CHB *RESTRICT pLnormInv1d = +- bsd[numBands - BSD_IDX_OFFSET].LnormInv1d; +- const SCHAR *RESTRICT pLnormInv1d_sf = +- bsd[numBands - BSD_IDX_OFFSET].LnormInv1d_sf; +- +- x[POLY_ORDER] = b[POLY_ORDER]; +- +- for (i = POLY_ORDER - 1, m = 0; i >= 0; i--) { +- FIXP_DBL sum = b[i] >> SUM_SAFETY; +- int sum_sf = x_sf[i]; /* sum's sf but disregarding SUM_SAFETY (added at the +- iteration's end) */ +- +- for (k = i + 1; k <= POLY_ORDER; ++k, ++m) { +- int e; +- FIXP_DBL mult = fMultNorm(FX_CHB2FX_DBL(pLnormInv1d[m]), x[k], &e); +- int mult_sf = pLnormInv1d_sf[m] + x_sf[k] + e; +- +- /* check if the new summand mult has a different sf than sum currently has +- */ +- int diff = mult_sf - sum_sf; +- +- if (diff > 0) { +- /* yes, and it requires the sum v to be adjusted (scaled down) */ +- sum >>= diff; +- sum_sf = mult_sf; +- } else if (diff < 0) { +- /* yes, but here mult needs to be scaled down */ +- mult >>= -diff; +- } +- +- /* mult has now the same sf than what it is about to be added to. */ +- /* scale mult down additionally so that building the sum is overflow-safe. +- */ +- sum -= (mult >> SUM_SAFETY); +- } +- +- x_sf[i] = sum_sf + SUM_SAFETY; +- x[i] = sum; +- } +-} +- +-/** +- * \brief Solves a system of linear equations (L*x=b) with the Cholesky +- * algorithm. +- * +- * \param[in] numBands SBR crossover band index +- * \param[in,out] b input: vector b, output: solution vector p. +- * \param[in,out] b_sf input: exponent of b; output: exponent of solution +- * p. +- */ +-static void choleskySolve(const int numBands, FIXP_DBL *RESTRICT b, +- int *RESTRICT b_sf) { +- int i, e; +- +- const FIXP_CHB *RESTRICT pBmul0 = bsd[numBands - BSD_IDX_OFFSET].Bmul0; +- const SCHAR *RESTRICT pBmul0_sf = bsd[numBands - BSD_IDX_OFFSET].Bmul0_sf; +- const FIXP_CHB *RESTRICT pBmul1 = bsd[numBands - BSD_IDX_OFFSET].Bmul1; +- const SCHAR *RESTRICT pBmul1_sf = bsd[numBands - BSD_IDX_OFFSET].Bmul1_sf; +- +- /* normalize b */ +- FIXP_DBL bnormed[POLY_ORDER + 1]; +- for (i = 0; i <= POLY_ORDER; ++i) { +- bnormed[i] = fMultNorm(b[i], FX_CHB2FX_DBL(pBmul0[i]), &e); +- b_sf[i] += pBmul0_sf[i] + e; +- } +- +- backsubst_fw(numBands, bnormed, b, b_sf); +- +- /* normalize b again */ +- for (i = 0; i <= POLY_ORDER; ++i) { +- bnormed[i] = fMultNorm(b[i], FX_CHB2FX_DBL(pBmul1[i]), &e); +- b_sf[i] += pBmul1_sf[i] + e; +- } +- +- backsubst_bw(numBands, bnormed, b, b_sf); +-} +- +-/** +- * \brief Find polynomial approximation of vector y with implicit abscisas +- * x=0,1,2,3..n-1 +- * +- * The problem (V^T * V * p = V^T * y) is solved with Cholesky. +- * V is the Vandermode Matrix constructed with x = 0...n-1; +- * A = V^T * V; b = V^T * y; +- * +- * \param[in] numBands SBR crossover band index (BSD_IDX_OFFSET <= numBands <= +- * MAXLOWBANDS) +- * \param[in] y input vector (mantissa) +- * \param[in] y_sf exponents of y[] +- * \param[out] p output polynomial coefficients (mantissa) +- * \param[out] p_sf exponents of p[] +- */ +-static void polyfit(const int numBands, const FIXP_DBL *const y, const int y_sf, +- FIXP_DBL *RESTRICT p, int *RESTRICT p_sf) { +- int i, k; +- LONG v[POLY_ORDER + 1]; +- int sum_saftey = getLog2[numBands - 1]; +- +- FDK_ASSERT((numBands >= BSD_IDX_OFFSET) && (numBands <= MAXLOWBANDS)); +- +- /* construct vector b[] temporarily stored in array p[] */ +- FDKmemclear(p, (POLY_ORDER + 1) * sizeof(FIXP_DBL)); +- +- /* p[] are the sums over n values and each p[i] has its own sf */ +- for (i = 0; i <= POLY_ORDER; ++i) p_sf[i] = 1 - DFRACT_BITS; +- +- for (k = 0; k < numBands; k++) { +- v[0] = (LONG)1; +- for (i = 1; i <= POLY_ORDER; i++) { +- v[i] = k * v[i - 1]; +- } +- +- for (i = 0; i <= POLY_ORDER; i++) { +- if (v[POLY_ORDER - i] != 0 && y[k] != FIXP_DBL(0)) { +- int e; +- FIXP_DBL mult = fMultNorm((FIXP_DBL)v[POLY_ORDER - i], y[k], &e); +- int sf = DFRACT_BITS - 1 + y_sf + e; +- +- /* check if the new summand has a different sf than the sum p[i] +- * currently has */ +- int diff = sf - p_sf[i]; +- +- if (diff > 0) { +- /* yes, and it requires the sum p[i] to be adjusted (scaled down) */ +- p[i] >>= fMin(DFRACT_BITS - 1, diff); +- p_sf[i] = sf; +- } else if (diff < 0) { +- /* yes, but here mult needs to be scaled down */ +- mult >>= -diff; +- } +- +- /* mult has now the same sf than what it is about to be added to. +- scale mult down additionally so that building the sum is +- overflow-safe. */ +- p[i] += mult >> sum_saftey; +- } +- } +- } +- +- p_sf[0] += sum_saftey; +- p_sf[1] += sum_saftey; +- p_sf[2] += sum_saftey; +- p_sf[3] += sum_saftey; +- +- choleskySolve(numBands, p, p_sf); +-} +- +-/** +- * \brief Calculates the output of a POLY_ORDER-degree polynomial function +- * with Horner scheme: +- * +- * y(x) = p3 + p2*x + p1*x^2 + p0*x^3 +- * = p3 + x*(p2 + x*(p1 + x*p0)) +- * +- * The for loop iterates through the mult/add parts in y(x) as above, +- * during which regular upscaling ensures a stable exponent of the +- * result. +- * +- * \param[in] p coefficients as in y(x) +- * \param[in] p_sf exponents of p[] +- * \param[in] x_int non-fractional integer representation of x as in y(x) +- * \param[out] out_sf exponent of return value +- * +- * \return result y(x) +- */ +-static FIXP_DBL polyval(const FIXP_DBL *const p, const int *const p_sf, +- const int x_int, int *out_sf) { +- FDK_ASSERT(x_int <= 31); /* otherwise getLog2[] needs more elements */ +- +- int k, x_sf; +- int result_sf; /* working space to compute return value *out_sf */ +- FIXP_DBL x; /* fractional value of x_int */ +- FIXP_DBL result; /* return value */ +- +- /* if x == 0, then y(x) is just p3 */ +- if (x_int != 0) { +- x_sf = getLog2[x_int]; +- x = (FIXP_DBL)x_int << (DFRACT_BITS - 1 - x_sf); +- } else { +- *out_sf = p_sf[3]; +- return p[3]; +- } +- +- result = p[0]; +- result_sf = p_sf[0]; +- +- for (k = 1; k <= POLY_ORDER; ++k) { +- FIXP_DBL mult = fMult(x, result); +- int mult_sf = x_sf + result_sf; +- +- int room = CountLeadingBits(mult); +- mult <<= room; +- mult_sf -= room; +- +- FIXP_DBL pp = p[k]; +- int pp_sf = p_sf[k]; +- +- /* equalize the shift factors of pp and mult so that we can sum them up */ +- int diff = pp_sf - mult_sf; +- +- if (diff > 0) { +- diff = fMin(diff, DFRACT_BITS - 1); +- mult >>= diff; +- } else if (diff < 0) { +- diff = fMax(diff, 1 - DFRACT_BITS); +- pp >>= -diff; +- } +- +- /* downshift by 1 to ensure safe summation */ +- mult >>= 1; +- mult_sf++; +- pp >>= 1; +- pp_sf++; +- +- result_sf = fMax(pp_sf, mult_sf); +- +- result = mult + pp; +- /* rarely, mult and pp happen to be almost equal except their sign, +- and then upon summation, result becomes so small, that it is within +- the inaccuracy range of a few bits, and then the relative error +- produced by this function may become HUGE */ +- } +- +- *out_sf = result_sf; +- return result; +-} +- +-void sbrDecoder_calculateGainVec(FIXP_DBL **sourceBufferReal, +- FIXP_DBL **sourceBufferImag, +- int sourceBuf_e_overlap, +- int sourceBuf_e_current, int overlap, +- FIXP_DBL *RESTRICT GainVec, int *GainVec_exp, +- int numBands, const int startSample, +- const int stopSample) { +- FIXP_DBL p[POLY_ORDER + 1]; +- FIXP_DBL meanNrg; +- FIXP_DBL LowEnv[MAXLOWBANDS]; +- FIXP_DBL invNumBands = GetInvInt(numBands); +- FIXP_DBL invNumSlots = GetInvInt(stopSample - startSample); +- int i, loBand, exp, scale_nrg, scale_nrg_ov; +- int sum_scale = 5, sum_scale_ov = 3; +- +- if (overlap > 8) { +- FDK_ASSERT(overlap <= 16); +- sum_scale_ov += 1; +- sum_scale += 1; +- } +- +- /* exponents of energy values */ +- sourceBuf_e_overlap = sourceBuf_e_overlap * 2 + sum_scale_ov; +- sourceBuf_e_current = sourceBuf_e_current * 2 + sum_scale; +- exp = fMax(sourceBuf_e_overlap, sourceBuf_e_current); +- scale_nrg = sourceBuf_e_current - exp; +- scale_nrg_ov = sourceBuf_e_overlap - exp; +- +- meanNrg = (FIXP_DBL)0; +- /* Calculate the spectral envelope in dB over the current copy-up frame. */ +- for (loBand = 0; loBand < numBands; loBand++) { +- FIXP_DBL nrg_ov, nrg; +- INT reserve = 0, exp_new; +- FIXP_DBL maxVal = FL2FX_DBL(0.0f); +- +- for (i = startSample; i < stopSample; i++) { +- maxVal |= +- (FIXP_DBL)((LONG)(sourceBufferReal[i][loBand]) ^ +- ((LONG)sourceBufferReal[i][loBand] >> (SAMPLE_BITS - 1))); +- maxVal |= +- (FIXP_DBL)((LONG)(sourceBufferImag[i][loBand]) ^ +- ((LONG)sourceBufferImag[i][loBand] >> (SAMPLE_BITS - 1))); +- } +- +- if (maxVal != FL2FX_DBL(0.0f)) { +- reserve = fixMax(0, CntLeadingZeros(maxVal) - 2); +- } +- +- nrg_ov = nrg = (FIXP_DBL)0; +- if (scale_nrg_ov > -31) { +- for (i = startSample; i < overlap; i++) { +- nrg_ov += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) + +- fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >> +- sum_scale_ov; +- } +- } else { +- scale_nrg_ov = 0; +- } +- if (scale_nrg > -31) { +- for (i = overlap; i < stopSample; i++) { +- nrg += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) + +- fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >> +- sum_scale; +- } +- } else { +- scale_nrg = 0; +- } +- +- nrg = (scaleValue(nrg_ov, scale_nrg_ov) >> 1) + +- (scaleValue(nrg, scale_nrg) >> 1); +- nrg = fMult(nrg, invNumSlots); +- +- exp_new = +- exp - (2 * reserve) + +- 2; /* +1 for addition directly above, +1 for fPow2Div2 in loops above */ +- +- /* LowEnv = 10*log10(nrg) = log2(nrg) * 10/log2(10) */ +- /* exponent of logarithmic energy is 8 */ +- if (nrg > (FIXP_DBL)0) { +- int exp_log2; +- nrg = CalcLog2(nrg, exp_new, &exp_log2); +- nrg = scaleValue(nrg, exp_log2 - 6); +- nrg = fMult(FL2FXCONST_SGL(LOG10FAC), nrg); +- } else { +- nrg = (FIXP_DBL)0; +- } +- LowEnv[loBand] = nrg; +- meanNrg += fMult(nrg, invNumBands); +- } +- exp = 6 + 2; /* exponent of LowEnv: +2 is exponent of LOG10FAC */ +- +- /* subtract mean before polynomial approximation to reduce dynamic of p[] */ +- for (loBand = 0; loBand < numBands; loBand++) { +- LowEnv[loBand] = meanNrg - LowEnv[loBand]; +- } +- +- /* For numBands < BSD_IDX_OFFSET (== POLY_ORDER+2) we dont get an +- overdetermined equation system. The calculated polynomial will exactly fit +- the input data and evaluating the polynomial will lead to the same vector +- than the original input vector: lowEnvSlope[] == lowEnv[] +- */ +- if (numBands > POLY_ORDER + 1) { +- /* Find polynomial approximation of LowEnv */ +- int p_sf[POLY_ORDER + 1]; +- +- polyfit(numBands, LowEnv, exp, p, p_sf); +- +- for (i = 0; i < numBands; i++) { +- int sf; +- +- /* lowBandEnvSlope[i] = tmp; */ +- FIXP_DBL tmp = polyval(p, p_sf, i, &sf); +- +- /* GainVec = 10^((mean(y)-y)/20) = 2^( (mean(y)-y) * log2(10)/20 ) */ +- tmp = fMult(tmp, FL2FXCONST_SGL(LOG10FAC_INV)); +- GainVec[i] = f2Pow(tmp, sf - 2, +- &GainVec_exp[i]); /* -2 is exponent of LOG10FAC_INV */ +- } +- } else { /* numBands <= POLY_ORDER+1 */ +- for (i = 0; i < numBands; i++) { +- int sf = exp; /* exponent of LowEnv[] */ +- +- /* lowBandEnvSlope[i] = LowEnv[i]; */ +- FIXP_DBL tmp = LowEnv[i]; +- +- /* GainVec = 10^((mean(y)-y)/20) = 2^( (mean(y)-y) * log2(10)/20 ) */ +- tmp = fMult(tmp, FL2FXCONST_SGL(LOG10FAC_INV)); +- GainVec[i] = f2Pow(tmp, sf - 2, +- &GainVec_exp[i]); /* -2 is exponent of LOG10FAC_INV */ +- } +- } +-} +diff --git a/libSBRdec/src/HFgen_preFlat.h b/libSBRdec/src/HFgen_preFlat.h +deleted file mode 100644 +index c1fc49d..0000000 +--- a/libSBRdec/src/HFgen_preFlat.h ++++ /dev/null +@@ -1,132 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Manuel Jander, Matthias Hildenbrand +- +- Description: QMF frequency pre whitening for SBR +- +-*******************************************************************************/ +- +-#include "common_fix.h" +- +-#ifndef HFGEN_PREFLAT_H +-#define HFGEN_PREFLAT_H +- +-#define GAIN_VEC_EXP 6 /* exponent of GainVec[] */ +- +-/** +- * \brief Find gain vector to flatten the QMF frequency bands whithout loosing +- * the fine structure. +- * \param[in] sourceBufferReal real part of QMF domain data. +- * \param[in] sourceBufferImag imaginary part of QMF domain data. +- * \param[in] sourceBuffer_e_overlap exponent of sourceBufferReal. +- * \param[in] sourceBuffer_e_current exponent of sourceBufferImag. +- * \param[in] overlap number of overlap samples. +- * \param[out] GainVec array of gain values (one for each QMF band). +- * \param[out] GainVec_exp exponents of GainVec (one for each QMF band). +- * \param[in] numBands number of low bands (k_0). +- * \param[in] startSample time slot start. +- * \param[in] stopSample time slot stop. +- */ +-void sbrDecoder_calculateGainVec(FIXP_DBL **sourceBufferReal, +- FIXP_DBL **sourceBufferImag, +- int sourceBuffer_e_overlap, +- int sourceBuffer_e_current, int overlap, +- FIXP_DBL GainVec[], int GainVec_exp[], +- const int numBands, const int startSample, +- const int stopSample); +- +-#endif /* __HFGEN_PREFLAT_H */ +diff --git a/libSBRdec/src/arm/lpp_tran_arm.cpp b/libSBRdec/src/arm/lpp_tran_arm.cpp +deleted file mode 100644 +index db1948f..0000000 +--- a/libSBRdec/src/arm/lpp_tran_arm.cpp ++++ /dev/null +@@ -1,159 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Arthur Tritthart +- +- Description: (ARM optimised) LPP transposer subroutines +- +-*******************************************************************************/ +- +-#if defined(__arm__) +- +-#define FUNCTION_LPPTRANSPOSER_func1 +- +-#ifdef FUNCTION_LPPTRANSPOSER_func1 +- +-/* Note: This code requires only 43 cycles per iteration instead of 61 on +- * ARM926EJ-S */ +-static void lppTransposer_func1(FIXP_DBL *lowBandReal, FIXP_DBL *lowBandImag, +- FIXP_DBL **qmfBufferReal, +- FIXP_DBL **qmfBufferImag, int loops, int hiBand, +- int dynamicScale, int descale, FIXP_SGL a0r, +- FIXP_SGL a0i, FIXP_SGL a1r, FIXP_SGL a1i, +- const int fPreWhitening, +- FIXP_DBL preWhiteningGain, +- int preWhiteningGains_sf) { +- FIXP_DBL real1, real2, imag1, imag2, accu1, accu2; +- +- real2 = lowBandReal[-2]; +- real1 = lowBandReal[-1]; +- imag2 = lowBandImag[-2]; +- imag1 = lowBandImag[-1]; +- for (int i = 0; i < loops; i++) { +- accu1 = fMultDiv2(a0r, real1); +- accu2 = fMultDiv2(a0i, imag1); +- accu1 = fMultAddDiv2(accu1, a1r, real2); +- accu2 = fMultAddDiv2(accu2, a1i, imag2); +- real2 = fMultDiv2(a1i, real2); +- accu1 = accu1 - accu2; +- accu1 = accu1 >> dynamicScale; +- +- accu2 = fMultAddDiv2(real2, a1r, imag2); +- real2 = real1; +- imag2 = imag1; +- accu2 = fMultAddDiv2(accu2, a0i, real1); +- real1 = lowBandReal[i]; +- accu2 = fMultAddDiv2(accu2, a0r, imag1); +- imag1 = lowBandImag[i]; +- accu2 = accu2 >> dynamicScale; +- +- accu1 <<= 1; +- accu2 <<= 1; +- accu1 += (real1 >> descale); +- accu2 += (imag1 >> descale); +- if (fPreWhitening) { +- accu1 = scaleValueSaturate(fMultDiv2(accu1, preWhiteningGain), +- preWhiteningGains_sf); +- accu2 = scaleValueSaturate(fMultDiv2(accu2, preWhiteningGain), +- preWhiteningGains_sf); +- } +- qmfBufferReal[i][hiBand] = accu1; +- qmfBufferImag[i][hiBand] = accu2; +- } +-} +-#endif /* #ifdef FUNCTION_LPPTRANSPOSER_func1 */ +- +-#endif /* __arm__ */ +diff --git a/libSBRdec/src/env_calc.cpp b/libSBRdec/src/env_calc.cpp +deleted file mode 100644 +index cb1474f..0000000 +--- a/libSBRdec/src/env_calc.cpp ++++ /dev/null +@@ -1,3158 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope calculation +- +- The envelope adjustor compares the energies present in the transposed +- highband to the reference energies conveyed with the bitstream. +- The highband is amplified (sometimes) or attenuated (mostly) to the +- desired level. +- +- The spectral shape of the reference energies can be changed several times per +- frame if necessary. Each set of energy values corresponding to a certain range +- in time will be called an envelope here. +- The bitstream supports several frequency scales and two resolutions. Normally, +- one or more QMF-subbands are grouped to one SBR-band. An envelope contains +- reference energies for each SBR-band. +- In addition to the energy envelopes, noise envelopes are transmitted that +- define the ratio of energy which is generated by adding noise instead of +- transposing the lowband. The noise envelopes are given in a coarser time +- and frequency resolution. +- If a signal contains strong tonal components, synthetic sines can be +- generated in individual SBR bands. +- +- An overlap buffer of 6 QMF-timeslots is used to allow a more +- flexible alignment of the envelopes in time that is not restricted to the +- core codec's frame borders. +- Therefore the envelope adjustor has access to the spectral data of the +- current frame as well as the last 6 QMF-timeslots of the previous frame. +- However, in average only the data of 1 frame is being processed as +- the adjustor is called once per frame. +- +- Depending on the frequency range set in the bitstream, only QMF-subbands +- between lowSubband and highSubband are adjusted. +- +- Scaling of spectral data to maximize SNR (see #QMF_SCALE_FACTOR) as well as a +- special Mantissa-Exponent format ( see calculateSbrEnvelope() ) are being +- used. The main entry point for this modules is calculateSbrEnvelope(). +- +- \sa sbr_scale.h, #QMF_SCALE_FACTOR, calculateSbrEnvelope(), \ref +- documentationOverview +-*/ +- +-#include "env_calc.h" +- +-#include "sbrdec_freq_sca.h" +-#include "env_extr.h" +-#include "transcendent.h" +-#include "sbr_ram.h" +-#include "sbr_rom.h" +- +-#include "genericStds.h" /* need FDKpow() for debug outputs */ +- +-typedef struct { +- FIXP_DBL nrgRef[MAX_FREQ_COEFFS]; +- FIXP_DBL nrgEst[MAX_FREQ_COEFFS]; +- FIXP_DBL nrgGain[MAX_FREQ_COEFFS]; +- FIXP_DBL noiseLevel[MAX_FREQ_COEFFS]; +- FIXP_DBL nrgSine[MAX_FREQ_COEFFS]; +- +- SCHAR nrgRef_e[MAX_FREQ_COEFFS]; +- SCHAR nrgEst_e[MAX_FREQ_COEFFS]; +- SCHAR nrgGain_e[MAX_FREQ_COEFFS]; +- SCHAR noiseLevel_e[MAX_FREQ_COEFFS]; +- SCHAR nrgSine_e[MAX_FREQ_COEFFS]; +- /* yet another exponent [0]: for ts < no_cols; [1]: for ts >= no_cols */ +- SCHAR exponent[2]; +-} ENV_CALC_NRGS; +- +-static void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, SCHAR *filtBuffer_e, +- FIXP_DBL *NrgGain, SCHAR *NrgGain_e, +- int subbands); +- +-static void calcNrgPerSubband(FIXP_DBL **analysBufferReal, +- FIXP_DBL **analysBufferImag, int lowSubband, +- int highSubband, int start_pos, int next_pos, +- SCHAR frameExp, FIXP_DBL *nrgEst, +- SCHAR *nrgEst_e); +- +-static void calcNrgPerSfb(FIXP_DBL **analysBufferReal, +- FIXP_DBL **analysBufferImag, int nSfb, +- UCHAR *freqBandTable, int start_pos, int next_pos, +- SCHAR input_e, FIXP_DBL *nrg_est, SCHAR *nrg_est_e); +- +-static void calcSubbandGain(FIXP_DBL nrgRef, SCHAR nrgRef_e, +- ENV_CALC_NRGS *nrgs, int c, FIXP_DBL tmpNoise, +- SCHAR tmpNoise_e, UCHAR sinePresentFlag, +- UCHAR sineMapped, int noNoiseFlag); +- +-static void calcAvgGain(ENV_CALC_NRGS *nrgs, int lowSubband, int highSubband, +- FIXP_DBL *sumRef_m, SCHAR *sumRef_e, +- FIXP_DBL *ptrAvgGain_m, SCHAR *ptrAvgGain_e); +- +-static void adjustTimeSlot_EldGrid(FIXP_DBL *ptrReal, ENV_CALC_NRGS *nrgs, +- UCHAR *ptrHarmIndex, int lowSubbands, +- int noSubbands, int scale_change, +- int noNoiseFlag, int *ptrPhaseIndex, +- int scale_diff_low); +- +-static void adjustTimeSlotLC(FIXP_DBL *ptrReal, ENV_CALC_NRGS *nrgs, +- UCHAR *ptrHarmIndex, int lowSubbands, +- int noSubbands, int scale_change, int noNoiseFlag, +- int *ptrPhaseIndex); +- +-/** +- * \brief Variant of adjustTimeSlotHQ() which only regards gain and noise but no +- * additional harmonics +- */ +-static void adjustTimeSlotHQ_GainAndNoise( +- FIXP_DBL *ptrReal, FIXP_DBL *ptrImag, +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs, +- int lowSubbands, int noSubbands, int scale_change, FIXP_SGL smooth_ratio, +- int noNoiseFlag, int filtBufferNoiseShift); +-/** +- * \brief Variant of adjustTimeSlotHQ() which only adds the additional harmonics +- */ +-static void adjustTimeSlotHQ_AddHarmonics( +- FIXP_DBL *ptrReal, FIXP_DBL *ptrImag, +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs, +- int lowSubbands, int noSubbands, int scale_change); +- +-static void adjustTimeSlotHQ(FIXP_DBL *ptrReal, FIXP_DBL *ptrImag, +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, +- ENV_CALC_NRGS *nrgs, int lowSubbands, +- int noSubbands, int scale_change, +- FIXP_SGL smooth_ratio, int noNoiseFlag, +- int filtBufferNoiseShift); +- +-/*! +- \brief Map sine flags from bitstream to QMF bands +- +- The bitstream carries only 1 sine flag per band (Sfb) and frame. +- This function maps every sine flag from the bitstream to a specific QMF +- subband and to a specific envelope where the sine shall start. The result is +- stored in the vector sineMapped which contains one entry per QMF subband. The +- value of an entry specifies the envelope where a sine shall start. A value of +- 32 indicates that no sine is present in the subband. The missing harmonics +- flags from the previous frame (harmFlagsPrev) determine if a sine starts at +- the beginning of the frame or at the transient position. Additionally, the +- flags in harmFlagsPrev are being updated by this function for the next frame. +-*/ +-static void mapSineFlags( +- UCHAR *freqBandTable, /*!< Band borders (there's only 1 flag per band) */ +- int nSfb, /*!< Number of bands in the table */ +- ULONG *addHarmonics, /*!< Packed addHarmonics of current frame (aligned to +- the MSB) */ +- ULONG *harmFlagsPrev, /*!< Packed addHarmonics of previous frame (aligned to +- the LSB) */ +- ULONG *harmFlagsPrevActive, /*!< Packed sineMapped of previous frame +- (aligned to the LSB) */ +- int tranEnv, /*!< Transient position */ +- SCHAR *sineMapped) /*!< Resulting vector of sine start positions for each +- QMF band */ +- +-{ +- int i; +- int bitcount = 31; +- ULONG harmFlagsQmfBands[ADD_HARMONICS_FLAGS_SIZE] = {0}; +- ULONG *curFlags = addHarmonics; +- +- /* +- Format of addHarmonics (aligned to MSB): +- +- Up to MAX_FREQ_COEFFS sfb bands can be flagged for a sign. +- first word = flags for lowest 32 sfb bands in use +- second word = flags for higest 32 sfb bands (if present) +- +- Format of harmFlagsPrev (aligned to LSB): +- +- Index is absolute (not relative to lsb) so it is correct even if lsb +- changes first word = flags for lowest 32 qmf bands (0...31) second word = +- flags for next higher 32 qmf bands (32...63) +- +- */ +- +- /* Reset the output vector first */ +- FDKmemset(sineMapped, 32, +- MAX_FREQ_COEFFS * sizeof(SCHAR)); /* 32 means 'no sine' */ +- FDKmemclear(harmFlagsPrevActive, ADD_HARMONICS_FLAGS_SIZE * sizeof(ULONG)); +- for (i = 0; i < nSfb; i++) { +- ULONG maskSfb = +- 1 << bitcount; /* mask to extract addHarmonics flag of current Sfb */ +- +- if (*curFlags & maskSfb) { /* There is a sine in this band */ +- const int lsb = freqBandTable[0]; /* start of sbr range */ +- /* qmf band to which sine should be added */ +- const int qmfBand = (freqBandTable[i] + freqBandTable[i + 1]) >> 1; +- const int qmfBandDiv32 = qmfBand >> 5; +- const int maskQmfBand = +- 1 << (qmfBand & +- 31); /* mask to extract harmonic flag from prevFlags */ +- +- /* mapping of sfb with sine to a certain qmf band -> for harmFlagsPrev */ +- harmFlagsQmfBands[qmfBandDiv32] |= maskQmfBand; +- +- /* +- If there was a sine in the last frame, let it continue from the first +- envelope on else start at the transient position. Indexing of sineMapped +- starts relative to lsb. +- */ +- sineMapped[qmfBand - lsb] = +- (harmFlagsPrev[qmfBandDiv32] & maskQmfBand) ? 0 : tranEnv; +- if (sineMapped[qmfBand - lsb] < PVC_NTIMESLOT) { +- harmFlagsPrevActive[qmfBandDiv32] |= maskQmfBand; +- } +- } +- +- if (bitcount-- == 0) { +- bitcount = 31; +- curFlags++; +- } +- } +- FDKmemcpy(harmFlagsPrev, harmFlagsQmfBands, +- sizeof(ULONG) * ADD_HARMONICS_FLAGS_SIZE); +-} +- +-/*! +- \brief Restore sineMapped of previous frame +- +- For PVC it might happen that the PVC framing (always 0) is out of sync with +- the SBR framing. The adding of additional harmonics is done based on the SBR +- framing. If the SBR framing is trailing the PVC framing the sine mapping of +- the previous SBR frame needs to be used for the overlapping time slots. +-*/ +-/*static*/ void mapSineFlagsPvc( +- UCHAR *freqBandTable, /*!< Band borders (there's only 1 flag per +- band) */ +- int nSfb, /*!< Number of bands in the table */ +- ULONG *harmFlagsPrev, /*!< Packed addHarmonics of previous frame +- (aligned to the MSB) */ +- ULONG *harmFlagsPrevActive, /*!< Packed sineMapped of previous +- frame (aligned to the LSB) */ +- SCHAR *sineMapped, /*!< Resulting vector of sine start positions +- for each QMF band */ +- int sinusoidalPos, /*!< sinusoidal position */ +- SCHAR *sinusoidalPosPrev, /*!< sinusoidal position of previous +- frame */ +- int trailingSbrFrame) /*!< indication if the SBR framing is +- trailing the PVC framing */ +-{ +- /* Reset the output vector first */ +- FDKmemset(sineMapped, 32, MAX_FREQ_COEFFS); /* 32 means 'no sine' */ +- +- if (trailingSbrFrame) { +- /* restore sineMapped[] of previous frame */ +- int i; +- const int lsb = freqBandTable[0]; +- const int usb = freqBandTable[nSfb]; +- for (i = lsb; i < usb; i++) { +- const int qmfBandDiv32 = i >> 5; +- const int maskQmfBand = +- 1 << (i & 31); /* mask to extract harmonic flag from prevFlags */ +- +- /* Two cases need to be distinguished ... */ +- if (harmFlagsPrevActive[qmfBandDiv32] & maskQmfBand) { +- /* the sine mapping already started last PVC frame -> seamlessly +- * continue */ +- sineMapped[i - lsb] = 0; +- } else if (harmFlagsPrev[qmfBandDiv32] & maskQmfBand) { +- /* sinusoidalPos of prev PVC frame was >= PVC_NTIMESLOT -> sine starts +- * in this frame */ +- sineMapped[i - lsb] = +- *sinusoidalPosPrev - PVC_NTIMESLOT; /* we are 16 sbr time slots +- ahead of last frame now */ +- } +- } +- } +- *sinusoidalPosPrev = sinusoidalPos; +-} +- +-/*! +- \brief Reduce gain-adjustment induced aliasing for real valued filterbank. +-*/ +-/*static*/ void aliasingReduction( +- FIXP_DBL *degreeAlias, /*!< estimated aliasing for each QMF +- channel */ +- ENV_CALC_NRGS *nrgs, +- UCHAR *useAliasReduction, /*!< synthetic sine energy for each +- subband, used as flag */ +- int noSubbands) /*!< number of QMF channels to process */ +-{ +- FIXP_DBL *nrgGain = nrgs->nrgGain; /*!< subband gains to be modified */ +- SCHAR *nrgGain_e = +- nrgs->nrgGain_e; /*!< subband gains to be modified (exponents) */ +- FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< subband energy before amplification */ +- SCHAR *nrgEst_e = +- nrgs->nrgEst_e; /*!< subband energy before amplification (exponents) */ +- int grouping = 0, index = 0, noGroups, k; +- int groupVector[MAX_FREQ_COEFFS]; +- +- /* Calculate grouping*/ +- for (k = 0; k < noSubbands - 1; k++) { +- if ((degreeAlias[k + 1] != FL2FXCONST_DBL(0.0f)) && useAliasReduction[k]) { +- if (grouping == 0) { +- groupVector[index++] = k; +- grouping = 1; +- } else { +- if (groupVector[index - 1] + 3 == k) { +- groupVector[index++] = k + 1; +- grouping = 0; +- } +- } +- } else { +- if (grouping) { +- if (useAliasReduction[k]) +- groupVector[index++] = k + 1; +- else +- groupVector[index++] = k; +- grouping = 0; +- } +- } +- } +- +- if (grouping) { +- groupVector[index++] = noSubbands; +- } +- noGroups = index >> 1; +- +- /*Calculate new gain*/ +- for (int group = 0; group < noGroups; group++) { +- FIXP_DBL nrgOrig = FL2FXCONST_DBL( +- 0.0f); /* Original signal energy in current group of bands */ +- SCHAR nrgOrig_e = 0; +- FIXP_DBL nrgAmp = FL2FXCONST_DBL( +- 0.0f); /* Amplified signal energy in group (using current gains) */ +- SCHAR nrgAmp_e = 0; +- FIXP_DBL nrgMod = FL2FXCONST_DBL( +- 0.0f); /* Signal energy in group when applying modified gains */ +- SCHAR nrgMod_e = 0; +- FIXP_DBL groupGain; /* Total energy gain in group */ +- SCHAR groupGain_e; +- FIXP_DBL compensation; /* Compensation factor for the energy change when +- applying modified gains */ +- SCHAR compensation_e; +- +- int startGroup = groupVector[2 * group]; +- int stopGroup = groupVector[2 * group + 1]; +- +- /* Calculate total energy in group before and after amplification with +- * current gains: */ +- for (k = startGroup; k < stopGroup; k++) { +- /* Get original band energy */ +- FIXP_DBL tmp = nrgEst[k]; +- SCHAR tmp_e = nrgEst_e[k]; +- +- FDK_add_MantExp(tmp, tmp_e, nrgOrig, nrgOrig_e, &nrgOrig, &nrgOrig_e); +- +- /* Multiply band energy with current gain */ +- tmp = fMult(tmp, nrgGain[k]); +- tmp_e = tmp_e + nrgGain_e[k]; +- +- FDK_add_MantExp(tmp, tmp_e, nrgAmp, nrgAmp_e, &nrgAmp, &nrgAmp_e); +- } +- +- /* Calculate total energy gain in group */ +- FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgOrig, nrgOrig_e, &groupGain, +- &groupGain_e); +- +- for (k = startGroup; k < stopGroup; k++) { +- FIXP_DBL tmp; +- SCHAR tmp_e; +- +- FIXP_DBL alpha = degreeAlias[k]; +- if (k < noSubbands - 1) { +- if (degreeAlias[k + 1] > alpha) alpha = degreeAlias[k + 1]; +- } +- +- /* Modify gain depending on the degree of aliasing */ +- FDK_add_MantExp( +- fMult(alpha, groupGain), groupGain_e, +- fMult(/*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - alpha, +- nrgGain[k]), +- nrgGain_e[k], &nrgGain[k], &nrgGain_e[k]); +- +- /* Apply modified gain to original energy */ +- tmp = fMult(nrgGain[k], nrgEst[k]); +- tmp_e = nrgGain_e[k] + nrgEst_e[k]; +- +- /* Accumulate energy with modified gains applied */ +- FDK_add_MantExp(tmp, tmp_e, nrgMod, nrgMod_e, &nrgMod, &nrgMod_e); +- } +- +- /* Calculate compensation factor to retain the energy of the amplified +- * signal */ +- FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgMod, nrgMod_e, &compensation, +- &compensation_e); +- +- /* Apply compensation factor to all gains of the group */ +- for (k = startGroup; k < stopGroup; k++) { +- nrgGain[k] = fMult(nrgGain[k], compensation); +- nrgGain_e[k] = nrgGain_e[k] + compensation_e; +- } +- } +-} +- +-#define INTER_TES_SF_CHANGE 3 +- +-typedef struct { +- FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL subsample_power_high[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL gain[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- SCHAR subsample_power_low_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- SCHAR subsample_power_high_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +-} ITES_TEMP; +- +-static void apply_inter_tes(FIXP_DBL **qmfReal, FIXP_DBL **qmfImag, +- const QMF_SCALE_FACTOR *sbrScaleFactor, +- const SCHAR exp[2], const int RATE, +- const int startPos, const int stopPos, +- const int lowSubband, const int nbSubband, +- const UCHAR gamma_idx) { +- int highSubband = lowSubband + nbSubband; +- FIXP_DBL *subsample_power_high, *subsample_power_low; +- SCHAR *subsample_power_high_sf, *subsample_power_low_sf; +- FIXP_DBL total_power_high = (FIXP_DBL)0; +- FIXP_DBL total_power_low = (FIXP_DBL)0; +- FIXP_DBL *gain; +- int gain_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- +- /* gamma[gamma_idx] = {0.0f, 1.0f, 2.0f, 4.0f} */ +- int gamma_sf = +- (int)gamma_idx - 1; /* perhaps +1 to save one bit? (0.99999f vs 1.f) */ +- +- int nbSubsample = stopPos - startPos; +- int i, j; +- +- C_ALLOC_SCRATCH_START(pTmp, ITES_TEMP, 1); +- subsample_power_high = pTmp->subsample_power_high; +- subsample_power_low = pTmp->subsample_power_low; +- subsample_power_high_sf = pTmp->subsample_power_high_sf; +- subsample_power_low_sf = pTmp->subsample_power_low_sf; +- gain = pTmp->gain; +- +- if (gamma_idx > 0) { +- int preShift2 = 32 - fNormz((FIXP_DBL)nbSubsample); +- int total_power_low_sf = 1 - DFRACT_BITS; +- int total_power_high_sf = 1 - DFRACT_BITS; +- +- for (i = 0; i < nbSubsample; ++i) { +- FIXP_DBL bufferReal[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL bufferImag[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL maxVal = (FIXP_DBL)0; +- +- int ts = startPos + i; +- +- int low_sf = (ts < 3 * RATE) ? sbrScaleFactor->ov_lb_scale +- : sbrScaleFactor->lb_scale; +- low_sf = 15 - low_sf; +- +- for (j = 0; j < lowSubband; ++j) { +- bufferImag[j] = qmfImag[startPos + i][j]; +- maxVal |= (FIXP_DBL)((LONG)(bufferImag[j]) ^ +- ((LONG)bufferImag[j] >> (DFRACT_BITS - 1))); +- bufferReal[j] = qmfReal[startPos + i][j]; +- maxVal |= (FIXP_DBL)((LONG)(bufferReal[j]) ^ +- ((LONG)bufferReal[j] >> (DFRACT_BITS - 1))); +- } +- +- subsample_power_low[i] = (FIXP_DBL)0; +- subsample_power_low_sf[i] = 0; +- +- if (maxVal != FL2FXCONST_DBL(0.f)) { +- /* multiply first, then shift for safe summation */ +- int preShift = 1 - CntLeadingZeros(maxVal); +- int postShift = 32 - fNormz((FIXP_DBL)lowSubband); +- +- /* reduce preShift because otherwise we risk to square -1.f */ +- if (preShift != 0) preShift++; +- +- subsample_power_low_sf[i] += (low_sf + preShift) * 2 + postShift + 1; +- +- scaleValues(bufferReal, lowSubband, -preShift); +- scaleValues(bufferImag, lowSubband, -preShift); +- for (j = 0; j < lowSubband; ++j) { +- FIXP_DBL addme; +- addme = fPow2Div2(bufferReal[j]); +- subsample_power_low[i] += addme >> postShift; +- addme = fPow2Div2(bufferImag[j]); +- subsample_power_low[i] += addme >> postShift; +- } +- } +- +- /* now get high */ +- +- maxVal = (FIXP_DBL)0; +- +- int high_sf = exp[(ts < 16 * RATE) ? 0 : 1]; +- +- for (j = lowSubband; j < highSubband; ++j) { +- bufferImag[j] = qmfImag[startPos + i][j]; +- maxVal |= (FIXP_DBL)((LONG)(bufferImag[j]) ^ +- ((LONG)bufferImag[j] >> (DFRACT_BITS - 1))); +- bufferReal[j] = qmfReal[startPos + i][j]; +- maxVal |= (FIXP_DBL)((LONG)(bufferReal[j]) ^ +- ((LONG)bufferReal[j] >> (DFRACT_BITS - 1))); +- } +- +- subsample_power_high[i] = (FIXP_DBL)0; +- subsample_power_high_sf[i] = 0; +- +- if (maxVal != FL2FXCONST_DBL(0.f)) { +- int preShift = 1 - CntLeadingZeros(maxVal); +- /* reduce preShift because otherwise we risk to square -1.f */ +- if (preShift != 0) preShift++; +- +- int postShift = 32 - fNormz((FIXP_DBL)(highSubband - lowSubband)); +- subsample_power_high_sf[i] += (high_sf + preShift) * 2 + postShift + 1; +- +- scaleValues(&bufferReal[lowSubband], highSubband - lowSubband, +- -preShift); +- scaleValues(&bufferImag[lowSubband], highSubband - lowSubband, +- -preShift); +- for (j = lowSubband; j < highSubband; j++) { +- subsample_power_high[i] += fPow2Div2(bufferReal[j]) >> postShift; +- subsample_power_high[i] += fPow2Div2(bufferImag[j]) >> postShift; +- } +- } +- +- /* sum all together */ +- FIXP_DBL new_summand = subsample_power_low[i]; +- int new_summand_sf = subsample_power_low_sf[i]; +- +- /* make sure the current sum, and the new summand have the same SF */ +- if (new_summand_sf > total_power_low_sf) { +- int diff = fMin(DFRACT_BITS - 1, new_summand_sf - total_power_low_sf); +- total_power_low >>= diff; +- total_power_low_sf = new_summand_sf; +- } else if (new_summand_sf < total_power_low_sf) { +- new_summand >>= +- fMin(DFRACT_BITS - 1, total_power_low_sf - new_summand_sf); +- } +- +- total_power_low += (new_summand >> preShift2); +- +- new_summand = subsample_power_high[i]; +- new_summand_sf = subsample_power_high_sf[i]; +- if (new_summand_sf > total_power_high_sf) { +- total_power_high >>= +- fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_sf); +- total_power_high_sf = new_summand_sf; +- } else if (new_summand_sf < total_power_high_sf) { +- new_summand >>= +- fMin(DFRACT_BITS - 1, total_power_high_sf - new_summand_sf); +- } +- +- total_power_high += (new_summand >> preShift2); +- } +- +- total_power_low_sf += preShift2; +- total_power_high_sf += preShift2; +- +- /* gain[i] = e_LOW[i] */ +- for (i = 0; i < nbSubsample; ++i) { +- int sf2; +- FIXP_DBL mult = +- fMultNorm(subsample_power_low[i], (FIXP_DBL)nbSubsample, &sf2); +- int mult_sf = subsample_power_low_sf[i] + DFRACT_BITS - 1 + sf2; +- +- if (total_power_low != FIXP_DBL(0)) { +- gain[i] = fDivNorm(mult, total_power_low, &sf2); +- gain_sf[i] = mult_sf - total_power_low_sf + sf2; +- gain[i] = sqrtFixp_lookup(gain[i], &gain_sf[i]); +- if (gain_sf[i] < 0) { +- gain[i] >>= -gain_sf[i]; +- gain_sf[i] = 0; +- } +- } else { +- if (mult == FIXP_DBL(0)) { +- gain[i] = FIXP_DBL(0); +- gain_sf[i] = 0; +- } else { +- gain[i] = (FIXP_DBL)MAXVAL_DBL; +- gain_sf[i] = 0; +- } +- } +- } +- +- FIXP_DBL total_power_high_after = (FIXP_DBL)0; +- int total_power_high_after_sf = 1 - DFRACT_BITS; +- +- /* gain[i] = g_inter[i] */ +- for (i = 0; i < nbSubsample; ++i) { +- if (gain_sf[i] < 0) { +- gain[i] >>= -gain_sf[i]; +- gain_sf[i] = 0; +- } +- +- /* calculate: gain[i] = 1.0f + gamma * (gain[i] - 1.0f); */ +- FIXP_DBL one = (FIXP_DBL)MAXVAL_DBL >> +- gain_sf[i]; /* to substract this from gain[i] */ +- +- /* gamma is actually always 1 according to the table, so skip the +- * fMultDiv2 */ +- FIXP_DBL mult = (gain[i] - one) >> 1; +- int mult_sf = gain_sf[i] + gamma_sf; +- +- one = FL2FXCONST_DBL(0.5f) >> mult_sf; +- gain[i] = one + mult; +- gain_sf[i] += gamma_sf + 1; /* +1 because of fMultDiv2() */ +- +- /* set gain to at least 0.2f */ +- FIXP_DBL point_two = FL2FXCONST_DBL(0.8f); /* scaled up by 2 */ +- int point_two_sf = -2; +- +- FIXP_DBL tmp = gain[i]; +- if (point_two_sf < gain_sf[i]) { +- point_two >>= gain_sf[i] - point_two_sf; +- } else { +- tmp >>= point_two_sf - gain_sf[i]; +- } +- +- /* limit and calculate gain[i]^2 too */ +- FIXP_DBL gain_pow2; +- int gain_pow2_sf; +- if (tmp < point_two) { +- gain[i] = FL2FXCONST_DBL(0.8f); +- gain_sf[i] = -2; +- gain_pow2 = FL2FXCONST_DBL(0.64f); +- gain_pow2_sf = -4; +- } else { +- /* this upscaling seems quite important */ +- int r = CountLeadingBits(gain[i]); +- gain[i] <<= r; +- gain_sf[i] -= r; +- +- gain_pow2 = fPow2(gain[i]); +- gain_pow2_sf = gain_sf[i] << 1; +- } +- +- int room; +- subsample_power_high[i] = +- fMultNorm(subsample_power_high[i], gain_pow2, &room); +- subsample_power_high_sf[i] = +- subsample_power_high_sf[i] + gain_pow2_sf + room; +- +- int new_summand_sf = subsample_power_high_sf[i]; /* + gain_pow2_sf; */ +- if (new_summand_sf > total_power_high_after_sf) { +- total_power_high_after >>= +- fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_after_sf); +- total_power_high_after_sf = new_summand_sf; +- } else if (new_summand_sf < total_power_high_after_sf) { +- subsample_power_high[i] >>= total_power_high_after_sf - new_summand_sf; +- } +- total_power_high_after += subsample_power_high[i] >> preShift2; +- } +- +- total_power_high_after_sf += preShift2; +- +- int sf2 = 0; +- FIXP_DBL gain_adj_2 = FL2FX_DBL(0.5f); +- int gain_adj_2_sf = 1; +- +- if ((total_power_high != (FIXP_DBL)0) && +- (total_power_high_after != (FIXP_DBL)0)) { +- gain_adj_2 = fDivNorm(total_power_high, total_power_high_after, &sf2); +- gain_adj_2_sf = total_power_high_sf - total_power_high_after_sf + sf2; +- } +- +- FIXP_DBL gain_adj = sqrtFixp_lookup(gain_adj_2, &gain_adj_2_sf); +- int gain_adj_sf = gain_adj_2_sf; +- +- for (i = 0; i < nbSubsample; ++i) { +- gain[i] = fMult(gain[i], gain_adj); +- gain_sf[i] += gain_adj_sf; +- +- /* limit gain */ +- if (gain_sf[i] > INTER_TES_SF_CHANGE) { +- gain[i] = (FIXP_DBL)MAXVAL_DBL; +- gain_sf[i] = INTER_TES_SF_CHANGE; +- } +- } +- +- for (i = 0; i < nbSubsample; ++i) { +- /* equalize gain[]'s scale factors */ +- gain[i] >>= INTER_TES_SF_CHANGE - gain_sf[i]; +- +- for (j = lowSubband; j < highSubband; j++) { +- qmfReal[startPos + i][j] = fMult(qmfReal[startPos + i][j], gain[i]); +- qmfImag[startPos + i][j] = fMult(qmfImag[startPos + i][j], gain[i]); +- } +- } +- } else { /* gamma_idx == 0 */ +- /* Inter-TES is not active. Still perform the scale change to have a +- * consistent scaling for all envelopes of this frame. */ +- for (i = 0; i < nbSubsample; ++i) { +- for (j = lowSubband; j < highSubband; j++) { +- qmfReal[startPos + i][j] >>= INTER_TES_SF_CHANGE; +- qmfImag[startPos + i][j] >>= INTER_TES_SF_CHANGE; +- } +- } +- } +- C_ALLOC_SCRATCH_END(pTmp, ITES_TEMP, 1); +-} +- +-/*! +- \brief Apply spectral envelope to subband samples +- +- This function is called from sbr_dec.cpp in each frame. +- +- To enhance accuracy and due to the usage of tables for squareroots and +- inverse, some calculations are performed with the operands being split +- into mantissa and exponent. The variable names in the source code carry +- the suffixes _m and _e respectively. The control data +- in #hFrameData containts envelope data which is represented by this format but +- stored in single words. (See requantizeEnvelopeData() for details). This data +- is unpacked within calculateSbrEnvelope() to follow the described suffix +- convention. +- +- The actual value (comparable to the corresponding float-variable in the +- research-implementation) of a mantissa/exponent-pair can be calculated as +- +- \f$ value = value\_m * 2^{value\_e} \f$ +- +- All energies and noise levels decoded from the bitstream suit for an +- original signal magnitude of \f$\pm 32768 \f$ rather than \f$ \pm 1\f$. +- Therefore, the scale factor hb_scale passed into this function will +- be converted to an 'input exponent' (#input_e), which fits the internal +- representation. +- +- Before the actual processing, an exponent #adj_e for resulting adjusted +- samples is derived from the maximum reference energy. +- +- Then, for each envelope, the following steps are performed: +- +- \li Calculate energy in the signal to be adjusted. Depending on the the value +- of #interpolFreq (interpolation mode), this is either done seperately for each +- QMF-subband or for each SBR-band. The resulting energies are stored in +- #nrgEst_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgEst_e[#MAX_FREQ_COEFFS] +- (exponents). \li Calculate gain and noise level for each subband:
\f$ gain +- = \sqrt{ \frac{nrgRef}{nrgEst} \cdot (1 - noiseRatio) } \hspace{2cm} noise = +- \sqrt{ nrgRef \cdot noiseRatio } \f$
where noiseRatio and +- nrgRef are extracted from the bitstream and nrgEst is the +- subband energy before adjustment. The resulting gains are stored in +- #nrgGain_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgGain_e[#MAX_FREQ_COEFFS] +- (exponents), the noise levels are stored in #noiseLevel_m[#MAX_FREQ_COEFFS] +- and #noiseLevel_e[#MAX_FREQ_COEFFS] (exponents). The sine levels are stored in +- #nrgSine_m[#MAX_FREQ_COEFFS] and #nrgSine_e[#MAX_FREQ_COEFFS]. \li Noise +- limiting: The gain for each subband is limited both absolutely and relatively +- compared to the total gain over all subbands. \li Boost gain: Calculate and +- apply boost factor for each limiter band in order to compensate for the energy +- loss imposed by the limiting. \li Apply gains and add noise: The gains and +- noise levels are applied to all timeslots of the current envelope. A short +- FIR-filter (length 4 QMF-timeslots) can be used to smooth the sudden change at +- the envelope borders. Each complex subband sample of the current timeslot is +- multiplied by the smoothed gain, then random noise with the calculated level +- is added. +- +- \note +- To reduce the stack size, some of the local arrays could be located within +- the time output buffer. Of the 512 samples temporarily available there, +- about half the size is already used by #SBR_FRAME_DATA. A pointer to the +- remaining free memory could be supplied by an additional argument to +- calculateSbrEnvelope() in sbr_dec: +- +- \par +- \code +- calculateSbrEnvelope (&hSbrDec->sbrScaleFactor, +- &hSbrDec->SbrCalculateEnvelope, +- hHeaderData, +- hFrameData, +- QmfBufferReal, +- QmfBufferImag, +- timeOutPtr + sizeof(SBR_FRAME_DATA)/sizeof(Float) + +- 1); \endcode +- +- \par +- Within calculateSbrEnvelope(), some pointers could be defined instead of the +- arrays #nrgRef_m, #nrgRef_e, #nrgEst_m, #nrgEst_e, #noiseLevel_m: +- +- \par +- \code +- fract* nrgRef_m = timeOutPtr; +- SCHAR* nrgRef_e = nrgRef_m + MAX_FREQ_COEFFS; +- fract* nrgEst_m = nrgRef_e + MAX_FREQ_COEFFS; +- SCHAR* nrgEst_e = nrgEst_m + MAX_FREQ_COEFFS; +- fract* noiseLevel_m = nrgEst_e + MAX_FREQ_COEFFS; +- \endcode +- +-
+-*/ +-void calculateSbrEnvelope( +- QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ +- HANDLE_SBR_CALCULATE_ENVELOPE +- h_sbr_cal_env, /*!< Handle to struct filled by the create-function */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ +- PVC_DYNAMIC_DATA *pPvcDynamicData, +- FIXP_DBL * +- *analysBufferReal, /*!< Real part of subband samples to be processed */ +- FIXP_DBL * +- *analysBufferImag, /*!< Imag part of subband samples to be processed */ +- const int useLP, +- FIXP_DBL *degreeAlias, /*!< Estimated aliasing for each QMF channel */ +- const UINT flags, const int frameErrorFlag) { +- int c, i, i_stop, j, envNoise = 0; +- UCHAR *borders = hFrameData->frameInfo.borders; +- UCHAR *bordersPvc = hFrameData->frameInfo.pvcBorders; +- int pvc_mode = pPvcDynamicData->pvc_mode; +- int first_start = +- ((pvc_mode > 0) ? bordersPvc[0] : borders[0]) * hHeaderData->timeStep; +- FIXP_SGL *noiseLevels = hFrameData->sbrNoiseFloorLevel; +- HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; +- UCHAR **pFreqBandTable = hFreq->freqBandTable; +- UCHAR *pFreqBandTableNoise = hFreq->freqBandTableNoise; +- +- int lowSubband = hFreq->lowSubband; +- int highSubband = hFreq->highSubband; +- int noSubbands = highSubband - lowSubband; +- +- /* old high subband before headerchange +- we asume no headerchange here */ +- int ov_highSubband = hFreq->highSubband; +- +- int noNoiseBands = hFreq->nNfb; +- UCHAR *noSubFrameBands = hFreq->nSfb; +- int no_cols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; +- +- SCHAR sineMapped[MAX_FREQ_COEFFS]; +- SCHAR ov_adj_e = SCALE2EXP(sbrScaleFactor->ov_hb_scale); +- SCHAR adj_e = 0; +- SCHAR output_e; +- SCHAR final_e = 0; +- /* inter-TES is active in one or more envelopes of the current SBR frame */ +- const int iTES_enable = hFrameData->iTESactive; +- const int iTES_scale_change = (iTES_enable) ? INTER_TES_SF_CHANGE : 0; +- SCHAR maxGainLimit_e = (frameErrorFlag) ? MAX_GAIN_CONCEAL_EXP : MAX_GAIN_EXP; +- +- UCHAR smooth_length = 0; +- +- FIXP_SGL *pIenv = hFrameData->iEnvelope; +- +- C_ALLOC_SCRATCH_START(useAliasReduction, UCHAR, 64) +- +- /* if values differ we had a headerchange; if old highband is bigger then new +- one we need to patch overlap-highband-scaling for this frame (see use of +- ov_highSubband) as overlap contains higher frequency components which would +- get lost */ +- if (hFreq->highSubband < hFreq->ov_highSubband) { +- ov_highSubband = hFreq->ov_highSubband; +- } +- +- if (pvc_mode > 0) { +- if (hFrameData->frameInfo.bordersNoise[0] > bordersPvc[0]) { +- /* noise envelope of previous frame is trailing into current PVC frame */ +- envNoise = -1; +- noiseLevels = h_sbr_cal_env->prevSbrNoiseFloorLevel; +- noNoiseBands = h_sbr_cal_env->prevNNfb; +- noSubFrameBands = h_sbr_cal_env->prevNSfb; +- lowSubband = h_sbr_cal_env->prevLoSubband; +- highSubband = h_sbr_cal_env->prevHiSubband; +- +- noSubbands = highSubband - lowSubband; +- ov_highSubband = highSubband; +- if (highSubband < h_sbr_cal_env->prev_ov_highSubband) { +- ov_highSubband = h_sbr_cal_env->prev_ov_highSubband; +- } +- +- pFreqBandTable[0] = h_sbr_cal_env->prevFreqBandTableLo; +- pFreqBandTable[1] = h_sbr_cal_env->prevFreqBandTableHi; +- pFreqBandTableNoise = h_sbr_cal_env->prevFreqBandTableNoise; +- } +- +- mapSineFlagsPvc(pFreqBandTable[1], noSubFrameBands[1], +- h_sbr_cal_env->harmFlagsPrev, +- h_sbr_cal_env->harmFlagsPrevActive, sineMapped, +- hFrameData->sinusoidal_position, +- &h_sbr_cal_env->sinusoidal_positionPrev, +- (borders[0] > bordersPvc[0]) ? 1 : 0); +- } else { +- /* +- Extract sine flags for all QMF bands +- */ +- mapSineFlags(pFreqBandTable[1], noSubFrameBands[1], +- hFrameData->addHarmonics, h_sbr_cal_env->harmFlagsPrev, +- h_sbr_cal_env->harmFlagsPrevActive, +- hFrameData->frameInfo.tranEnv, sineMapped); +- } +- +- /* +- Scan for maximum in bufferd noise levels. +- This is needed in case that we had strong noise in the previous frame +- which is smoothed into the current frame. +- The resulting exponent is used as start value for the maximum search +- in reference energies +- */ +- if (!useLP) +- adj_e = h_sbr_cal_env->filtBufferNoise_e - +- getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands); +- +- /* +- Scan for maximum reference energy to be able +- to select appropriate values for adj_e and final_e. +- */ +- if (pvc_mode > 0) { +- INT maxSfbNrg_e = pPvcDynamicData->predEsg_expMax; +- +- /* Energy -> magnitude (sqrt halfens exponent) */ +- maxSfbNrg_e = +- (maxSfbNrg_e + 1) >> 1; /* +1 to go safe (round to next higher int) */ +- +- /* Some safety margin is needed for 2 reasons: +- - The signal energy is not equally spread over all subband samples in +- a specific sfb of an envelope (Nrg could be too high by a factor of +- envWidth * sfbWidth) +- - Smoothing can smear high gains of the previous envelope into the +- current +- */ +- maxSfbNrg_e += 6; +- +- adj_e = maxSfbNrg_e; +- // final_e should not exist for PVC fixfix framing +- } else { +- for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) { +- INT maxSfbNrg_e = +- -FRACT_BITS + NRG_EXP_OFFSET; /* start value for maximum search */ +- +- /* Fetch frequency resolution for current envelope: */ +- for (j = noSubFrameBands[hFrameData->frameInfo.freqRes[i]]; j != 0; j--) { +- maxSfbNrg_e = fixMax(maxSfbNrg_e, (INT)((LONG)(*pIenv++) & MASK_E)); +- } +- maxSfbNrg_e -= NRG_EXP_OFFSET; +- +- /* Energy -> magnitude (sqrt halfens exponent) */ +- maxSfbNrg_e = +- (maxSfbNrg_e + 1) >> 1; /* +1 to go safe (round to next higher int) */ +- +- /* Some safety margin is needed for 2 reasons: +- - The signal energy is not equally spread over all subband samples in +- a specific sfb of an envelope (Nrg could be too high by a factor of +- envWidth * sfbWidth) +- - Smoothing can smear high gains of the previous envelope into the +- current +- */ +- maxSfbNrg_e += 6; +- +- if (borders[i] < hHeaderData->numberTimeSlots) +- /* This envelope affects timeslots that belong to the output frame */ +- adj_e = fMax(maxSfbNrg_e, adj_e); +- +- if (borders[i + 1] > hHeaderData->numberTimeSlots) +- /* This envelope affects timeslots after the output frame */ +- final_e = fMax(maxSfbNrg_e, final_e); +- } +- } +- /* +- Calculate adjustment factors and apply them for every envelope. +- */ +- pIenv = hFrameData->iEnvelope; +- +- if (pvc_mode > 0) { +- /* iterate over SBR time slots starting with bordersPvc[i] */ +- i = bordersPvc[0]; /* usually 0; can be >0 if switching from legacy SBR to +- PVC */ +- i_stop = PVC_NTIMESLOT; +- FDK_ASSERT(bordersPvc[hFrameData->frameInfo.nEnvelopes] == PVC_NTIMESLOT); +- } else { +- /* iterate over SBR envelopes starting with 0 */ +- i = 0; +- i_stop = hFrameData->frameInfo.nEnvelopes; +- } +- for (; i < i_stop; i++) { +- int k, noNoiseFlag; +- SCHAR noise_e, input_e = SCALE2EXP(sbrScaleFactor->hb_scale); +- C_ALLOC_SCRATCH_START(pNrgs, ENV_CALC_NRGS, 1); +- +- /* +- Helper variables. +- */ +- int start_pos, stop_pos, freq_res; +- if (pvc_mode > 0) { +- start_pos = +- hHeaderData->timeStep * +- i; /* Start-position in time (subband sample) for current envelope. */ +- stop_pos = hHeaderData->timeStep * (i + 1); /* Stop-position in time +- (subband sample) for +- current envelope. */ +- freq_res = +- hFrameData->frameInfo +- .freqRes[0]; /* Frequency resolution for current envelope. */ +- FDK_ASSERT( +- freq_res == +- hFrameData->frameInfo.freqRes[hFrameData->frameInfo.nEnvelopes - 1]); +- } else { +- start_pos = hHeaderData->timeStep * +- borders[i]; /* Start-position in time (subband sample) for +- current envelope. */ +- stop_pos = hHeaderData->timeStep * +- borders[i + 1]; /* Stop-position in time (subband sample) for +- current envelope. */ +- freq_res = +- hFrameData->frameInfo +- .freqRes[i]; /* Frequency resolution for current envelope. */ +- } +- +- /* Always fully initialize the temporary energy table. This prevents +- negative energies and extreme gain factors in cases where the number of +- limiter bands exceeds the number of subbands. The latter can be caused by +- undetected bit errors and is tested by some streams from the +- certification set. */ +- FDKmemclear(pNrgs, sizeof(ENV_CALC_NRGS)); +- +- if (pvc_mode > 0) { +- /* get predicted energy values from PVC module */ +- expandPredEsg(pPvcDynamicData, i, (int)MAX_FREQ_COEFFS, pNrgs->nrgRef, +- pNrgs->nrgRef_e); +- +- if (i == borders[0]) { +- mapSineFlags(pFreqBandTable[1], noSubFrameBands[1], +- hFrameData->addHarmonics, h_sbr_cal_env->harmFlagsPrev, +- h_sbr_cal_env->harmFlagsPrevActive, +- hFrameData->sinusoidal_position, sineMapped); +- } +- +- if (i >= hFrameData->frameInfo.bordersNoise[envNoise + 1]) { +- if (envNoise >= 0) { +- noiseLevels += noNoiseBands; /* The noise floor data is stored in a +- row [noiseFloor1 noiseFloor2...].*/ +- } else { +- /* leave trailing noise envelope of past frame */ +- noNoiseBands = hFreq->nNfb; +- noSubFrameBands = hFreq->nSfb; +- noiseLevels = hFrameData->sbrNoiseFloorLevel; +- +- lowSubband = hFreq->lowSubband; +- highSubband = hFreq->highSubband; +- +- noSubbands = highSubband - lowSubband; +- ov_highSubband = highSubband; +- if (highSubband < hFreq->ov_highSubband) { +- ov_highSubband = hFreq->ov_highSubband; +- } +- +- pFreqBandTable[0] = hFreq->freqBandTableLo; +- pFreqBandTable[1] = hFreq->freqBandTableHi; +- pFreqBandTableNoise = hFreq->freqBandTableNoise; +- } +- envNoise++; +- } +- } else { +- /* If the start-pos of the current envelope equals the stop pos of the +- current noise envelope, increase the pointer (i.e. choose the next +- noise-floor).*/ +- if (borders[i] == hFrameData->frameInfo.bordersNoise[envNoise + 1]) { +- noiseLevels += noNoiseBands; /* The noise floor data is stored in a row +- [noiseFloor1 noiseFloor2...].*/ +- envNoise++; +- } +- } +- if (i == hFrameData->frameInfo.tranEnv || +- i == h_sbr_cal_env->prevTranEnv) /* attack */ +- { +- noNoiseFlag = 1; +- if (!useLP) smooth_length = 0; /* No smoothing on attacks! */ +- } else { +- noNoiseFlag = 0; +- if (!useLP) +- smooth_length = (1 - hHeaderData->bs_data.smoothingLength) +- << 2; /* can become either 0 or 4 */ +- } +- +- /* +- Energy estimation in transposed highband. +- */ +- if (hHeaderData->bs_data.interpolFreq) +- calcNrgPerSubband(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- lowSubband, highSubband, start_pos, stop_pos, input_e, +- pNrgs->nrgEst, pNrgs->nrgEst_e); +- else +- calcNrgPerSfb(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- noSubFrameBands[freq_res], pFreqBandTable[freq_res], +- start_pos, stop_pos, input_e, pNrgs->nrgEst, +- pNrgs->nrgEst_e); +- +- /* +- Calculate subband gains +- */ +- { +- UCHAR *table = pFreqBandTable[freq_res]; +- UCHAR *pUiNoise = +- &pFreqBandTableNoise[1]; /*! Upper limit of the current noise floor +- band. */ +- +- FIXP_SGL *pNoiseLevels = noiseLevels; +- +- FIXP_DBL tmpNoise = +- FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); +- SCHAR tmpNoise_e = +- (UCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; +- +- int cc = 0; +- c = 0; +- if (pvc_mode > 0) { +- for (j = 0; j < noSubFrameBands[freq_res]; j++) { +- UCHAR sinePresentFlag = 0; +- int li = table[j]; +- int ui = table[j + 1]; +- +- for (k = li; k < ui; k++) { +- sinePresentFlag |= (i >= sineMapped[cc]); +- cc++; +- } +- +- for (k = li; k < ui; k++) { +- FIXP_DBL refNrg = pNrgs->nrgRef[k - lowSubband]; +- SCHAR refNrg_e = pNrgs->nrgRef_e[k - lowSubband]; +- +- if (k >= *pUiNoise) { +- tmpNoise = +- FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); +- tmpNoise_e = +- (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; +- +- pUiNoise++; +- } +- +- FDK_ASSERT(k >= lowSubband); +- +- if (useLP) useAliasReduction[k - lowSubband] = !sinePresentFlag; +- +- pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f); +- pNrgs->nrgSine_e[c] = 0; +- +- calcSubbandGain(refNrg, refNrg_e, pNrgs, c, tmpNoise, tmpNoise_e, +- sinePresentFlag, i >= sineMapped[c], noNoiseFlag); +- +- c++; +- } +- } +- } else { +- for (j = 0; j < noSubFrameBands[freq_res]; j++) { +- FIXP_DBL refNrg = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pIenv) & MASK_M)); +- SCHAR refNrg_e = (SCHAR)((LONG)(*pIenv) & MASK_E) - NRG_EXP_OFFSET; +- +- UCHAR sinePresentFlag = 0; +- int li = table[j]; +- int ui = table[j + 1]; +- +- for (k = li; k < ui; k++) { +- sinePresentFlag |= (i >= sineMapped[cc]); +- cc++; +- } +- +- for (k = li; k < ui; k++) { +- if (k >= *pUiNoise) { +- tmpNoise = +- FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); +- tmpNoise_e = +- (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; +- +- pUiNoise++; +- } +- +- FDK_ASSERT(k >= lowSubband); +- +- if (useLP) useAliasReduction[k - lowSubband] = !sinePresentFlag; +- +- pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f); +- pNrgs->nrgSine_e[c] = 0; +- +- calcSubbandGain(refNrg, refNrg_e, pNrgs, c, tmpNoise, tmpNoise_e, +- sinePresentFlag, i >= sineMapped[c], noNoiseFlag); +- +- pNrgs->nrgRef[c] = refNrg; +- pNrgs->nrgRef_e[c] = refNrg_e; +- +- c++; +- } +- pIenv++; +- } +- } +- } +- +- /* +- Noise limiting +- */ +- +- for (c = 0; c < hFreq->noLimiterBands; c++) { +- FIXP_DBL sumRef, boostGain, maxGain; +- FIXP_DBL accu = FL2FXCONST_DBL(0.0f); +- SCHAR sumRef_e, boostGain_e, maxGain_e, accu_e = 0; +- int maxGainLimGainSum_e = 0; +- +- calcAvgGain(pNrgs, hFreq->limiterBandTable[c], +- hFreq->limiterBandTable[c + 1], &sumRef, &sumRef_e, &maxGain, +- &maxGain_e); +- +- /* Multiply maxGain with limiterGain: */ +- maxGain = fMult( +- maxGain, +- FDK_sbrDecoder_sbr_limGains_m[hHeaderData->bs_data.limiterGains]); +- /* maxGain_e += +- * FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains]; */ +- /* The addition of maxGain_e and FDK_sbrDecoder_sbr_limGains_e[3] might +- yield values greater than 127 which doesn't fit into an SCHAR! In these +- rare situations limit maxGain_e to 127. +- */ +- maxGainLimGainSum_e = +- maxGain_e + +- FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains]; +- maxGain_e = +- (maxGainLimGainSum_e > 127) ? (SCHAR)127 : (SCHAR)maxGainLimGainSum_e; +- +- /* Scale mantissa of MaxGain into range between 0.5 and 1: */ +- if (maxGain == FL2FXCONST_DBL(0.0f)) +- maxGain_e = -FRACT_BITS; +- else { +- SCHAR charTemp = CountLeadingBits(maxGain); +- maxGain_e -= charTemp; +- maxGain <<= (int)charTemp; +- } +- +- if (maxGain_e >= maxGainLimit_e) { /* upper limit (e.g. 96 dB) */ +- maxGain = FL2FXCONST_DBL(0.5f); +- maxGain_e = maxGainLimit_e; +- } +- +- /* Every subband gain is compared to the scaled "average gain" +- and limited if necessary: */ +- for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; +- k++) { +- if ((pNrgs->nrgGain_e[k] > maxGain_e) || +- (pNrgs->nrgGain_e[k] == maxGain_e && pNrgs->nrgGain[k] > maxGain)) { +- FIXP_DBL noiseAmp; +- SCHAR noiseAmp_e; +- +- FDK_divide_MantExp(maxGain, maxGain_e, pNrgs->nrgGain[k], +- pNrgs->nrgGain_e[k], &noiseAmp, &noiseAmp_e); +- pNrgs->noiseLevel[k] = fMult(pNrgs->noiseLevel[k], noiseAmp); +- pNrgs->noiseLevel_e[k] += noiseAmp_e; +- pNrgs->nrgGain[k] = maxGain; +- pNrgs->nrgGain_e[k] = maxGain_e; +- } +- } +- +- /* -- Boost gain +- Calculate and apply boost factor for each limiter band: +- 1. Check how much energy would be present when using the limited gain +- 2. Calculate boost factor by comparison with reference energy +- 3. Apply boost factor to compensate for the energy loss due to limiting +- */ +- for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; +- k++) { +- /* 1.a Add energy of adjusted signal (using preliminary gain) */ +- FIXP_DBL tmp = fMult(pNrgs->nrgGain[k], pNrgs->nrgEst[k]); +- SCHAR tmp_e = pNrgs->nrgGain_e[k] + pNrgs->nrgEst_e[k]; +- FDK_add_MantExp(tmp, tmp_e, accu, accu_e, &accu, &accu_e); +- +- /* 1.b Add sine energy (if present) */ +- if (pNrgs->nrgSine[k] != FL2FXCONST_DBL(0.0f)) { +- FDK_add_MantExp(pNrgs->nrgSine[k], pNrgs->nrgSine_e[k], accu, accu_e, +- &accu, &accu_e); +- } else { +- /* 1.c Add noise energy (if present) */ +- if (noNoiseFlag == 0) { +- FDK_add_MantExp(pNrgs->noiseLevel[k], pNrgs->noiseLevel_e[k], accu, +- accu_e, &accu, &accu_e); +- } +- } +- } +- +- /* 2.a Calculate ratio of wanted energy and accumulated energy */ +- if (accu == (FIXP_DBL)0) { /* If divisor is 0, limit quotient to +4 dB */ +- boostGain = FL2FXCONST_DBL(0.6279716f); +- boostGain_e = 2; +- } else { +- INT div_e; +- boostGain = fDivNorm(sumRef, accu, &div_e); +- boostGain_e = sumRef_e - accu_e + div_e; +- } +- +- /* 2.b Result too high? --> Limit the boost factor to +4 dB */ +- if ((boostGain_e > 3) || +- (boostGain_e == 2 && boostGain > FL2FXCONST_DBL(0.6279716f)) || +- (boostGain_e == 3 && boostGain > FL2FXCONST_DBL(0.3139858f))) { +- boostGain = FL2FXCONST_DBL(0.6279716f); +- boostGain_e = 2; +- } +- /* 3. Multiply all signal components with the boost factor */ +- for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; +- k++) { +- pNrgs->nrgGain[k] = fMultDiv2(pNrgs->nrgGain[k], boostGain); +- pNrgs->nrgGain_e[k] = pNrgs->nrgGain_e[k] + boostGain_e + 1; +- +- pNrgs->nrgSine[k] = fMultDiv2(pNrgs->nrgSine[k], boostGain); +- pNrgs->nrgSine_e[k] = pNrgs->nrgSine_e[k] + boostGain_e + 1; +- +- pNrgs->noiseLevel[k] = fMultDiv2(pNrgs->noiseLevel[k], boostGain); +- pNrgs->noiseLevel_e[k] = pNrgs->noiseLevel_e[k] + boostGain_e + 1; +- } +- } +- /* End of noise limiting */ +- +- if (useLP) +- aliasingReduction(degreeAlias + lowSubband, pNrgs, useAliasReduction, +- noSubbands); +- +- /* For the timeslots within the range for the output frame, +- use the same scale for the noise levels. +- Drawback: If the envelope exceeds the frame border, the noise levels +- will have to be rescaled later to fit final_e of +- the gain-values. +- */ +- noise_e = (start_pos < no_cols) ? adj_e : final_e; +- +- /* +- Convert energies to amplitude levels +- */ +- for (k = 0; k < noSubbands; k++) { +- FDK_sqrt_MantExp(&pNrgs->nrgSine[k], &pNrgs->nrgSine_e[k], &noise_e); +- FDK_sqrt_MantExp(&pNrgs->nrgGain[k], &pNrgs->nrgGain_e[k], +- &pNrgs->nrgGain_e[k]); +- FDK_sqrt_MantExp(&pNrgs->noiseLevel[k], &pNrgs->noiseLevel_e[k], +- &noise_e); +- } +- +- /* +- Apply calculated gains and adaptive noise +- */ +- +- /* assembleHfSignals() */ +- { +- int scale_change, sc_change; +- FIXP_SGL smooth_ratio; +- int filtBufferNoiseShift = 0; +- +- /* Initialize smoothing buffers with the first valid values */ +- if (h_sbr_cal_env->startUp) { +- if (!useLP) { +- h_sbr_cal_env->filtBufferNoise_e = noise_e; +- +- FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, +- noSubbands * sizeof(SCHAR)); +- FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, +- noSubbands * sizeof(FIXP_DBL)); +- FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, +- noSubbands * sizeof(FIXP_DBL)); +- } +- h_sbr_cal_env->startUp = 0; +- } +- +- if (!useLP) { +- equalizeFiltBufferExp(h_sbr_cal_env->filtBuffer, /* buffered */ +- h_sbr_cal_env->filtBuffer_e, /* buffered */ +- pNrgs->nrgGain, /* current */ +- pNrgs->nrgGain_e, /* current */ +- noSubbands); +- +- /* Adapt exponent of buffered noise levels to the current exponent +- so they can easily be smoothed */ +- if ((h_sbr_cal_env->filtBufferNoise_e - noise_e) >= 0) { +- int shift = fixMin(DFRACT_BITS - 1, +- (int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); +- for (k = 0; k < noSubbands; k++) +- h_sbr_cal_env->filtBufferNoise[k] <<= shift; +- } else { +- int shift = +- fixMin(DFRACT_BITS - 1, +- -(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); +- for (k = 0; k < noSubbands; k++) +- h_sbr_cal_env->filtBufferNoise[k] >>= shift; +- } +- +- h_sbr_cal_env->filtBufferNoise_e = noise_e; +- } +- +- /* find best scaling! */ +- scale_change = -(DFRACT_BITS - 1); +- for (k = 0; k < noSubbands; k++) { +- scale_change = fixMax(scale_change, (int)pNrgs->nrgGain_e[k]); +- } +- sc_change = (start_pos < no_cols) ? adj_e - input_e : final_e - input_e; +- +- if ((scale_change - sc_change + 1) < 0) +- scale_change -= (scale_change - sc_change + 1); +- +- scale_change = (scale_change - sc_change) + 1; +- +- for (k = 0; k < noSubbands; k++) { +- int sc = scale_change - pNrgs->nrgGain_e[k] + (sc_change - 1); +- pNrgs->nrgGain[k] >>= sc; +- pNrgs->nrgGain_e[k] += sc; +- } +- +- if (!useLP) { +- for (k = 0; k < noSubbands; k++) { +- int sc = +- scale_change - h_sbr_cal_env->filtBuffer_e[k] + (sc_change - 1); +- h_sbr_cal_env->filtBuffer[k] >>= sc; +- } +- } +- +- for (j = start_pos; j < stop_pos; j++) { +- /* This timeslot is located within the first part of the processing +- buffer and will be fed into the QMF-synthesis for the current frame. +- adj_e - input_e +- This timeslot will not yet be fed into the QMF so we do not care +- about the adj_e. +- sc_change = final_e - input_e +- */ +- if ((j == no_cols) && (start_pos < no_cols)) { +- int shift = (int)(noise_e - final_e); +- if (!useLP) +- filtBufferNoiseShift = shift; /* shifting of +- h_sbr_cal_env->filtBufferNoise[k] +- will be applied in function +- adjustTimeSlotHQ() */ +- if (shift >= 0) { +- shift = fixMin(DFRACT_BITS - 1, shift); +- for (k = 0; k < noSubbands; k++) { +- pNrgs->nrgSine[k] <<= shift; +- pNrgs->noiseLevel[k] <<= shift; +- /* +- if (!useLP) +- h_sbr_cal_env->filtBufferNoise[k] <<= shift; +- */ +- } +- } else { +- shift = fixMin(DFRACT_BITS - 1, -shift); +- for (k = 0; k < noSubbands; k++) { +- pNrgs->nrgSine[k] >>= shift; +- pNrgs->noiseLevel[k] >>= shift; +- /* +- if (!useLP) +- h_sbr_cal_env->filtBufferNoise[k] >>= shift; +- */ +- } +- } +- +- /* update noise scaling */ +- noise_e = final_e; +- if (!useLP) +- h_sbr_cal_env->filtBufferNoise_e = +- noise_e; /* scaling value unused! */ +- +- /* update gain buffer*/ +- sc_change -= (final_e - input_e); +- +- if (sc_change < 0) { +- for (k = 0; k < noSubbands; k++) { +- pNrgs->nrgGain[k] >>= -sc_change; +- pNrgs->nrgGain_e[k] += -sc_change; +- } +- if (!useLP) { +- for (k = 0; k < noSubbands; k++) { +- h_sbr_cal_env->filtBuffer[k] >>= -sc_change; +- } +- } +- } else { +- scale_change += sc_change; +- } +- +- } /* if */ +- +- if (!useLP) { +- /* Prevent the smoothing filter from running on constant levels */ +- if (j - start_pos < smooth_length) +- smooth_ratio = FDK_sbrDecoder_sbr_smoothFilter[j - start_pos]; +- else +- smooth_ratio = FL2FXCONST_SGL(0.0f); +- +- if (iTES_enable) { +- /* adjustTimeSlotHQ() without adding of additional harmonics */ +- adjustTimeSlotHQ_GainAndNoise( +- &analysBufferReal[j][lowSubband], +- &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs, +- lowSubband, noSubbands, fMin(scale_change, DFRACT_BITS - 1), +- smooth_ratio, noNoiseFlag, filtBufferNoiseShift); +- } else { +- adjustTimeSlotHQ(&analysBufferReal[j][lowSubband], +- &analysBufferImag[j][lowSubband], h_sbr_cal_env, +- pNrgs, lowSubband, noSubbands, +- fMin(scale_change, DFRACT_BITS - 1), smooth_ratio, +- noNoiseFlag, filtBufferNoiseShift); +- } +- } else { +- FDK_ASSERT(!iTES_enable); /* not supported */ +- if (flags & SBRDEC_ELD_GRID) { +- /* FDKmemset(analysBufferReal[j], 0, 64 * sizeof(FIXP_DBL)); */ +- adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], pNrgs, +- &h_sbr_cal_env->harmIndex, lowSubband, +- noSubbands, +- fMin(scale_change, DFRACT_BITS - 1), +- noNoiseFlag, &h_sbr_cal_env->phaseIndex, +- EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale); +- } else { +- adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs, +- &h_sbr_cal_env->harmIndex, lowSubband, noSubbands, +- fMin(scale_change, DFRACT_BITS - 1), noNoiseFlag, +- &h_sbr_cal_env->phaseIndex); +- } +- } +- /* In case the envelope spans accross the no_cols border both exponents +- * are needed. */ +- /* nrgGain_e[0...(noSubbands-1)] are equalized by +- * equalizeFiltBufferExp() */ +- pNrgs->exponent[(j < no_cols) ? 0 : 1] = +- (SCHAR)((15 - sbrScaleFactor->hb_scale) + pNrgs->nrgGain_e[0] + 1 - +- scale_change); +- } /* for */ +- +- if (iTES_enable) { +- apply_inter_tes( +- analysBufferReal, /* pABufR, */ +- analysBufferImag, /* pABufI, */ +- sbrScaleFactor, pNrgs->exponent, hHeaderData->timeStep, start_pos, +- stop_pos, lowSubband, noSubbands, +- hFrameData +- ->interTempShapeMode[i] /* frameData->interTempShapeMode[env] */ +- ); +- +- /* add additional harmonics */ +- for (j = start_pos; j < stop_pos; j++) { +- /* match exponent of additional harmonics to scale change of QMF data +- * caused by apply_inter_tes() */ +- scale_change = 0; +- +- if ((start_pos <= no_cols) && (stop_pos > no_cols)) { +- /* Scaling of analysBuffers was potentially changed within this +- envelope. The pNrgs->nrgSine_e match the second part of the +- envelope. For (j<=no_cols) the exponent of the sine energies has +- to be adapted. */ +- scale_change = pNrgs->exponent[1] - pNrgs->exponent[0]; +- } +- +- adjustTimeSlotHQ_AddHarmonics( +- &analysBufferReal[j][lowSubband], +- &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs, +- lowSubband, noSubbands, +- -iTES_scale_change + ((j < no_cols) ? scale_change : 0)); +- } +- } +- +- if (!useLP) { +- /* Update time-smoothing-buffers for gains and noise levels +- The gains and the noise values of the current envelope are copied +- into the buffer. This has to be done at the end of each envelope as +- the values are required for a smooth transition to the next envelope. +- */ +- FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, +- noSubbands * sizeof(FIXP_DBL)); +- FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, +- noSubbands * sizeof(SCHAR)); +- FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, +- noSubbands * sizeof(FIXP_DBL)); +- } +- } +- C_ALLOC_SCRATCH_END(pNrgs, ENV_CALC_NRGS, 1); +- } +- +- /* adapt adj_e to the scale change caused by apply_inter_tes() */ +- adj_e += iTES_scale_change; +- +- /* Rescale output samples */ +- { +- FIXP_DBL maxVal; +- int ov_reserve, reserve; +- +- /* Determine headroom in old adjusted samples */ +- maxVal = +- maxSubbandSample(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- lowSubband, ov_highSubband, 0, first_start); +- +- ov_reserve = fNorm(maxVal); +- +- /* Determine headroom in new adjusted samples */ +- maxVal = +- maxSubbandSample(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- lowSubband, highSubband, first_start, no_cols); +- +- reserve = fNorm(maxVal); +- +- /* Determine common output exponent */ +- output_e = fMax(ov_adj_e - ov_reserve, adj_e - reserve); +- +- /* Rescale old samples */ +- rescaleSubbandSamples(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- lowSubband, ov_highSubband, 0, first_start, +- ov_adj_e - output_e); +- +- /* Rescale new samples */ +- rescaleSubbandSamples(analysBufferReal, (useLP) ? NULL : analysBufferImag, +- lowSubband, highSubband, first_start, no_cols, +- adj_e - output_e); +- } +- +- /* Update hb_scale */ +- sbrScaleFactor->hb_scale = EXP2SCALE(output_e); +- +- /* Save the current final exponent for the next frame: */ +- /* adapt final_e to the scale change caused by apply_inter_tes() */ +- sbrScaleFactor->ov_hb_scale = EXP2SCALE(final_e + iTES_scale_change); +- +- /* We need to remember to the next frame that the transient +- will occur in the first envelope (if tranEnv == nEnvelopes). */ +- if (hFrameData->frameInfo.tranEnv == hFrameData->frameInfo.nEnvelopes) +- h_sbr_cal_env->prevTranEnv = 0; +- else +- h_sbr_cal_env->prevTranEnv = -1; +- +- if (pvc_mode > 0) { +- /* Not more than just the last noise envelope reaches into the next PVC +- frame! This should be true because bs_noise_position is <= 15 */ +- FDK_ASSERT(hFrameData->frameInfo +- .bordersNoise[hFrameData->frameInfo.nNoiseEnvelopes - 1] < +- PVC_NTIMESLOT); +- if (hFrameData->frameInfo +- .bordersNoise[hFrameData->frameInfo.nNoiseEnvelopes] > +- PVC_NTIMESLOT) { +- FDK_ASSERT(noiseLevels == +- (hFrameData->sbrNoiseFloorLevel + +- (hFrameData->frameInfo.nNoiseEnvelopes - 1) * noNoiseBands)); +- h_sbr_cal_env->prevNNfb = noNoiseBands; +- +- h_sbr_cal_env->prevNSfb[0] = noSubFrameBands[0]; +- h_sbr_cal_env->prevNSfb[1] = noSubFrameBands[1]; +- +- h_sbr_cal_env->prevLoSubband = lowSubband; +- h_sbr_cal_env->prevHiSubband = highSubband; +- h_sbr_cal_env->prev_ov_highSubband = ov_highSubband; +- +- FDKmemcpy(h_sbr_cal_env->prevFreqBandTableLo, pFreqBandTable[0], +- noSubFrameBands[0] + 1); +- FDKmemcpy(h_sbr_cal_env->prevFreqBandTableHi, pFreqBandTable[1], +- noSubFrameBands[1] + 1); +- FDKmemcpy(h_sbr_cal_env->prevFreqBandTableNoise, +- hFreq->freqBandTableNoise, sizeof(hFreq->freqBandTableNoise)); +- +- FDKmemcpy(h_sbr_cal_env->prevSbrNoiseFloorLevel, noiseLevels, +- MAX_NOISE_COEFFS * sizeof(FIXP_SGL)); +- } +- } +- +- C_ALLOC_SCRATCH_END(useAliasReduction, UCHAR, 64) +-} +- +-/*! +- \brief Create envelope instance +- +- Must be called once for each channel before calculateSbrEnvelope() can be +- used. +- +- \return errorCode, 0 if successful +-*/ +-SBR_ERROR +-createSbrEnvelopeCalc( +- HANDLE_SBR_CALCULATE_ENVELOPE hs, /*!< pointer to envelope instance */ +- HANDLE_SBR_HEADER_DATA +- hHeaderData, /*!< static SBR control data, initialized with defaults */ +- const int chan, /*!< Channel for which to assign buffers */ +- const UINT flags) { +- SBR_ERROR err = SBRDEC_OK; +- int i; +- +- /* Clear previous missing harmonics flags */ +- for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) { +- hs->harmFlagsPrev[i] = 0; +- hs->harmFlagsPrevActive[i] = 0; +- } +- hs->harmIndex = 0; +- +- FDKmemclear(hs->prevSbrNoiseFloorLevel, sizeof(hs->prevSbrNoiseFloorLevel)); +- hs->prevNNfb = 0; +- FDKmemclear(hs->prevFreqBandTableNoise, sizeof(hs->prevFreqBandTableNoise)); +- hs->sinusoidal_positionPrev = 0; +- +- /* +- Setup pointers for time smoothing. +- The buffer itself will be initialized later triggered by the startUp-flag. +- */ +- hs->prevTranEnv = -1; +- +- /* initialization */ +- resetSbrEnvelopeCalc(hs); +- +- if (chan == 0) { /* do this only once */ +- err = resetFreqBandTables(hHeaderData, flags); +- } +- +- return err; +-} +- +-/*! +- \brief Create envelope instance +- +- Must be called once for each channel before calculateSbrEnvelope() can be +- used. +- +- \return errorCode, 0 if successful +-*/ +-int deleteSbrEnvelopeCalc(HANDLE_SBR_CALCULATE_ENVELOPE hs) { return 0; } +- +-/*! +- \brief Reset envelope instance +- +- This function must be called for each channel on a change of configuration. +- Note that resetFreqBandTables should also be called in this case. +- +- \return errorCode, 0 if successful +-*/ +-void resetSbrEnvelopeCalc( +- HANDLE_SBR_CALCULATE_ENVELOPE hCalEnv) /*!< pointer to envelope instance */ +-{ +- hCalEnv->phaseIndex = 0; +- +- /* Noise exponent needs to be reset because the output exponent for the next +- * frame depends on it */ +- hCalEnv->filtBufferNoise_e = 0; +- +- hCalEnv->startUp = 1; +-} +- +-/*! +- \brief Equalize exponents of the buffered gain values and the new ones +- +- After equalization of exponents, the FIR-filter addition for smoothing +- can be performed. +- This function is called once for each envelope before adjusting. +-*/ +-static void equalizeFiltBufferExp( +- FIXP_DBL *filtBuffer, /*!< bufferd gains */ +- SCHAR *filtBuffer_e, /*!< exponents of bufferd gains */ +- FIXP_DBL *nrgGain, /*!< gains for current envelope */ +- SCHAR *nrgGain_e, /*!< exponents of gains for current envelope */ +- int subbands) /*!< Number of QMF subbands */ +-{ +- int band; +- int diff; +- +- for (band = 0; band < subbands; band++) { +- diff = (int)(nrgGain_e[band] - filtBuffer_e[band]); +- if (diff > 0) { +- filtBuffer[band] >>= +- diff; /* Compensate for the scale change by shifting the mantissa. */ +- filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */ +- } else if (diff < 0) { +- /* The buffered gains seem to be larger, but maybe there +- are some unused bits left in the mantissa */ +- +- int reserve = CntLeadingZeros(fixp_abs(filtBuffer[band])) - 1; +- +- if ((-diff) <= reserve) { +- /* There is enough space in the buffered mantissa so +- that we can take the new exponent as common. +- */ +- filtBuffer[band] <<= (-diff); +- filtBuffer_e[band] += diff; /* becomes equal to *ptrNewExp */ +- } else { +- filtBuffer[band] <<= +- reserve; /* Shift the mantissa as far as possible: */ +- filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */ +- +- /* For the remaining difference, change the new gain value */ +- diff = fixMin(-(reserve + diff), DFRACT_BITS - 1); +- nrgGain[band] >>= diff; +- nrgGain_e[band] += diff; +- } +- } +- } +-} +- +-/*! +- \brief Shift left the mantissas of all subband samples +- in the giventime and frequency range by the specified number of bits. +- +- This function is used to rescale the audio data in the overlap buffer +- which has already been envelope adjusted with the last frame. +-*/ +-void rescaleSubbandSamples( +- FIXP_DBL **re, /*!< Real part of input and output subband samples */ +- FIXP_DBL **im, /*!< Imaginary part of input and output subband samples */ +- int lowSubband, /*!< Begin of frequency range to process */ +- int highSubband, /*!< End of frequency range to process */ +- int start_pos, /*!< Begin of time rage (QMF-timeslot) */ +- int next_pos, /*!< End of time rage (QMF-timeslot) */ +- int shift) /*!< number of bits to shift */ +-{ +- int width = highSubband - lowSubband; +- +- if ((width > 0) && (shift != 0)) { +- if (im != NULL) { +- for (int l = start_pos; l < next_pos; l++) { +- scaleValues(&re[l][lowSubband], width, shift); +- scaleValues(&im[l][lowSubband], width, shift); +- } +- } else { +- for (int l = start_pos; l < next_pos; l++) { +- scaleValues(&re[l][lowSubband], width, shift); +- } +- } +- } +-} +- +-static inline FIXP_DBL FDK_get_maxval_real(FIXP_DBL maxVal, FIXP_DBL *reTmp, +- INT width) { +- maxVal = (FIXP_DBL)0; +- while (width-- != 0) { +- FIXP_DBL tmp = *(reTmp++); +- maxVal |= (FIXP_DBL)((LONG)(tmp) ^ ((LONG)tmp >> (DFRACT_BITS - 1))); +- } +- +- return maxVal; +-} +- +-/*! +- \brief Determine headroom for shifting +- +- Determine by how much the spectrum can be shifted left +- for better accuracy in later processing. +- +- \return Number of free bits in the biggest spectral value +-*/ +- +-FIXP_DBL maxSubbandSample( +- FIXP_DBL **re, /*!< Real part of input and output subband samples */ +- FIXP_DBL **im, /*!< Real part of input and output subband samples */ +- int lowSubband, /*!< Begin of frequency range to process */ +- int highSubband, /*!< Number of QMF bands to process */ +- int start_pos, /*!< Begin of time rage (QMF-timeslot) */ +- int next_pos /*!< End of time rage (QMF-timeslot) */ +-) { +- FIXP_DBL maxVal = FL2FX_DBL(0.0f); +- unsigned int width = highSubband - lowSubband; +- +- FDK_ASSERT(width <= (64)); +- +- if (width > 0) { +- if (im != NULL) { +- for (int l = start_pos; l < next_pos; l++) { +- int k = width; +- FIXP_DBL *reTmp = &re[l][lowSubband]; +- FIXP_DBL *imTmp = &im[l][lowSubband]; +- do { +- FIXP_DBL tmp1 = *(reTmp++); +- FIXP_DBL tmp2 = *(imTmp++); +- maxVal |= +- (FIXP_DBL)((LONG)(tmp1) ^ ((LONG)tmp1 >> (DFRACT_BITS - 1))); +- maxVal |= +- (FIXP_DBL)((LONG)(tmp2) ^ ((LONG)tmp2 >> (DFRACT_BITS - 1))); +- } while (--k != 0); +- } +- } else { +- for (int l = start_pos; l < next_pos; l++) { +- maxVal |= FDK_get_maxval_real(maxVal, &re[l][lowSubband], width); +- } +- } +- } +- +- if (maxVal > (FIXP_DBL)0) { +- /* For negative input values, maxVal is too small by 1. Add 1 only when +- * necessary: if maxVal is a power of 2 */ +- FIXP_DBL lowerPow2 = +- (FIXP_DBL)(1 << (DFRACT_BITS - 1 - CntLeadingZeros(maxVal))); +- if (maxVal == lowerPow2) maxVal += (FIXP_DBL)1; +- } +- +- return (maxVal); +-} +- +-/* #define SHIFT_BEFORE_SQUARE (3) */ /* (7/2) */ +-/* Avoid assertion failures triggerd by overflows which occured in robustness +- tests. Setting the SHIFT_BEFORE_SQUARE to 4 has negligible effect on (USAC) +- conformance results. */ +-#define SHIFT_BEFORE_SQUARE (4) /* ((8 - 0) / 2) */ +- +-/*!< +- If the accumulator does not provide enough overflow bits or +- does not provide a high dynamic range, the below energy calculation +- requires an additional shift operation for each sample. +- On the other hand, doing the shift allows using a single-precision +- multiplication for the square (at least 16bit x 16bit). +- For even values of OVRFLW_BITS (0, 2, 4, 6), saturated arithmetic +- is required for the energy accumulation. +- Theoretically, the sample-squares can sum up to a value of 76, +- requiring 7 overflow bits. However since such situations are *very* +- rare, accu can be limited to 64. +- In case native saturated arithmetic is not available, overflows +- can be prevented by replacing the above #define by +- #define SHIFT_BEFORE_SQUARE ((8 - OVRFLW_BITS) / 2) +- which will result in slightly reduced accuracy. +-*/ +- +-/*! +- \brief Estimates the mean energy of each filter-bank channel for the +- duration of the current envelope +- +- This function is used when interpolFreq is true. +-*/ +-static void calcNrgPerSubband( +- FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ +- FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ +- int lowSubband, /*!< Begin of the SBR frequency range */ +- int highSubband, /*!< High end of the SBR frequency range */ +- int start_pos, /*!< First QMF-slot of current envelope */ +- int next_pos, /*!< Last QMF-slot of current envelope + 1 */ +- SCHAR frameExp, /*!< Common exponent for all input samples */ +- FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ +- SCHAR *nrgEst_e) /*!< Exponent of resulting Energy */ +-{ +- FIXP_SGL invWidth; +- SCHAR preShift; +- SCHAR shift; +- FIXP_DBL sum; +- int k; +- +- /* Divide by width of envelope later: */ +- invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); +- /* The common exponent needs to be doubled because all mantissas are squared: +- */ +- frameExp = frameExp << 1; +- +- for (k = lowSubband; k < highSubband; k++) { +- FIXP_DBL bufferReal[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL bufferImag[(((1024) / (32) * (4) / 2) + (3 * (4)))]; +- FIXP_DBL maxVal; +- +- if (analysBufferImag != NULL) { +- int l; +- maxVal = FL2FX_DBL(0.0f); +- for (l = start_pos; l < next_pos; l++) { +- bufferImag[l] = analysBufferImag[l][k]; +- maxVal |= (FIXP_DBL)((LONG)(bufferImag[l]) ^ +- ((LONG)bufferImag[l] >> (DFRACT_BITS - 1))); +- bufferReal[l] = analysBufferReal[l][k]; +- maxVal |= (FIXP_DBL)((LONG)(bufferReal[l]) ^ +- ((LONG)bufferReal[l] >> (DFRACT_BITS - 1))); +- } +- } else { +- int l; +- maxVal = FL2FX_DBL(0.0f); +- for (l = start_pos; l < next_pos; l++) { +- bufferReal[l] = analysBufferReal[l][k]; +- maxVal |= (FIXP_DBL)((LONG)(bufferReal[l]) ^ +- ((LONG)bufferReal[l] >> (DFRACT_BITS - 1))); +- } +- } +- +- if (maxVal != FL2FXCONST_DBL(0.f)) { +- /* If the accu does not provide enough overflow bits, we cannot +- shift the samples up to the limit. +- Instead, keep up to 3 free bits in each sample, i.e. up to +- 6 bits after calculation of square. +- Please note the comment on saturated arithmetic above! +- */ +- FIXP_DBL accu; +- preShift = CntLeadingZeros(maxVal) - 1; +- preShift -= SHIFT_BEFORE_SQUARE; +- +- /* Limit preShift to a maximum value to prevent accumulator overflow in +- exceptional situations where the signal in the analysis-buffer is very +- small (small maxVal). +- */ +- preShift = fMin(preShift, (SCHAR)25); +- +- accu = FL2FXCONST_DBL(0.0f); +- if (preShift >= 0) { +- int l; +- if (analysBufferImag != NULL) { +- for (l = start_pos; l < next_pos; l++) { +- FIXP_DBL temp1 = bufferReal[l] << (int)preShift; +- FIXP_DBL temp2 = bufferImag[l] << (int)preShift; +- accu = fPow2AddDiv2(accu, temp1); +- accu = fPow2AddDiv2(accu, temp2); +- } +- } else { +- for (l = start_pos; l < next_pos; l++) { +- FIXP_DBL temp = bufferReal[l] << (int)preShift; +- accu = fPow2AddDiv2(accu, temp); +- } +- } +- } else { /* if negative shift value */ +- int l; +- int negpreShift = -preShift; +- if (analysBufferImag != NULL) { +- for (l = start_pos; l < next_pos; l++) { +- FIXP_DBL temp1 = bufferReal[l] >> (int)negpreShift; +- FIXP_DBL temp2 = bufferImag[l] >> (int)negpreShift; +- accu = fPow2AddDiv2(accu, temp1); +- accu = fPow2AddDiv2(accu, temp2); +- } +- } else { +- for (l = start_pos; l < next_pos; l++) { +- FIXP_DBL temp = bufferReal[l] >> (int)negpreShift; +- accu = fPow2AddDiv2(accu, temp); +- } +- } +- } +- accu <<= 1; +- +- /* Convert double precision to Mantissa/Exponent: */ +- shift = fNorm(accu); +- sum = accu << (int)shift; +- +- /* Divide by width of envelope and apply frame scale: */ +- *nrgEst++ = fMult(sum, invWidth); +- shift += 2 * preShift; +- if (analysBufferImag != NULL) +- *nrgEst_e++ = frameExp - shift; +- else +- *nrgEst_e++ = frameExp - shift + 1; /* +1 due to missing imag. part */ +- } /* maxVal!=0 */ +- else { +- /* Prevent a zero-mantissa-number from being misinterpreted +- due to its exponent. */ +- *nrgEst++ = FL2FXCONST_DBL(0.0f); +- *nrgEst_e++ = 0; +- } +- } +-} +- +-/*! +- \brief Estimates the mean energy of each Scale factor band for the +- duration of the current envelope. +- +- This function is used when interpolFreq is false. +-*/ +-static void calcNrgPerSfb( +- FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ +- FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ +- int nSfb, /*!< Number of scale factor bands */ +- UCHAR *freqBandTable, /*!< First Subband for each Sfb */ +- int start_pos, /*!< First QMF-slot of current envelope */ +- int next_pos, /*!< Last QMF-slot of current envelope + 1 */ +- SCHAR input_e, /*!< Common exponent for all input samples */ +- FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ +- SCHAR *nrgEst_e) /*!< Exponent of resulting Energy */ +-{ +- FIXP_SGL invWidth; +- FIXP_DBL temp; +- SCHAR preShift; +- SCHAR shift, sum_e; +- FIXP_DBL sum; +- +- int j, k, l, li, ui; +- FIXP_DBL sumAll, sumLine; /* Single precision would be sufficient, +- but overflow bits are required for accumulation */ +- +- /* Divide by width of envelope later: */ +- invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); +- /* The common exponent needs to be doubled because all mantissas are squared: +- */ +- input_e = input_e << 1; +- +- for (j = 0; j < nSfb; j++) { +- li = freqBandTable[j]; +- ui = freqBandTable[j + 1]; +- +- FIXP_DBL maxVal = maxSubbandSample(analysBufferReal, analysBufferImag, li, +- ui, start_pos, next_pos); +- +- if (maxVal != FL2FXCONST_DBL(0.f)) { +- preShift = CntLeadingZeros(maxVal) - 1; +- +- /* If the accu does not provide enough overflow bits, we cannot +- shift the samples up to the limit. +- Instead, keep up to 3 free bits in each sample, i.e. up to +- 6 bits after calculation of square. +- Please note the comment on saturated arithmetic above! +- */ +- preShift -= SHIFT_BEFORE_SQUARE; +- +- sumAll = FL2FXCONST_DBL(0.0f); +- +- for (k = li; k < ui; k++) { +- sumLine = FL2FXCONST_DBL(0.0f); +- +- if (analysBufferImag != NULL) { +- if (preShift >= 0) { +- for (l = start_pos; l < next_pos; l++) { +- temp = analysBufferReal[l][k] << (int)preShift; +- sumLine += fPow2Div2(temp); +- temp = analysBufferImag[l][k] << (int)preShift; +- sumLine += fPow2Div2(temp); +- } +- } else { +- for (l = start_pos; l < next_pos; l++) { +- temp = analysBufferReal[l][k] >> -(int)preShift; +- sumLine += fPow2Div2(temp); +- temp = analysBufferImag[l][k] >> -(int)preShift; +- sumLine += fPow2Div2(temp); +- } +- } +- } else { +- if (preShift >= 0) { +- for (l = start_pos; l < next_pos; l++) { +- temp = analysBufferReal[l][k] << (int)preShift; +- sumLine += fPow2Div2(temp); +- } +- } else { +- for (l = start_pos; l < next_pos; l++) { +- temp = analysBufferReal[l][k] >> -(int)preShift; +- sumLine += fPow2Div2(temp); +- } +- } +- } +- +- /* The number of QMF-channels per SBR bands may be up to 15. +- Shift right to avoid overflows in sum over all channels. */ +- sumLine = sumLine >> (4 - 1); +- sumAll += sumLine; +- } +- +- /* Convert double precision to Mantissa/Exponent: */ +- shift = fNorm(sumAll); +- sum = sumAll << (int)shift; +- +- /* Divide by width of envelope: */ +- sum = fMult(sum, invWidth); +- +- /* Divide by width of Sfb: */ +- sum = fMult(sum, FX_DBL2FX_SGL(GetInvInt(ui - li))); +- +- /* Set all Subband energies in the Sfb to the average energy: */ +- if (analysBufferImag != NULL) +- sum_e = input_e + 4 - shift; /* -4 to compensate right-shift */ +- else +- sum_e = input_e + 4 + 1 - +- shift; /* -4 to compensate right-shift; +1 due to missing +- imag. part */ +- +- sum_e -= 2 * preShift; +- } /* maxVal!=0 */ +- else { +- /* Prevent a zero-mantissa-number from being misinterpreted +- due to its exponent. */ +- sum = FL2FXCONST_DBL(0.0f); +- sum_e = 0; +- } +- +- for (k = li; k < ui; k++) { +- *nrgEst++ = sum; +- *nrgEst_e++ = sum_e; +- } +- } +-} +- +-/*! +- \brief Calculate gain, noise, and additional sine level for one subband. +- +- The resulting energy gain is given by mantissa and exponent. +-*/ +-static void calcSubbandGain( +- FIXP_DBL nrgRef, /*!< Reference Energy according to envelope data */ +- SCHAR +- nrgRef_e, /*!< Reference Energy according to envelope data (exponent) */ +- ENV_CALC_NRGS *nrgs, int i, FIXP_DBL tmpNoise, /*!< Relative noise level */ +- SCHAR tmpNoise_e, /*!< Relative noise level (exponent) */ +- UCHAR sinePresentFlag, /*!< Indicates if sine is present on band */ +- UCHAR sineMapped, /*!< Indicates if sine must be added */ +- int noNoiseFlag) /*!< Flag to suppress noise addition */ +-{ +- FIXP_DBL nrgEst = nrgs->nrgEst[i]; /*!< Energy in transposed signal */ +- SCHAR nrgEst_e = +- nrgs->nrgEst_e[i]; /*!< Energy in transposed signal (exponent) */ +- FIXP_DBL *ptrNrgGain = &nrgs->nrgGain[i]; /*!< Resulting energy gain */ +- SCHAR *ptrNrgGain_e = +- &nrgs->nrgGain_e[i]; /*!< Resulting energy gain (exponent) */ +- FIXP_DBL *ptrNoiseLevel = +- &nrgs->noiseLevel[i]; /*!< Resulting absolute noise energy */ +- SCHAR *ptrNoiseLevel_e = +- &nrgs->noiseLevel_e[i]; /*!< Resulting absolute noise energy (exponent) */ +- FIXP_DBL *ptrNrgSine = &nrgs->nrgSine[i]; /*!< Additional sine energy */ +- SCHAR *ptrNrgSine_e = +- &nrgs->nrgSine_e[i]; /*!< Additional sine energy (exponent) */ +- +- FIXP_DBL a, b, c; +- SCHAR a_e, b_e, c_e; +- +- /* +- This addition of 1 prevents divisions by zero in the reference code. +- For very small energies in nrgEst, it prevents the gains from becoming +- very high which could cause some trouble due to the smoothing. +- */ +- b_e = (int)(nrgEst_e - 1); +- if (b_e >= 0) { +- nrgEst = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e + 1, DFRACT_BITS - 1)) + +- (nrgEst >> 1); +- nrgEst_e += 1; /* shift by 1 bit to avoid overflow */ +- +- } else { +- nrgEst = (nrgEst >> (INT)(fixMin(-b_e + 1, DFRACT_BITS - 1))) + +- (FL2FXCONST_DBL(0.5f) >> 1); +- nrgEst_e = 2; /* shift by 1 bit to avoid overflow */ +- } +- +- /* A = NrgRef * TmpNoise */ +- a = fMult(nrgRef, tmpNoise); +- a_e = nrgRef_e + tmpNoise_e; +- +- /* B = 1 + TmpNoise */ +- b_e = (int)(tmpNoise_e - 1); +- if (b_e >= 0) { +- b = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e + 1, DFRACT_BITS - 1)) + +- (tmpNoise >> 1); +- b_e = tmpNoise_e + 1; /* shift by 1 bit to avoid overflow */ +- } else { +- b = (tmpNoise >> (INT)(fixMin(-b_e + 1, DFRACT_BITS - 1))) + +- (FL2FXCONST_DBL(0.5f) >> 1); +- b_e = 2; /* shift by 1 bit to avoid overflow */ +- } +- +- /* noiseLevel = A / B = (NrgRef * TmpNoise) / (1 + TmpNoise) */ +- FDK_divide_MantExp(a, a_e, b, b_e, ptrNoiseLevel, ptrNoiseLevel_e); +- +- if (sinePresentFlag) { +- /* C = (1 + TmpNoise) * NrgEst */ +- c = fMult(b, nrgEst); +- c_e = b_e + nrgEst_e; +- +- /* gain = A / C = (NrgRef * TmpNoise) / (1 + TmpNoise) * NrgEst */ +- FDK_divide_MantExp(a, a_e, c, c_e, ptrNrgGain, ptrNrgGain_e); +- +- if (sineMapped) { +- /* sineLevel = nrgRef/ (1 + TmpNoise) */ +- FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgSine, ptrNrgSine_e); +- } +- } else { +- if (noNoiseFlag) { +- /* B = NrgEst */ +- b = nrgEst; +- b_e = nrgEst_e; +- } else { +- /* B = NrgEst * (1 + TmpNoise) */ +- b = fMult(b, nrgEst); +- b_e = b_e + nrgEst_e; +- } +- +- /* gain = nrgRef / B */ +- FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e); +- } +-} +- +-/*! +- \brief Calculate "average gain" for the specified subband range. +- +- This is rather a gain of the average magnitude than the average +- of gains! +- The result is used as a relative limit for all gains within the +- current "limiter band" (a certain frequency range). +-*/ +-static void calcAvgGain( +- ENV_CALC_NRGS *nrgs, int lowSubband, /*!< Begin of the limiter band */ +- int highSubband, /*!< High end of the limiter band */ +- FIXP_DBL *ptrSumRef, SCHAR *ptrSumRef_e, +- FIXP_DBL *ptrAvgGain, /*!< Resulting overall gain (mantissa) */ +- SCHAR *ptrAvgGain_e) /*!< Resulting overall gain (exponent) */ +-{ +- FIXP_DBL *nrgRef = +- nrgs->nrgRef; /*!< Reference Energy according to envelope data */ +- SCHAR *nrgRef_e = +- nrgs->nrgRef_e; /*!< Reference Energy according to envelope data +- (exponent) */ +- FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< Energy in transposed signal */ +- SCHAR *nrgEst_e = +- nrgs->nrgEst_e; /*!< Energy in transposed signal (exponent) */ +- +- FIXP_DBL sumRef = 1; +- FIXP_DBL sumEst = 1; +- SCHAR sumRef_e = -FRACT_BITS; +- SCHAR sumEst_e = -FRACT_BITS; +- int k; +- +- for (k = lowSubband; k < highSubband; k++) { +- /* Add nrgRef[k] to sumRef: */ +- FDK_add_MantExp(sumRef, sumRef_e, nrgRef[k], nrgRef_e[k], &sumRef, +- &sumRef_e); +- +- /* Add nrgEst[k] to sumEst: */ +- FDK_add_MantExp(sumEst, sumEst_e, nrgEst[k], nrgEst_e[k], &sumEst, +- &sumEst_e); +- } +- +- FDK_divide_MantExp(sumRef, sumRef_e, sumEst, sumEst_e, ptrAvgGain, +- ptrAvgGain_e); +- +- *ptrSumRef = sumRef; +- *ptrSumRef_e = sumRef_e; +-} +- +-static void adjustTimeSlot_EldGrid( +- FIXP_DBL *RESTRICT +- ptrReal, /*!< Subband samples to be adjusted, real part */ +- ENV_CALC_NRGS *nrgs, UCHAR *ptrHarmIndex, /*!< Harmonic index */ +- int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ +- int noSubbands, /*!< Number of QMF subbands */ +- int scale_change, /*!< Number of bits to shift adjusted samples */ +- int noNoiseFlag, /*!< Flag to suppress noise addition */ +- int *ptrPhaseIndex, /*!< Start index to random number array */ +- int scale_diff_low) /*!< */ +- +-{ +- int k; +- FIXP_DBL signalReal, sbNoise; +- int tone_count = 0; +- +- FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */ +- FIXP_DBL *RESTRICT pNoiseLevel = +- nrgs->noiseLevel; /*!< Noise levels of current envelope */ +- FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ +- +- int phaseIndex = *ptrPhaseIndex; +- UCHAR harmIndex = *ptrHarmIndex; +- +- static const INT harmonicPhase[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; +- +- static const FIXP_DBL harmonicPhaseX[4][2] = { +- {FL2FXCONST_DBL(2.0 * 1.245183154539139e-001), +- FL2FXCONST_DBL(2.0 * 1.245183154539139e-001)}, +- {FL2FXCONST_DBL(2.0 * -1.123767859325028e-001), +- FL2FXCONST_DBL(2.0 * 1.123767859325028e-001)}, +- {FL2FXCONST_DBL(2.0 * -1.245183154539139e-001), +- FL2FXCONST_DBL(2.0 * -1.245183154539139e-001)}, +- {FL2FXCONST_DBL(2.0 * 1.123767859325028e-001), +- FL2FXCONST_DBL(2.0 * -1.123767859325028e-001)}}; +- +- const FIXP_DBL *p_harmonicPhaseX = &harmonicPhaseX[harmIndex][0]; +- const INT *p_harmonicPhase = &harmonicPhase[harmIndex][0]; +- +- *(ptrReal - 1) = fAddSaturate( +- *(ptrReal - 1), +- SATURATE_SHIFT(fMultDiv2(p_harmonicPhaseX[lowSubband & 1], pSineLevel[0]), +- scale_diff_low, DFRACT_BITS)); +- FIXP_DBL pSineLevel_prev = (FIXP_DBL)0; +- +- int idx_k = lowSubband & 1; +- +- for (k = 0; k < noSubbands; k++) { +- FIXP_DBL sineLevel_curr = *pSineLevel++; +- phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1); +- +- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); +- sbNoise = *pNoiseLevel++; +- if (((INT)sineLevel_curr | noNoiseFlag) == 0) { +- signalReal += +- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) +- << 4); +- } +- signalReal += sineLevel_curr * p_harmonicPhase[0]; +- signalReal = +- fMultAddDiv2(signalReal, pSineLevel_prev, p_harmonicPhaseX[idx_k]); +- pSineLevel_prev = sineLevel_curr; +- idx_k = !idx_k; +- if (k < noSubbands - 1) { +- signalReal = +- fMultAddDiv2(signalReal, pSineLevel[0], p_harmonicPhaseX[idx_k]); +- } else /* (k == noSubbands - 1) */ +- { +- if (k + lowSubband + 1 < 63) { +- *(ptrReal + 1) += fMultDiv2(pSineLevel_prev, p_harmonicPhaseX[idx_k]); +- } +- } +- *ptrReal++ = signalReal; +- +- if (pSineLevel_prev != FL2FXCONST_DBL(0.0f)) { +- if (++tone_count == 16) { +- k++; +- break; +- } +- } +- } +- /* Run again, if previous loop got breaked with tone_count = 16 */ +- for (; k < noSubbands; k++) { +- FIXP_DBL sineLevel_curr = *pSineLevel++; +- phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1); +- +- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); +- sbNoise = *pNoiseLevel++; +- if (((INT)sineLevel_curr | noNoiseFlag) == 0) { +- signalReal += +- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) +- << 4); +- } +- signalReal += sineLevel_curr * p_harmonicPhase[0]; +- *ptrReal++ = signalReal; +- } +- +- *ptrHarmIndex = (harmIndex + 1) & 3; +- *ptrPhaseIndex = phaseIndex & (SBR_NF_NO_RANDOM_VAL - 1); +-} +- +-/*! +- \brief Amplify one timeslot of the signal with the calculated gains +- and add the noisefloor. +-*/ +- +-static void adjustTimeSlotLC( +- FIXP_DBL *ptrReal, /*!< Subband samples to be adjusted, real part */ +- ENV_CALC_NRGS *nrgs, UCHAR *ptrHarmIndex, /*!< Harmonic index */ +- int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ +- int noSubbands, /*!< Number of QMF subbands */ +- int scale_change, /*!< Number of bits to shift adjusted samples */ +- int noNoiseFlag, /*!< Flag to suppress noise addition */ +- int *ptrPhaseIndex) /*!< Start index to random number array */ +-{ +- FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */ +- FIXP_DBL *pNoiseLevel = +- nrgs->noiseLevel; /*!< Noise levels of current envelope */ +- FIXP_DBL *pSineLevel = nrgs->nrgSine; /*!< Sine levels */ +- +- int k; +- int index = *ptrPhaseIndex; +- UCHAR harmIndex = *ptrHarmIndex; +- UCHAR freqInvFlag = (lowSubband & 1); +- FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev; +- int tone_count = 0; +- int sineSign = 1; +- +-#define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.00815f)) +-#define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.16773f)) +- +- /* +- First pass for k=0 pulled out of the loop: +- */ +- +- index = (index + 1) & (SBR_NF_NO_RANDOM_VAL - 1); +- +- /* +- The next multiplication constitutes the actual envelope adjustment +- of the signal and should be carried out with full accuracy +- (supplying #FRACT_BITS valid bits). +- */ +- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); +- sineLevel = *pSineLevel++; +- sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f); +- +- if (sineLevel != FL2FXCONST_DBL(0.0f)) +- tone_count++; +- else if (!noNoiseFlag) +- /* Add noisefloor to the amplified signal */ +- signalReal += +- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) +- << 4); +- +- { +- if (!(harmIndex & 0x1)) { +- /* harmIndex 0,2 */ +- signalReal += (harmIndex & 0x2) ? -sineLevel : sineLevel; +- *ptrReal++ = signalReal; +- } else { +- /* harmIndex 1,3 in combination with freqInvFlag */ +- int shift = (int)(scale_change + 1); +- shift = (shift >= 0) ? fixMin(DFRACT_BITS - 1, shift) +- : fixMax(-(DFRACT_BITS - 1), shift); +- +- FIXP_DBL tmp1 = (shift >= 0) ? (fMultDiv2(C1, sineLevel) >> shift) +- : (fMultDiv2(C1, sineLevel) << (-shift)); +- FIXP_DBL tmp2 = fMultDiv2(C1, sineLevelNext); +- +- /* save switch and compare operations and reduce to XOR statement */ +- if (((harmIndex >> 1) & 0x1) ^ freqInvFlag) { +- *(ptrReal - 1) += tmp1; +- signalReal -= tmp2; +- } else { +- *(ptrReal - 1) -= tmp1; +- signalReal += tmp2; +- } +- *ptrReal++ = signalReal; +- freqInvFlag = !freqInvFlag; +- } +- } +- +- pNoiseLevel++; +- +- if (noSubbands > 2) { +- if (!(harmIndex & 0x1)) { +- /* harmIndex 0,2 */ +- if (!harmIndex) { +- sineSign = 0; +- } +- +- for (k = noSubbands - 2; k != 0; k--) { +- FIXP_DBL sinelevel = *pSineLevel++; +- index++; +- if (((signalReal = (sineSign ? -sinelevel : sinelevel)) == +- FL2FXCONST_DBL(0.0f)) && +- !noNoiseFlag) { +- /* Add noisefloor to the amplified signal */ +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], +- pNoiseLevel[0]) +- << 4); +- } +- +- /* The next multiplication constitutes the actual envelope adjustment of +- * the signal. */ +- signalReal += fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); +- +- pNoiseLevel++; +- *ptrReal++ = signalReal; +- } /* for ... */ +- } else { +- /* harmIndex 1,3 in combination with freqInvFlag */ +- if (harmIndex == 1) freqInvFlag = !freqInvFlag; +- +- for (k = noSubbands - 2; k != 0; k--) { +- index++; +- /* The next multiplication constitutes the actual envelope adjustment of +- * the signal. */ +- signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); +- +- if (*pSineLevel++ != FL2FXCONST_DBL(0.0f)) +- tone_count++; +- else if (!noNoiseFlag) { +- /* Add noisefloor to the amplified signal */ +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], +- pNoiseLevel[0]) +- << 4); +- } +- +- pNoiseLevel++; +- +- if (tone_count <= 16) { +- FIXP_DBL addSine = fMultDiv2((pSineLevel[-2] - pSineLevel[0]), C1); +- signalReal += (freqInvFlag) ? (-addSine) : (addSine); +- } +- +- *ptrReal++ = signalReal; +- freqInvFlag = !freqInvFlag; +- } /* for ... */ +- } +- } +- +- if (noSubbands > -1) { +- index++; +- /* The next multiplication constitutes the actual envelope adjustment of the +- * signal. */ +- signalReal = fMultDiv2(*ptrReal, *pGain) << ((int)scale_change); +- sineLevelPrev = fMultDiv2(pSineLevel[-1], FL2FX_SGL(0.0163f)); +- sineLevel = pSineLevel[0]; +- +- if (pSineLevel[0] != FL2FXCONST_DBL(0.0f)) +- tone_count++; +- else if (!noNoiseFlag) { +- /* Add noisefloor to the amplified signal */ +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- signalReal = +- signalReal + +- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) +- << 4); +- } +- +- if (!(harmIndex & 0x1)) { +- /* harmIndex 0,2 */ +- *ptrReal = signalReal + ((sineSign) ? -sineLevel : sineLevel); +- } else { +- /* harmIndex 1,3 in combination with freqInvFlag */ +- if (tone_count <= 16) { +- if (freqInvFlag) { +- *ptrReal++ = signalReal - sineLevelPrev; +- if (noSubbands + lowSubband < 63) +- *ptrReal = *ptrReal + fMultDiv2(C1, sineLevel); +- } else { +- *ptrReal++ = signalReal + sineLevelPrev; +- if (noSubbands + lowSubband < 63) +- *ptrReal = *ptrReal - fMultDiv2(C1, sineLevel); +- } +- } else +- *ptrReal = signalReal; +- } +- } +- *ptrHarmIndex = (harmIndex + 1) & 3; +- *ptrPhaseIndex = index & (SBR_NF_NO_RANDOM_VAL - 1); +-} +- +-static void adjustTimeSlotHQ_GainAndNoise( +- FIXP_DBL *RESTRICT +- ptrReal, /*!< Subband samples to be adjusted, real part */ +- FIXP_DBL *RESTRICT +- ptrImag, /*!< Subband samples to be adjusted, imag part */ +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs, +- int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ +- int noSubbands, /*!< Number of QMF subbands */ +- int scale_change, /*!< Number of bits to shift adjusted samples */ +- FIXP_SGL smooth_ratio, /*!< Impact of last envelope */ +- int noNoiseFlag, /*!< Start index to random number array */ +- int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */ +-{ +- FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */ +- FIXP_DBL *RESTRICT noiseLevel = +- nrgs->noiseLevel; /*!< Noise levels of current envelope */ +- FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ +- +- FIXP_DBL *RESTRICT filtBuffer = +- h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */ +- FIXP_DBL *RESTRICT filtBufferNoise = +- h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */ +- int *RESTRICT ptrPhaseIndex = +- &h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */ +- +- int k; +- FIXP_DBL signalReal, signalImag; +- FIXP_DBL noiseReal, noiseImag; +- FIXP_DBL smoothedGain, smoothedNoise; +- FIXP_SGL direct_ratio = +- /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio; +- int index = *ptrPhaseIndex; +- int shift; +- +- *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); +- +- filtBufferNoiseShift += +- 1; /* due to later use of fMultDiv2 instead of fMult */ +- if (filtBufferNoiseShift < 0) { +- shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift); +- } else { +- shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift); +- } +- +- if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { +- for (k = 0; k < noSubbands; k++) { +- /* +- Smoothing: The old envelope has been bufferd and a certain ratio +- of the old gains and noise levels is used. +- */ +- smoothedGain = +- fMult(smooth_ratio, filtBuffer[k]) + fMult(direct_ratio, gain[k]); +- +- if (filtBufferNoiseShift < 0) { +- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) + +- fMult(direct_ratio, noiseLevel[k]); +- } else { +- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) + +- fMult(direct_ratio, noiseLevel[k]); +- } +- +- /* +- The next 2 multiplications constitute the actual envelope adjustment +- of the signal and should be carried out with full accuracy +- (supplying #DFRACT_BITS valid bits). +- */ +- signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change); +- signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change); +- +- index++; +- +- if ((pSineLevel[k] != FL2FXCONST_DBL(0.0f)) || noNoiseFlag) { +- /* Just the amplified signal is saved */ +- *ptrReal++ = signalReal; +- *ptrImag++ = signalImag; +- } else { +- /* Add noisefloor to the amplified signal */ +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- noiseReal = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) +- << 4; +- noiseImag = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) +- << 4; +- *ptrReal++ = (signalReal + noiseReal); +- *ptrImag++ = (signalImag + noiseImag); +- } +- } +- } else { +- for (k = 0; k < noSubbands; k++) { +- smoothedGain = gain[k]; +- signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change; +- signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change; +- +- index++; +- +- if ((pSineLevel[k] == FL2FXCONST_DBL(0.0f)) && (noNoiseFlag == 0)) { +- /* Add noisefloor to the amplified signal */ +- smoothedNoise = noiseLevel[k]; +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- noiseReal = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); +- noiseImag = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); +- +- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ +- signalReal += noiseReal << 4; +- signalImag += noiseImag << 4; +- } +- *ptrReal++ = signalReal; +- *ptrImag++ = signalImag; +- } +- } +-} +- +-static void adjustTimeSlotHQ_AddHarmonics( +- FIXP_DBL *RESTRICT +- ptrReal, /*!< Subband samples to be adjusted, real part */ +- FIXP_DBL *RESTRICT +- ptrImag, /*!< Subband samples to be adjusted, imag part */ +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs, +- int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ +- int noSubbands, /*!< Number of QMF subbands */ +- int scale_change /*!< Scale mismatch between QMF input and sineLevel +- exponent. */ +-) { +- FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ +- UCHAR *RESTRICT ptrHarmIndex = +- &h_sbr_cal_env->harmIndex; /*!< Harmonic index */ +- +- int k; +- FIXP_DBL signalReal, signalImag; +- UCHAR harmIndex = *ptrHarmIndex; +- int freqInvFlag = (lowSubband & 1); +- FIXP_DBL sineLevel; +- +- *ptrHarmIndex = (harmIndex + 1) & 3; +- +- for (k = 0; k < noSubbands; k++) { +- sineLevel = pSineLevel[k]; +- freqInvFlag ^= 1; +- if (sineLevel != FL2FXCONST_DBL(0.f)) { +- signalReal = ptrReal[k]; +- signalImag = ptrImag[k]; +- sineLevel = scaleValue(sineLevel, scale_change); +- if (harmIndex & 2) { +- /* case 2,3 */ +- sineLevel = -sineLevel; +- } +- if (!(harmIndex & 1)) { +- /* case 0,2: */ +- ptrReal[k] = signalReal + sineLevel; +- } else { +- /* case 1,3 */ +- if (!freqInvFlag) sineLevel = -sineLevel; +- ptrImag[k] = signalImag + sineLevel; +- } +- } +- } +-} +- +-static void adjustTimeSlotHQ( +- FIXP_DBL *RESTRICT +- ptrReal, /*!< Subband samples to be adjusted, real part */ +- FIXP_DBL *RESTRICT +- ptrImag, /*!< Subband samples to be adjusted, imag part */ +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs, +- int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ +- int noSubbands, /*!< Number of QMF subbands */ +- int scale_change, /*!< Number of bits to shift adjusted samples */ +- FIXP_SGL smooth_ratio, /*!< Impact of last envelope */ +- int noNoiseFlag, /*!< Start index to random number array */ +- int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */ +-{ +- FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */ +- FIXP_DBL *RESTRICT noiseLevel = +- nrgs->noiseLevel; /*!< Noise levels of current envelope */ +- FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ +- +- FIXP_DBL *RESTRICT filtBuffer = +- h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */ +- FIXP_DBL *RESTRICT filtBufferNoise = +- h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */ +- UCHAR *RESTRICT ptrHarmIndex = +- &h_sbr_cal_env->harmIndex; /*!< Harmonic index */ +- int *RESTRICT ptrPhaseIndex = +- &h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */ +- +- int k; +- FIXP_DBL signalReal, signalImag; +- FIXP_DBL noiseReal, noiseImag; +- FIXP_DBL smoothedGain, smoothedNoise; +- FIXP_SGL direct_ratio = +- /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio; +- int index = *ptrPhaseIndex; +- UCHAR harmIndex = *ptrHarmIndex; +- int freqInvFlag = (lowSubband & 1); +- FIXP_DBL sineLevel; +- int shift; +- +- *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); +- *ptrHarmIndex = (harmIndex + 1) & 3; +- +- /* +- Possible optimization: +- smooth_ratio and harmIndex stay constant during the loop. +- It might be faster to include a separate loop in each path. +- +- the check for smooth_ratio is now outside the loop and the workload +- of the whole function decreased by about 20 % +- */ +- +- filtBufferNoiseShift += +- 1; /* due to later use of fMultDiv2 instead of fMult */ +- if (filtBufferNoiseShift < 0) +- shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift); +- else +- shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift); +- +- if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { +- for (k = 0; k < noSubbands; k++) { +- /* +- Smoothing: The old envelope has been bufferd and a certain ratio +- of the old gains and noise levels is used. +- */ +- +- smoothedGain = +- fMult(smooth_ratio, filtBuffer[k]) + fMult(direct_ratio, gain[k]); +- +- if (filtBufferNoiseShift < 0) { +- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) + +- fMult(direct_ratio, noiseLevel[k]); +- } else { +- smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) + +- fMult(direct_ratio, noiseLevel[k]); +- } +- +- /* +- The next 2 multiplications constitute the actual envelope adjustment +- of the signal and should be carried out with full accuracy +- (supplying #DFRACT_BITS valid bits). +- */ +- signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change); +- signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change); +- +- index++; +- +- if (pSineLevel[k] != FL2FXCONST_DBL(0.0f)) { +- sineLevel = pSineLevel[k]; +- +- switch (harmIndex) { +- case 0: +- *ptrReal++ = (signalReal + sineLevel); +- *ptrImag++ = (signalImag); +- break; +- case 2: +- *ptrReal++ = (signalReal - sineLevel); +- *ptrImag++ = (signalImag); +- break; +- case 1: +- *ptrReal++ = (signalReal); +- if (freqInvFlag) +- *ptrImag++ = (signalImag - sineLevel); +- else +- *ptrImag++ = (signalImag + sineLevel); +- break; +- case 3: +- *ptrReal++ = signalReal; +- if (freqInvFlag) +- *ptrImag++ = (signalImag + sineLevel); +- else +- *ptrImag++ = (signalImag - sineLevel); +- break; +- } +- } else { +- if (noNoiseFlag) { +- /* Just the amplified signal is saved */ +- *ptrReal++ = (signalReal); +- *ptrImag++ = (signalImag); +- } else { +- /* Add noisefloor to the amplified signal */ +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ +- noiseReal = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) +- << 4; +- noiseImag = +- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) +- << 4; +- *ptrReal++ = (signalReal + noiseReal); +- *ptrImag++ = (signalImag + noiseImag); +- } +- } +- freqInvFlag ^= 1; +- } +- +- } else { +- for (k = 0; k < noSubbands; k++) { +- smoothedGain = gain[k]; +- signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change; +- signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change; +- +- index++; +- +- if ((sineLevel = pSineLevel[k]) != FL2FXCONST_DBL(0.0f)) { +- switch (harmIndex) { +- case 0: +- signalReal += sineLevel; +- break; +- case 1: +- if (freqInvFlag) +- signalImag -= sineLevel; +- else +- signalImag += sineLevel; +- break; +- case 2: +- signalReal -= sineLevel; +- break; +- case 3: +- if (freqInvFlag) +- signalImag += sineLevel; +- else +- signalImag -= sineLevel; +- break; +- } +- } else { +- if (noNoiseFlag == 0) { +- /* Add noisefloor to the amplified signal */ +- smoothedNoise = noiseLevel[k]; +- index &= (SBR_NF_NO_RANDOM_VAL - 1); +- noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], +- smoothedNoise); +- noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], +- smoothedNoise); +- +- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ +- signalReal += noiseReal << 4; +- signalImag += noiseImag << 4; +- } +- } +- *ptrReal++ = signalReal; +- *ptrImag++ = signalImag; +- +- freqInvFlag ^= 1; +- } +- } +-} +- +-/*! +- \brief Reset limiter bands. +- +- Build frequency band table for the gain limiter dependent on +- the previously generated transposer patch areas. +- +- \return SBRDEC_OK if ok, SBRDEC_UNSUPPORTED_CONFIG on error +-*/ +-SBR_ERROR +-ResetLimiterBands( +- UCHAR *limiterBandTable, /*!< Resulting band borders in QMF channels */ +- UCHAR *noLimiterBands, /*!< Resulting number of limiter band */ +- UCHAR *freqBandTable, /*!< Table with possible band borders */ +- int noFreqBands, /*!< Number of bands in freqBandTable */ +- const PATCH_PARAM *patchParam, /*!< Transposer patch parameters */ +- int noPatches, /*!< Number of transposer patches */ +- int limiterBands, /*!< Selected 'band density' from bitstream */ +- UCHAR sbrPatchingMode, int xOverQmf[MAX_NUM_PATCHES], int b41Sbr) { +- int i, k, isPatchBorder[2], loLimIndex, hiLimIndex, tempNoLim, nBands; +- UCHAR workLimiterBandTable[MAX_FREQ_COEFFS / 2 + MAX_NUM_PATCHES + 1]; +- int patchBorders[MAX_NUM_PATCHES + 1]; +- int kx, k2; +- +- int lowSubband = freqBandTable[0]; +- int highSubband = freqBandTable[noFreqBands]; +- +- /* 1 limiter band. */ +- if (limiterBands == 0) { +- limiterBandTable[0] = 0; +- limiterBandTable[1] = highSubband - lowSubband; +- nBands = 1; +- } else { +- if (!sbrPatchingMode && xOverQmf != NULL) { +- noPatches = 0; +- +- if (b41Sbr == 1) { +- for (i = 1; i < MAX_NUM_PATCHES_HBE; i++) +- if (xOverQmf[i] != 0) noPatches++; +- } else { +- for (i = 1; i < MAX_STRETCH_HBE; i++) +- if (xOverQmf[i] != 0) noPatches++; +- } +- for (i = 0; i < noPatches; i++) { +- patchBorders[i] = xOverQmf[i] - lowSubband; +- } +- } else { +- for (i = 0; i < noPatches; i++) { +- patchBorders[i] = patchParam[i].guardStartBand - lowSubband; +- } +- } +- patchBorders[i] = highSubband - lowSubband; +- +- /* 1.2, 2, or 3 limiter bands/octave plus bandborders at patchborders. */ +- for (k = 0; k <= noFreqBands; k++) { +- workLimiterBandTable[k] = freqBandTable[k] - lowSubband; +- } +- for (k = 1; k < noPatches; k++) { +- workLimiterBandTable[noFreqBands + k] = patchBorders[k]; +- } +- +- tempNoLim = nBands = noFreqBands + noPatches - 1; +- shellsort(workLimiterBandTable, tempNoLim + 1); +- +- loLimIndex = 0; +- hiLimIndex = 1; +- +- while (hiLimIndex <= tempNoLim) { +- FIXP_DBL div_m, oct_m, temp; +- INT div_e = 0, oct_e = 0, temp_e = 0; +- +- k2 = workLimiterBandTable[hiLimIndex] + lowSubband; +- kx = workLimiterBandTable[loLimIndex] + lowSubband; +- +- div_m = fDivNorm(k2, kx, &div_e); +- +- /* calculate number of octaves */ +- oct_m = fLog2(div_m, div_e, &oct_e); +- +- /* multiply with limiterbands per octave */ +- /* values 1, 1.2, 2, 3 -> scale factor of 2 */ +- temp = fMultNorm( +- oct_m, FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4_DBL[limiterBands], +- &temp_e); +- +- /* overall scale factor of temp ist addition of scalefactors from log2 +- calculation, limiter bands scalefactor (2) and limiter bands +- multiplication */ +- temp_e += oct_e + 2; +- +- /* div can be a maximum of 64 (k2 = 64 and kx = 1) +- -> oct can be a maximum of 6 +- -> temp can be a maximum of 18 (as limiterBandsPerOctoave is a maximum +- factor of 3) +- -> we need a scale factor of 5 for comparisson +- */ +- if (temp >> (5 - temp_e) < FL2FXCONST_DBL(0.49f) >> 5) { +- if (workLimiterBandTable[hiLimIndex] == +- workLimiterBandTable[loLimIndex]) { +- workLimiterBandTable[hiLimIndex] = highSubband; +- nBands--; +- hiLimIndex++; +- continue; +- } +- isPatchBorder[0] = isPatchBorder[1] = 0; +- for (k = 0; k <= noPatches; k++) { +- if (workLimiterBandTable[hiLimIndex] == patchBorders[k]) { +- isPatchBorder[1] = 1; +- break; +- } +- } +- if (!isPatchBorder[1]) { +- workLimiterBandTable[hiLimIndex] = highSubband; +- nBands--; +- hiLimIndex++; +- continue; +- } +- for (k = 0; k <= noPatches; k++) { +- if (workLimiterBandTable[loLimIndex] == patchBorders[k]) { +- isPatchBorder[0] = 1; +- break; +- } +- } +- if (!isPatchBorder[0]) { +- workLimiterBandTable[loLimIndex] = highSubband; +- nBands--; +- } +- } +- loLimIndex = hiLimIndex; +- hiLimIndex++; +- } +- shellsort(workLimiterBandTable, tempNoLim + 1); +- +- /* Test if algorithm exceeded maximum allowed limiterbands */ +- if (nBands > MAX_NUM_LIMITERS || nBands <= 0) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Copy limiterbands from working buffer into final destination */ +- for (k = 0; k <= nBands; k++) { +- limiterBandTable[k] = workLimiterBandTable[k]; +- } +- } +- *noLimiterBands = nBands; +- +- return SBRDEC_OK; +-} +diff --git a/libSBRdec/src/env_calc.h b/libSBRdec/src/env_calc.h +deleted file mode 100644 +index cff365d..0000000 +--- a/libSBRdec/src/env_calc.h ++++ /dev/null +@@ -1,182 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope calculation prototypes +-*/ +-#ifndef ENV_CALC_H +-#define ENV_CALC_H +- +-#include "sbrdecoder.h" +-#include "env_extr.h" /* for HANDLE_SBR_HEADER_DATA */ +- +-typedef struct { +- FIXP_DBL filtBuffer[MAX_FREQ_COEFFS]; /*!< previous gains (required for +- smoothing) */ +- FIXP_DBL filtBufferNoise[MAX_FREQ_COEFFS]; /*!< previous noise levels +- (required for smoothing) */ +- SCHAR filtBuffer_e[MAX_FREQ_COEFFS]; /*!< Exponents of previous gains */ +- SCHAR filtBufferNoise_e; /*!< Common exponent of previous noise levels */ +- +- int startUp; /*!< flag to signal initial conditions in buffers */ +- int phaseIndex; /*!< Index for randomPase array */ +- int prevTranEnv; /*!< The transient envelope of the previous frame. */ +- +- ULONG harmFlagsPrev[ADD_HARMONICS_FLAGS_SIZE]; +- /*!< Words with 16 flags each indicating where a sine was added in the +- * previous frame.*/ +- UCHAR harmIndex; /*!< Current phase of synthetic sine */ +- int sbrPatchingMode; /*!< Current patching mode */ +- +- FIXP_SGL prevSbrNoiseFloorLevel[MAX_NOISE_COEFFS]; +- UCHAR prevNNfb; +- UCHAR prevNSfb[2]; +- UCHAR prevLoSubband; +- UCHAR prevHiSubband; +- UCHAR prev_ov_highSubband; +- UCHAR *prevFreqBandTable[2]; +- UCHAR prevFreqBandTableLo[MAX_FREQ_COEFFS / 2 + 1]; +- UCHAR prevFreqBandTableHi[MAX_FREQ_COEFFS + 1]; +- UCHAR prevFreqBandTableNoise[MAX_NOISE_COEFFS + 1]; +- SCHAR sinusoidal_positionPrev; +- ULONG harmFlagsPrevActive[ADD_HARMONICS_FLAGS_SIZE]; +-} SBR_CALCULATE_ENVELOPE; +- +-typedef SBR_CALCULATE_ENVELOPE *HANDLE_SBR_CALCULATE_ENVELOPE; +- +-void calculateSbrEnvelope( +- QMF_SCALE_FACTOR *sbrScaleFactor, +- HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, +- HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA hFrameData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **analysBufferReal, +- FIXP_DBL * +- *analysBufferImag, /*!< Imag part of subband samples to be processed */ +- const int useLP, +- FIXP_DBL *degreeAlias, /*!< Estimated aliasing for each QMF channel */ +- const UINT flags, const int frameErrorFlag); +- +-SBR_ERROR +-createSbrEnvelopeCalc(HANDLE_SBR_CALCULATE_ENVELOPE hSbrCalculateEnvelope, +- HANDLE_SBR_HEADER_DATA hHeaderData, const int chan, +- const UINT flags); +- +-int deleteSbrEnvelopeCalc(HANDLE_SBR_CALCULATE_ENVELOPE hSbrCalculateEnvelope); +- +-void resetSbrEnvelopeCalc(HANDLE_SBR_CALCULATE_ENVELOPE hCalEnv); +- +-SBR_ERROR +-ResetLimiterBands(UCHAR *limiterBandTable, UCHAR *noLimiterBands, +- UCHAR *freqBandTable, int noFreqBands, +- const PATCH_PARAM *patchParam, int noPatches, +- int limiterBands, UCHAR sbrPatchingMode, +- int xOverQmf[MAX_NUM_PATCHES], int sbrRatio); +- +-void rescaleSubbandSamples(FIXP_DBL **re, FIXP_DBL **im, int lowSubband, +- int noSubbands, int start_pos, int next_pos, +- int shift); +- +-FIXP_DBL maxSubbandSample(FIXP_DBL **analysBufferReal_m, +- FIXP_DBL **analysBufferImag_m, int lowSubband, +- int highSubband, int start_pos, int stop_pos); +- +-#endif // ENV_CALC_H +diff --git a/libSBRdec/src/env_dec.cpp b/libSBRdec/src/env_dec.cpp +deleted file mode 100644 +index 95807c9..0000000 +--- a/libSBRdec/src/env_dec.cpp ++++ /dev/null +@@ -1,873 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief envelope decoding +- This module provides envelope decoding and error concealment algorithms. The +- main entry point is decodeSbrData(). +- +- \sa decodeSbrData(),\ref documentationOverview +-*/ +- +-#include "env_dec.h" +- +-#include "env_extr.h" +-#include "transcendent.h" +- +-#include "genericStds.h" +- +-static void decodeEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_sbr_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data_otherChannel); +-static void sbr_envelope_unmapping(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_data_left, +- HANDLE_SBR_FRAME_DATA h_data_right); +-static void requantizeEnvelopeData(HANDLE_SBR_FRAME_DATA h_sbr_data, +- int ampResolution); +-static void deltaToLinearPcmEnvelopeDecoding( +- HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data); +-static void decodeNoiseFloorlevels(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_sbr_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data); +-static void timeCompensateFirstEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_sbr_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data); +-static int checkEnvelopeData(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_sbr_data, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data); +- +-#define SBR_ENERGY_PAN_OFFSET (12 << ENV_EXP_FRACT) +-#define SBR_MAX_ENERGY (35 << ENV_EXP_FRACT) +- +-#define DECAY (1 << ENV_EXP_FRACT) +- +-#if ENV_EXP_FRACT +-#define DECAY_COUPLING \ +- (1 << (ENV_EXP_FRACT - 1)) /*!< corresponds to a value of 0.5 */ +-#else +-#define DECAY_COUPLING \ +- 1 /*!< If the energy data is not shifted, use 1 instead of 0.5 */ +-#endif +- +-/*! +- \brief Convert table index +-*/ +-static int indexLow2High(int offset, /*!< mapping factor */ +- int index, /*!< index to scalefactor band */ +- int res) /*!< frequency resolution */ +-{ +- if (res == 0) { +- if (offset >= 0) { +- if (index < offset) +- return (index); +- else +- return (2 * index - offset); +- } else { +- offset = -offset; +- if (index < offset) +- return (2 * index + index); +- else +- return (2 * index + offset); +- } +- } else +- return (index); +-} +- +-/*! +- \brief Update previous envelope value for delta-coding +- +- The current envelope values needs to be stored for delta-coding +- in the next frame. The stored envelope is always represented with +- the high frequency resolution. If the current envelope uses the +- low frequency resolution, the energy value will be mapped to the +- corresponding high-res bands. +-*/ +-static void mapLowResEnergyVal( +- FIXP_SGL currVal, /*!< current energy value */ +- FIXP_SGL *prevData, /*!< pointer to previous data vector */ +- int offset, /*!< mapping factor */ +- int index, /*!< index to scalefactor band */ +- int res) /*!< frequeny resolution */ +-{ +- if (res == 0) { +- if (offset >= 0) { +- if (index < offset) +- prevData[index] = currVal; +- else { +- prevData[2 * index - offset] = currVal; +- prevData[2 * index + 1 - offset] = currVal; +- } +- } else { +- offset = -offset; +- if (index < offset) { +- prevData[3 * index] = currVal; +- prevData[3 * index + 1] = currVal; +- prevData[3 * index + 2] = currVal; +- } else { +- prevData[2 * index + offset] = currVal; +- prevData[2 * index + 1 + offset] = currVal; +- } +- } +- } else +- prevData[index] = currVal; +-} +- +-/*! +- \brief Convert raw envelope and noisefloor data to energy levels +- +- This function is being called by sbrDecoder_ParseElement() and provides two +- important algorithms: +- +- First the function decodes envelopes and noise floor levels as described in +- requantizeEnvelopeData() and sbr_envelope_unmapping(). The function also +- implements concealment algorithms in case there are errors within the sbr +- data. For both operations fractional arithmetic is used. Therefore you might +- encounter different output values on your target system compared to the +- reference implementation. +-*/ +-void decodeSbrData( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA +- h_data_left, /*!< pointer to left channel frame data */ +- HANDLE_SBR_PREV_FRAME_DATA +- h_prev_data_left, /*!< pointer to left channel previous frame data */ +- HANDLE_SBR_FRAME_DATA +- h_data_right, /*!< pointer to right channel frame data */ +- HANDLE_SBR_PREV_FRAME_DATA +- h_prev_data_right) /*!< pointer to right channel previous frame data */ +-{ +- FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS]; +- int errLeft; +- +- /* Save previous energy values to be able to reuse them later for concealment. +- */ +- FDKmemcpy(tempSfbNrgPrev, h_prev_data_left->sfb_nrg_prev, +- MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); +- +- if (hHeaderData->frameErrorFlag || hHeaderData->bs_info.pvc_mode == 0) { +- decodeEnvelope(hHeaderData, h_data_left, h_prev_data_left, +- h_prev_data_right); +- } else { +- FDK_ASSERT(h_data_right == NULL); +- } +- decodeNoiseFloorlevels(hHeaderData, h_data_left, h_prev_data_left); +- +- if (h_data_right != NULL) { +- errLeft = hHeaderData->frameErrorFlag; +- decodeEnvelope(hHeaderData, h_data_right, h_prev_data_right, +- h_prev_data_left); +- decodeNoiseFloorlevels(hHeaderData, h_data_right, h_prev_data_right); +- +- if (!errLeft && hHeaderData->frameErrorFlag) { +- /* If an error occurs in the right channel where the left channel seemed +- ok, we apply concealment also on the left channel. This ensures that +- the coupling modes of both channels match and that we have the same +- number of envelopes in coupling mode. However, as the left channel has +- already been processed before, the resulting energy levels are not the +- same as if the left channel had been concealed during the first call of +- decodeEnvelope(). +- */ +- /* Restore previous energy values for concealment, because the values have +- been overwritten by the first call of decodeEnvelope(). */ +- FDKmemcpy(h_prev_data_left->sfb_nrg_prev, tempSfbNrgPrev, +- MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); +- /* Do concealment */ +- decodeEnvelope(hHeaderData, h_data_left, h_prev_data_left, +- h_prev_data_right); +- } +- +- if (h_data_left->coupling) { +- sbr_envelope_unmapping(hHeaderData, h_data_left, h_data_right); +- } +- } +- +- /* Display the data for debugging: */ +-} +- +-/*! +- \brief Convert from coupled channels to independent L/R data +-*/ +-static void sbr_envelope_unmapping( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_data_left, /*!< pointer to left channel */ +- HANDLE_SBR_FRAME_DATA h_data_right) /*!< pointer to right channel */ +-{ +- int i; +- FIXP_SGL tempL_m, tempR_m, tempRplus1_m, newL_m, newR_m; +- SCHAR tempL_e, tempR_e, tempRplus1_e, newL_e, newR_e; +- +- /* 1. Unmap (already dequantized) coupled envelope energies */ +- +- for (i = 0; i < h_data_left->nScaleFactors; i++) { +- tempR_m = (FIXP_SGL)((LONG)h_data_right->iEnvelope[i] & MASK_M); +- tempR_e = (SCHAR)((LONG)h_data_right->iEnvelope[i] & MASK_E); +- +- tempR_e -= (18 + NRG_EXP_OFFSET); /* -18 = ld(UNMAPPING_SCALE / +- h_data_right->nChannels) */ +- tempL_m = (FIXP_SGL)((LONG)h_data_left->iEnvelope[i] & MASK_M); +- tempL_e = (SCHAR)((LONG)h_data_left->iEnvelope[i] & MASK_E); +- +- tempL_e -= NRG_EXP_OFFSET; +- +- /* Calculate tempRight+1 */ +- FDK_add_MantExp(tempR_m, tempR_e, FL2FXCONST_SGL(0.5f), 1, /* 1.0 */ +- &tempRplus1_m, &tempRplus1_e); +- +- FDK_divide_MantExp(tempL_m, tempL_e + 1, /* 2 * tempLeft */ +- tempRplus1_m, tempRplus1_e, &newR_m, &newR_e); +- +- if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) { +- newR_m >>= 1; +- newR_e += 1; +- } +- +- newL_m = FX_DBL2FX_SGL(fMult(tempR_m, newR_m)); +- newL_e = tempR_e + newR_e; +- +- h_data_right->iEnvelope[i] = +- ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) + +- (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NRG_EXP_OFFSET) & MASK_E); +- h_data_left->iEnvelope[i] = +- ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) + +- (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NRG_EXP_OFFSET) & MASK_E); +- } +- +- /* 2. Dequantize and unmap coupled noise floor levels */ +- +- for (i = 0; i < hHeaderData->freqBandData.nNfb * +- h_data_left->frameInfo.nNoiseEnvelopes; +- i++) { +- tempL_e = (SCHAR)(6 - (LONG)h_data_left->sbrNoiseFloorLevel[i]); +- tempR_e = (SCHAR)((LONG)h_data_right->sbrNoiseFloorLevel[i] - +- 12) /*SBR_ENERGY_PAN_OFFSET*/; +- +- /* Calculate tempR+1 */ +- FDK_add_MantExp(FL2FXCONST_SGL(0.5f), 1 + tempR_e, /* tempR */ +- FL2FXCONST_SGL(0.5f), 1, /* 1.0 */ +- &tempRplus1_m, &tempRplus1_e); +- +- /* Calculate 2*tempLeft/(tempR+1) */ +- FDK_divide_MantExp(FL2FXCONST_SGL(0.5f), tempL_e + 2, /* 2 * tempLeft */ +- tempRplus1_m, tempRplus1_e, &newR_m, &newR_e); +- +- /* if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) { +- newR_m >>= 1; +- newR_e += 1; +- } */ +- +- /* L = tempR * R */ +- newL_m = newR_m; +- newL_e = newR_e + tempR_e; +- h_data_right->sbrNoiseFloorLevel[i] = +- ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) + +- (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NOISE_EXP_OFFSET) & MASK_E); +- h_data_left->sbrNoiseFloorLevel[i] = +- ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) + +- (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NOISE_EXP_OFFSET) & MASK_E); +- } +-} +- +-/*! +- \brief Simple alternative to the real SBR concealment +- +- If the real frameInfo is not available due to a frame loss, a replacement will +- be constructed with 1 envelope spanning the whole frame (FIX-FIX). +- The delta-coded energies are set to negative values, resulting in a fade-down. +- In case of coupling, the balance-channel will move towards the center. +-*/ +-static void leanSbrConcealment( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */ +-) { +- FIXP_SGL target; /* targeted level for sfb_nrg_prev during fade-down */ +- FIXP_SGL step; /* speed of fade */ +- int i; +- +- int currentStartPos = +- fMax(0, h_prev_data->stopPos - hHeaderData->numberTimeSlots); +- int currentStopPos = hHeaderData->numberTimeSlots; +- +- /* Use some settings of the previous frame */ +- h_sbr_data->ampResolutionCurrentFrame = h_prev_data->ampRes; +- h_sbr_data->coupling = h_prev_data->coupling; +- for (i = 0; i < MAX_INVF_BANDS; i++) +- h_sbr_data->sbr_invf_mode[i] = h_prev_data->sbr_invf_mode[i]; +- +- /* Generate concealing control data */ +- +- h_sbr_data->frameInfo.nEnvelopes = 1; +- h_sbr_data->frameInfo.borders[0] = currentStartPos; +- h_sbr_data->frameInfo.borders[1] = currentStopPos; +- h_sbr_data->frameInfo.freqRes[0] = 1; +- h_sbr_data->frameInfo.tranEnv = -1; /* no transient */ +- h_sbr_data->frameInfo.nNoiseEnvelopes = 1; +- h_sbr_data->frameInfo.bordersNoise[0] = currentStartPos; +- h_sbr_data->frameInfo.bordersNoise[1] = currentStopPos; +- +- h_sbr_data->nScaleFactors = hHeaderData->freqBandData.nSfb[1]; +- +- /* Generate fake envelope data */ +- +- h_sbr_data->domain_vec[0] = 1; +- +- if (h_sbr_data->coupling == COUPLING_BAL) { +- target = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; +- step = (FIXP_SGL)DECAY_COUPLING; +- } else { +- target = FL2FXCONST_SGL(0.0f); +- step = (FIXP_SGL)DECAY; +- } +- if (hHeaderData->bs_info.ampResolution == 0) { +- target <<= 1; +- step <<= 1; +- } +- +- for (i = 0; i < h_sbr_data->nScaleFactors; i++) { +- if (h_prev_data->sfb_nrg_prev[i] > target) +- h_sbr_data->iEnvelope[i] = -step; +- else +- h_sbr_data->iEnvelope[i] = step; +- } +- +- /* Noisefloor levels are always cleared ... */ +- +- h_sbr_data->domain_vec_noise[0] = 1; +- FDKmemclear(h_sbr_data->sbrNoiseFloorLevel, +- sizeof(h_sbr_data->sbrNoiseFloorLevel)); +- +- /* ... and so are the sines */ +- FDKmemclear(h_sbr_data->addHarmonics, +- sizeof(ULONG) * ADD_HARMONICS_FLAGS_SIZE); +-} +- +-/*! +- \brief Build reference energies and noise levels from bitstream elements +-*/ +-static void decodeEnvelope( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ +- HANDLE_SBR_PREV_FRAME_DATA +- h_prev_data, /*!< pointer to data of last frame */ +- HANDLE_SBR_PREV_FRAME_DATA +- otherChannel /*!< other channel's last frame data */ +-) { +- int i; +- int fFrameError = hHeaderData->frameErrorFlag; +- FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS]; +- +- if (!fFrameError) { +- /* +- To avoid distortions after bad frames, set the error flag if delta coding +- in time occurs. However, SBR can take a little longer to come up again. +- */ +- if (h_prev_data->frameErrorFlag) { +- if (h_sbr_data->domain_vec[0] != 0) { +- fFrameError = 1; +- } +- } else { +- /* Check that the previous stop position and the current start position +- match. (Could be done in checkFrameInfo(), but the previous frame data +- is not available there) */ +- if (h_sbr_data->frameInfo.borders[0] != +- h_prev_data->stopPos - hHeaderData->numberTimeSlots) { +- /* Both the previous as well as the current frame are flagged to be ok, +- * but they do not match! */ +- if (h_sbr_data->domain_vec[0] == 1) { +- /* Prefer concealment over delta-time coding between the mismatching +- * frames */ +- fFrameError = 1; +- } else { +- /* Close the gap in time by triggering timeCompensateFirstEnvelope() +- */ +- fFrameError = 1; +- } +- } +- } +- } +- +- if (fFrameError) /* Error is detected */ +- { +- leanSbrConcealment(hHeaderData, h_sbr_data, h_prev_data); +- +- /* decode the envelope data to linear PCM */ +- deltaToLinearPcmEnvelopeDecoding(hHeaderData, h_sbr_data, h_prev_data); +- } else /*Do a temporary dummy decoding and check that the envelope values are +- within limits */ +- { +- if (h_prev_data->frameErrorFlag) { +- timeCompensateFirstEnvelope(hHeaderData, h_sbr_data, h_prev_data); +- if (h_sbr_data->coupling != h_prev_data->coupling) { +- /* +- Coupling mode has changed during concealment. +- The stored energy levels need to be converted. +- */ +- for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) { +- /* Former Level-Channel will be used for both channels */ +- if (h_prev_data->coupling == COUPLING_BAL) { +- h_prev_data->sfb_nrg_prev[i] = +- (otherChannel != NULL) ? otherChannel->sfb_nrg_prev[i] +- : (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; +- } +- /* Former L/R will be combined as the new Level-Channel */ +- else if (h_sbr_data->coupling == COUPLING_LEVEL && +- otherChannel != NULL) { +- h_prev_data->sfb_nrg_prev[i] = (h_prev_data->sfb_nrg_prev[i] + +- otherChannel->sfb_nrg_prev[i]) >> +- 1; +- } else if (h_sbr_data->coupling == COUPLING_BAL) { +- h_prev_data->sfb_nrg_prev[i] = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; +- } +- } +- } +- } +- FDKmemcpy(tempSfbNrgPrev, h_prev_data->sfb_nrg_prev, +- MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); +- +- deltaToLinearPcmEnvelopeDecoding(hHeaderData, h_sbr_data, h_prev_data); +- +- fFrameError = checkEnvelopeData(hHeaderData, h_sbr_data, h_prev_data); +- +- if (fFrameError) { +- hHeaderData->frameErrorFlag = 1; +- FDKmemcpy(h_prev_data->sfb_nrg_prev, tempSfbNrgPrev, +- MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); +- decodeEnvelope(hHeaderData, h_sbr_data, h_prev_data, otherChannel); +- return; +- } +- } +- +- requantizeEnvelopeData(h_sbr_data, h_sbr_data->ampResolutionCurrentFrame); +- +- hHeaderData->frameErrorFlag = fFrameError; +-} +- +-/*! +- \brief Verify that envelope energies are within the allowed range +- \return 0 if all is fine, 1 if an envelope value was too high +-*/ +-static int checkEnvelopeData( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */ +-) { +- FIXP_SGL *iEnvelope = h_sbr_data->iEnvelope; +- FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev; +- int i = 0, errorFlag = 0; +- FIXP_SGL sbr_max_energy = (h_sbr_data->ampResolutionCurrentFrame == 1) +- ? SBR_MAX_ENERGY +- : (SBR_MAX_ENERGY << 1); +- +- /* +- Range check for current energies +- */ +- for (i = 0; i < h_sbr_data->nScaleFactors; i++) { +- if (iEnvelope[i] > sbr_max_energy) { +- errorFlag = 1; +- } +- if (iEnvelope[i] < FL2FXCONST_SGL(0.0f)) { +- errorFlag = 1; +- /* iEnvelope[i] = FL2FXCONST_SGL(0.0f); */ +- } +- } +- +- /* +- Range check for previous energies +- */ +- for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) { +- sfb_nrg_prev[i] = fixMax(sfb_nrg_prev[i], FL2FXCONST_SGL(0.0f)); +- sfb_nrg_prev[i] = fixMin(sfb_nrg_prev[i], sbr_max_energy); +- } +- +- return (errorFlag); +-} +- +-/*! +- \brief Verify that the noise levels are within the allowed range +- +- The function is equivalent to checkEnvelopeData(). +- When the noise-levels are being decoded, it is already too late for +- concealment. Therefore the noise levels are simply limited here. +-*/ +-static void limitNoiseLevels( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data) /*!< pointer to current data */ +-{ +- int i; +- int nNfb = hHeaderData->freqBandData.nNfb; +- +-/* +- Set range limits. The exact values depend on the coupling mode. +- However this limitation is primarily intended to avoid unlimited +- accumulation of the delta-coded noise levels. +-*/ +-#define lowerLimit \ +- ((FIXP_SGL)0) /* lowerLimit actually refers to the _highest_ noise energy */ +-#define upperLimit \ +- ((FIXP_SGL)35) /* upperLimit actually refers to the _lowest_ noise energy */ +- +- /* +- Range check for current noise levels +- */ +- for (i = 0; i < h_sbr_data->frameInfo.nNoiseEnvelopes * nNfb; i++) { +- h_sbr_data->sbrNoiseFloorLevel[i] = +- fixMin(h_sbr_data->sbrNoiseFloorLevel[i], upperLimit); +- h_sbr_data->sbrNoiseFloorLevel[i] = +- fixMax(h_sbr_data->sbrNoiseFloorLevel[i], lowerLimit); +- } +-} +- +-/*! +- \brief Compensate for the wrong timing that might occur after a frame error. +-*/ +-static void timeCompensateFirstEnvelope( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to actual data */ +- HANDLE_SBR_PREV_FRAME_DATA +- h_prev_data) /*!< pointer to data of last frame */ +-{ +- int i, nScalefactors; +- FRAME_INFO *pFrameInfo = &h_sbr_data->frameInfo; +- UCHAR *nSfb = hHeaderData->freqBandData.nSfb; +- int estimatedStartPos = +- fMax(0, h_prev_data->stopPos - hHeaderData->numberTimeSlots); +- int refLen, newLen, shift; +- FIXP_SGL deltaExp; +- +- /* Original length of first envelope according to bitstream */ +- refLen = pFrameInfo->borders[1] - pFrameInfo->borders[0]; +- /* Corrected length of first envelope (concealing can make the first envelope +- * longer) */ +- newLen = pFrameInfo->borders[1] - estimatedStartPos; +- +- if (newLen <= 0) { +- /* An envelope length of <= 0 would not work, so we don't use it. +- May occur if the previous frame was flagged bad due to a mismatch +- of the old and new frame infos. */ +- newLen = refLen; +- estimatedStartPos = pFrameInfo->borders[0]; +- } +- +- deltaExp = FDK_getNumOctavesDiv8(newLen, refLen); +- +- /* Shift by -3 to rescale ld-table, ampRes-1 to enable coarser steps */ +- shift = (FRACT_BITS - 1 - ENV_EXP_FRACT - 1 + +- h_sbr_data->ampResolutionCurrentFrame - 3); +- deltaExp = deltaExp >> shift; +- pFrameInfo->borders[0] = estimatedStartPos; +- pFrameInfo->bordersNoise[0] = estimatedStartPos; +- +- if (h_sbr_data->coupling != COUPLING_BAL) { +- nScalefactors = (pFrameInfo->freqRes[0]) ? nSfb[1] : nSfb[0]; +- +- for (i = 0; i < nScalefactors; i++) +- h_sbr_data->iEnvelope[i] = h_sbr_data->iEnvelope[i] + deltaExp; +- } +-} +- +-/*! +- \brief Convert each envelope value from logarithmic to linear domain +- +- Energy levels are transmitted in powers of 2, i.e. only the exponent +- is extracted from the bitstream. +- Therefore, normally only integer exponents can occur. However during +- fading (in case of a corrupt bitstream), a fractional part can also +- occur. The data in the array iEnvelope is shifted left by ENV_EXP_FRACT +- compared to an integer representation so that numbers smaller than 1 +- can be represented. +- +- This function calculates a mantissa corresponding to the fractional +- part of the exponent for each reference energy. The array iEnvelope +- is converted in place to save memory. Input and output data must +- be interpreted differently, as shown in the below figure: +- +- \image html EnvelopeData.png +- +- The data is then used in calculateSbrEnvelope(). +-*/ +-static void requantizeEnvelopeData(HANDLE_SBR_FRAME_DATA h_sbr_data, +- int ampResolution) { +- int i; +- FIXP_SGL mantissa; +- int ampShift = 1 - ampResolution; +- int exponent; +- +- /* In case that ENV_EXP_FRACT is changed to something else but 0 or 8, +- the initialization of this array has to be adapted! +- */ +-#if ENV_EXP_FRACT +- static const FIXP_SGL pow2[ENV_EXP_FRACT] = { +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 1))), /* 0.7071 */ +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 2))), /* 0.5946 */ +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 3))), +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 4))), +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 5))), +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 6))), +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 7))), +- FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 8))) /* 0.5013 */ +- }; +- +- int bit, mask; +-#endif +- +- for (i = 0; i < h_sbr_data->nScaleFactors; i++) { +- exponent = (LONG)h_sbr_data->iEnvelope[i]; +- +-#if ENV_EXP_FRACT +- +- exponent = exponent >> ampShift; +- mantissa = 0.5f; +- +- /* Amplify mantissa according to the fractional part of the +- exponent (result will be between 0.500000 and 0.999999) +- */ +- mask = 1; /* begin with lowest bit of exponent */ +- +- for (bit = ENV_EXP_FRACT - 1; bit >= 0; bit--) { +- if (exponent & mask) { +- /* The current bit of the exponent is set, +- multiply mantissa with the corresponding factor: */ +- mantissa = (FIXP_SGL)((mantissa * pow2[bit]) << 1); +- } +- /* Advance to next bit */ +- mask = mask << 1; +- } +- +- /* Make integer part of exponent right aligned */ +- exponent = exponent >> ENV_EXP_FRACT; +- +-#else +- /* In case of the high amplitude resolution, 1 bit of the exponent gets lost +- by the shift. This will be compensated by a mantissa of 0.5*sqrt(2) +- instead of 0.5 if that bit is 1. */ +- mantissa = (exponent & ampShift) ? FL2FXCONST_SGL(0.707106781186548f) +- : FL2FXCONST_SGL(0.5f); +- exponent = exponent >> ampShift; +-#endif +- +- /* +- Mantissa was set to 0.5 (instead of 1.0, therefore increase exponent by +- 1). Multiply by L=nChannels=64 by increasing exponent by another 6. +- => Increase exponent by 7 +- */ +- exponent += 7 + NRG_EXP_OFFSET; +- +- /* Combine mantissa and exponent and write back the result */ +- h_sbr_data->iEnvelope[i] = +- ((FIXP_SGL)((SHORT)(FIXP_SGL)mantissa & MASK_M)) + +- (FIXP_SGL)((SHORT)(FIXP_SGL)exponent & MASK_E); +- } +-} +- +-/*! +- \brief Build new reference energies from old ones and delta coded data +-*/ +-static void deltaToLinearPcmEnvelopeDecoding( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */ +-{ +- int i, domain, no_of_bands, band, freqRes; +- +- FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev; +- FIXP_SGL *ptr_nrg = h_sbr_data->iEnvelope; +- +- int offset = +- 2 * hHeaderData->freqBandData.nSfb[0] - hHeaderData->freqBandData.nSfb[1]; +- +- for (i = 0; i < h_sbr_data->frameInfo.nEnvelopes; i++) { +- domain = h_sbr_data->domain_vec[i]; +- freqRes = h_sbr_data->frameInfo.freqRes[i]; +- +- FDK_ASSERT(freqRes >= 0 && freqRes <= 1); +- +- no_of_bands = hHeaderData->freqBandData.nSfb[freqRes]; +- +- FDK_ASSERT(no_of_bands < (64)); +- +- if (domain == 0) { +- mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, 0, freqRes); +- ptr_nrg++; +- for (band = 1; band < no_of_bands; band++) { +- *ptr_nrg = *ptr_nrg + *(ptr_nrg - 1); +- mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes); +- ptr_nrg++; +- } +- } else { +- for (band = 0; band < no_of_bands; band++) { +- *ptr_nrg = +- *ptr_nrg + sfb_nrg_prev[indexLow2High(offset, band, freqRes)]; +- mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes); +- ptr_nrg++; +- } +- } +- } +-} +- +-/*! +- \brief Build new noise levels from old ones and delta coded data +-*/ +-static void decodeNoiseFloorlevels( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */ +-{ +- int i; +- int nNfb = hHeaderData->freqBandData.nNfb; +- int nNoiseFloorEnvelopes = h_sbr_data->frameInfo.nNoiseEnvelopes; +- +- /* Decode first noise envelope */ +- +- if (h_sbr_data->domain_vec_noise[0] == 0) { +- FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[0]; +- for (i = 1; i < nNfb; i++) { +- noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i]; +- h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel; +- } +- } else { +- for (i = 0; i < nNfb; i++) { +- h_sbr_data->sbrNoiseFloorLevel[i] += h_prev_data->prevNoiseLevel[i]; +- } +- } +- +- /* If present, decode the second noise envelope +- Note: nNoiseFloorEnvelopes can only be 1 or 2 */ +- +- if (nNoiseFloorEnvelopes > 1) { +- if (h_sbr_data->domain_vec_noise[1] == 0) { +- FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[nNfb]; +- for (i = nNfb + 1; i < 2 * nNfb; i++) { +- noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i]; +- h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel; +- } +- } else { +- for (i = 0; i < nNfb; i++) { +- h_sbr_data->sbrNoiseFloorLevel[i + nNfb] += +- h_sbr_data->sbrNoiseFloorLevel[i]; +- } +- } +- } +- +- limitNoiseLevels(hHeaderData, h_sbr_data); +- +- /* Update prevNoiseLevel with the last noise envelope */ +- for (i = 0; i < nNfb; i++) +- h_prev_data->prevNoiseLevel[i] = +- h_sbr_data->sbrNoiseFloorLevel[i + nNfb * (nNoiseFloorEnvelopes - 1)]; +- +- /* Requantize the noise floor levels in COUPLING_OFF-mode */ +- if (!h_sbr_data->coupling) { +- int nf_e; +- +- for (i = 0; i < nNoiseFloorEnvelopes * nNfb; i++) { +- nf_e = 6 - (LONG)h_sbr_data->sbrNoiseFloorLevel[i] + 1 + NOISE_EXP_OFFSET; +- /* +1 to compensate for a mantissa of 0.5 instead of 1.0 */ +- +- h_sbr_data->sbrNoiseFloorLevel[i] = +- (FIXP_SGL)(((LONG)FL2FXCONST_SGL(0.5f)) + /* mantissa */ +- (nf_e & MASK_E)); /* exponent */ +- } +- } +-} +diff --git a/libSBRdec/src/env_dec.h b/libSBRdec/src/env_dec.h +deleted file mode 100644 +index 0b11ce1..0000000 +--- a/libSBRdec/src/env_dec.h ++++ /dev/null +@@ -1,119 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope decoding +-*/ +-#ifndef ENV_DEC_H +-#define ENV_DEC_H +- +-#include "sbrdecoder.h" +-#include "env_extr.h" +- +-void decodeSbrData(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_data_left, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data_left, +- HANDLE_SBR_FRAME_DATA h_data_right, +- HANDLE_SBR_PREV_FRAME_DATA h_prev_data_right); +- +-#endif +diff --git a/libSBRdec/src/env_extr.cpp b/libSBRdec/src/env_extr.cpp +deleted file mode 100644 +index c72a7b6..0000000 +--- a/libSBRdec/src/env_extr.cpp ++++ /dev/null +@@ -1,1728 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope extraction +- The functions provided by this module are mostly called by applySBR(). After +- it is determined that there is valid SBR data, sbrGetHeaderData() might be +- called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed +- to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes +- as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET +- when decoder settings need to be recalculated according to the SBR +- specifications. In that case applySBR() will initiatite the required +- re-configuration. +- +- The header data is stored in a #SBR_HEADER_DATA structure. +- +- The actual SBR data for the current frame is decoded into SBR_FRAME_DATA +- stuctures by sbrGetChannelPairElement() [for stereo streams] and +- sbrGetSingleChannelElement() [for mono streams]. There is no fractional +- arithmetic involved. +- +- Once the information is extracted, the data needs to be further prepared +- before the actual decoding process. This is done in decodeSbrData(). +- +- \sa Description of buffer management in applySBR(). \ref documentationOverview +- +-

About the SBR data format:

+- +- Each frame includes SBR data (side chain information), and can be either the +- \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data +- can be protected by a CRC checksum. +- +- \anchor SBR_HEADER_ELEMENT

The SBR_HEADER_ELEMENT

+- +- The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it +- typically is send every second or so. It contains fundamental information such +- as SBR sampling frequency and frequency range as well as control signals that +- do not require frequent changes. It also includes the \ref +- SBR_STANDARD_ELEMENT. +- +- Depending on the changes between the information in a current +- SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might +- need to be reset and reconfigured (e.g. new tables need to be calculated). +- +- \anchor SBR_STANDARD_ELEMENT

The SBR_STANDARD_ELEMENT

+- +- This data can be subdivided into "side info" and "raw data", where side info +- is defined as signals needed to decode the raw data and some decoder tuning +- signals. Raw data is referred to as PCM and Huffman coded envelope and noise +- floor estimates. The side info also includes information about the +- time-frequency grid for the current frame. +- +- \sa \ref documentationOverview +-*/ +- +-#include "env_extr.h" +- +-#include "sbr_ram.h" +-#include "sbr_rom.h" +-#include "huff_dec.h" +- +-#include "psbitdec.h" +- +-#define DRM_PARAMETRIC_STEREO 0 +-#define EXTENSION_ID_PS_CODING 2 +- +-static int extractPvcFrameInfo( +- HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the +- frame-info will be stored */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where +- the previous frame-info +- will be stored */ +- UCHAR pvc_mode_last, /**< PVC mode of last frame */ +- const UINT flags); +-static int extractFrameInfo(HANDLE_FDK_BITSTREAM hBs, +- HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_frame_data, +- const UINT nrOfChannels, const UINT flags); +- +-static int sbrGetPvcEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_frame_data, +- HANDLE_FDK_BITSTREAM hBs, const UINT flags, +- const UINT pvcMode); +-static int sbrGetEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_frame_data, +- HANDLE_FDK_BITSTREAM hBs, const UINT flags); +- +-static void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA hFrameData, +- HANDLE_FDK_BITSTREAM hBs, +- const UINT flags, const int bs_pvc_mode); +- +-static void sbrGetNoiseFloorData(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA h_frame_data, +- HANDLE_FDK_BITSTREAM hBs); +- +-static int checkFrameInfo(FRAME_INFO *pFrameInfo, int numberOfTimeSlots, +- int overlap, int timeStep); +- +-/* Mapping to std samplerate table according to 14496-3 (4.6.18.2.6) */ +-typedef struct SR_MAPPING { +- UINT fsRangeLo; /* If fsRangeLo(n+1)>fs>=fsRangeLo(n), it will be mapped to... +- */ +- UINT fsMapped; /* fsMapped. */ +-} SR_MAPPING; +- +-static const SR_MAPPING stdSampleRatesMapping[] = { +- {0, 8000}, {9391, 11025}, {11502, 12000}, {13856, 16000}, +- {18783, 22050}, {23004, 24000}, {27713, 32000}, {37566, 44100}, +- {46009, 48000}, {55426, 64000}, {75132, 88200}, {92017, 96000}}; +-static const SR_MAPPING stdSampleRatesMappingUsac[] = { +- {0, 16000}, {18783, 22050}, {23004, 24000}, {27713, 32000}, +- {35777, 40000}, {42000, 44100}, {46009, 48000}, {55426, 64000}, +- {75132, 88200}, {92017, 96000}}; +- +-UINT sbrdec_mapToStdSampleRate(UINT fs, +- UINT isUsac) /*!< Output sampling frequency */ +-{ +- UINT fsMapped = fs, tableSize = 0; +- const SR_MAPPING *mappingTable; +- int i; +- +- if (!isUsac) { +- mappingTable = stdSampleRatesMapping; +- tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING); +- } else { +- mappingTable = stdSampleRatesMappingUsac; +- tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING); +- } +- +- for (i = tableSize - 1; i >= 0; i--) { +- if (fs >= mappingTable[i].fsRangeLo) { +- fsMapped = mappingTable[i].fsMapped; +- break; +- } +- } +- +- return (fsMapped); +-} +- +-SBR_ERROR +-initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, +- const int sampleRateOut, const INT downscaleFactor, +- const int samplesPerFrame, const UINT flags, +- const int setDefaultHdr) { +- HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; +- SBR_ERROR sbrError = SBRDEC_OK; +- int numAnalysisBands; +- int sampleRateProc; +- +- if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { +- sampleRateProc = +- sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0); +- } else { +- sampleRateProc = sampleRateOut * downscaleFactor; +- } +- +- if (sampleRateIn == sampleRateOut) { +- hHeaderData->sbrProcSmplRate = sampleRateProc << 1; +- numAnalysisBands = 32; +- } else { +- hHeaderData->sbrProcSmplRate = sampleRateProc; +- if ((sampleRateOut >> 1) == sampleRateIn) { +- /* 1:2 */ +- numAnalysisBands = 32; +- } else if ((sampleRateOut >> 2) == sampleRateIn) { +- /* 1:4 */ +- numAnalysisBands = 16; +- } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) { +- /* 3:8, 3/4 core frame length */ +- numAnalysisBands = 24; +- } else { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- goto bail; +- } +- } +- numAnalysisBands /= downscaleFactor; +- +- if (setDefaultHdr) { +- /* Fill in default values first */ +- hHeaderData->syncState = SBR_NOT_INITIALIZED; +- hHeaderData->status = 0; +- hHeaderData->frameErrorFlag = 0; +- +- hHeaderData->bs_info.ampResolution = 1; +- hHeaderData->bs_info.xover_band = 0; +- hHeaderData->bs_info.sbr_preprocessing = 0; +- hHeaderData->bs_info.pvc_mode = 0; +- +- hHeaderData->bs_data.startFreq = 5; +- hHeaderData->bs_data.stopFreq = 0; +- hHeaderData->bs_data.freqScale = +- 0; /* previously 2; for ELD reduced delay bitstreams +- /samplerates initializing of the sbr decoder instance fails if +- freqScale is set to 2 because no master table can be generated; in +- ELD reduced delay bitstreams this value is always 0; gets overwritten +- when header is read */ +- hHeaderData->bs_data.alterScale = 1; +- hHeaderData->bs_data.noise_bands = 2; +- hHeaderData->bs_data.limiterBands = 2; +- hHeaderData->bs_data.limiterGains = 2; +- hHeaderData->bs_data.interpolFreq = 1; +- hHeaderData->bs_data.smoothingLength = 1; +- +- /* Patch some entries */ +- if (sampleRateOut * downscaleFactor >= 96000) { +- hHeaderData->bs_data.startFreq = +- 4; /* having read these frequency values from bit stream before. */ +- hHeaderData->bs_data.stopFreq = 3; +- } else if (sampleRateOut * downscaleFactor > +- 24000) { /* Trigger an error if SBR is going to be processed +- without */ +- hHeaderData->bs_data.startFreq = +- 7; /* having read these frequency values from bit stream before. */ +- hHeaderData->bs_data.stopFreq = 3; +- } +- } +- +- if ((sampleRateOut >> 2) == sampleRateIn) { +- hHeaderData->timeStep = 4; +- } else { +- hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; +- } +- +- /* Setup pointers to frequency band tables */ +- hFreq->freqBandTable[0] = hFreq->freqBandTableLo; +- hFreq->freqBandTable[1] = hFreq->freqBandTableHi; +- +- /* One SBR timeslot corresponds to the amount of samples equal to the amount +- * of analysis bands, divided by the timestep. */ +- hHeaderData->numberTimeSlots = +- (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1); +- if (hHeaderData->numberTimeSlots > (16)) { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- hHeaderData->numberOfAnalysisBands = numAnalysisBands; +- if ((sampleRateOut >> 2) == sampleRateIn) { +- hHeaderData->numberTimeSlots <<= 1; +- } +- +-bail: +- return sbrError; +-} +- +-/*! +- \brief Initialize the SBR_PREV_FRAME_DATA struct +-*/ +-void initSbrPrevFrameData( +- HANDLE_SBR_PREV_FRAME_DATA +- h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */ +- int timeSlots) /*!< Framelength in SBR-timeslots */ +-{ +- int i; +- +- /* Set previous energy and noise levels to 0 for the case +- that decoding starts in the middle of a bitstream */ +- for (i = 0; i < MAX_FREQ_COEFFS; i++) +- h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; +- for (i = 0; i < MAX_NOISE_COEFFS; i++) +- h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; +- for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF; +- +- h_prev_data->stopPos = timeSlots; +- h_prev_data->coupling = COUPLING_OFF; +- h_prev_data->ampRes = 0; +- +- FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo)); +-} +- +-/*! +- \brief Read header data from bitstream +- +- \return error status - 0 if ok +-*/ +-SBR_HEADER_STATUS +-sbrGetHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_FDK_BITSTREAM hBs, +- const UINT flags, const int fIsSbrData, +- const UCHAR configMode) { +- SBR_HEADER_DATA_BS *pBsData; +- SBR_HEADER_DATA_BS lastHeader; +- SBR_HEADER_DATA_BS_INFO lastInfo; +- int headerExtra1 = 0, headerExtra2 = 0; +- +- /* Read and discard new header in config change detection mode */ +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { +- /* ampResolution */ +- FDKreadBits(hBs, 1); +- } +- /* startFreq, stopFreq */ +- FDKpushFor(hBs, 8); +- if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { +- /* xover_band */ +- FDKreadBits(hBs, 3); +- /* reserved bits */ +- FDKreadBits(hBs, 2); +- } +- headerExtra1 = FDKreadBit(hBs); +- headerExtra2 = FDKreadBit(hBs); +- FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2); +- +- return HEADER_OK; +- } +- +- /* Copy SBR bit stream header to temporary header */ +- lastHeader = hHeaderData->bs_data; +- lastInfo = hHeaderData->bs_info; +- +- /* Read new header from bitstream */ +- if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) { +- pBsData = &hHeaderData->bs_dflt; +- } else { +- pBsData = &hHeaderData->bs_data; +- } +- +- if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { +- hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1); +- } +- +- pBsData->startFreq = FDKreadBits(hBs, 4); +- pBsData->stopFreq = FDKreadBits(hBs, 4); +- +- if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) { +- hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3); +- FDKreadBits(hBs, 2); +- } +- +- headerExtra1 = FDKreadBits(hBs, 1); +- headerExtra2 = FDKreadBits(hBs, 1); +- +- /* Handle extra header information */ +- if (headerExtra1) { +- pBsData->freqScale = FDKreadBits(hBs, 2); +- pBsData->alterScale = FDKreadBits(hBs, 1); +- pBsData->noise_bands = FDKreadBits(hBs, 2); +- } else { +- pBsData->freqScale = 2; +- pBsData->alterScale = 1; +- pBsData->noise_bands = 2; +- } +- +- if (headerExtra2) { +- pBsData->limiterBands = FDKreadBits(hBs, 2); +- pBsData->limiterGains = FDKreadBits(hBs, 2); +- pBsData->interpolFreq = FDKreadBits(hBs, 1); +- pBsData->smoothingLength = FDKreadBits(hBs, 1); +- } else { +- pBsData->limiterBands = 2; +- pBsData->limiterGains = 2; +- pBsData->interpolFreq = 1; +- pBsData->smoothingLength = 1; +- } +- +- /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ +- if (hHeaderData->syncState < SBR_HEADER || +- lastHeader.startFreq != pBsData->startFreq || +- lastHeader.stopFreq != pBsData->stopFreq || +- lastHeader.freqScale != pBsData->freqScale || +- lastHeader.alterScale != pBsData->alterScale || +- lastHeader.noise_bands != pBsData->noise_bands || +- lastInfo.xover_band != hHeaderData->bs_info.xover_band) { +- return HEADER_RESET; /* New settings */ +- } +- +- return HEADER_OK; +-} +- +-/*! +- \brief Get missing harmonics parameters (only used for AAC+SBR) +- +- \return error status - 0 if ok +-*/ +-int sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA hFrameData, +- HANDLE_FDK_BITSTREAM hBs, const UINT flags) { +- int i, bitsRead = 0; +- +- int add_harmonic_flag = FDKreadBits(hBs, 1); +- bitsRead++; +- +- if (add_harmonic_flag) { +- int nSfb = hHeaderData->freqBandData.nSfb[1]; +- for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) { +- /* read maximum 32 bits and align them to the MSB */ +- int readBits = fMin(32, nSfb); +- nSfb -= readBits; +- if (readBits > 0) { +- hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits) +- << (32 - readBits); +- } else { +- hFrameData->addHarmonics[i] = 0; +- } +- +- bitsRead += readBits; +- } +- /* bs_pvc_mode = 0 for Rsvd50 */ +- if (flags & SBRDEC_SYNTAX_USAC) { +- if (hHeaderData->bs_info.pvc_mode) { +- int bs_sinusoidal_position = 31; +- if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) { +- bs_sinusoidal_position = FDKreadBits(hBs, 5); +- } +- hFrameData->sinusoidal_position = bs_sinusoidal_position; +- } +- } +- } else { +- for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) +- hFrameData->addHarmonics[i] = 0; +- } +- +- return (bitsRead); +-} +- +-/*! +- \brief Reads extension data from the bitstream +- +- The bitstream format allows up to 4 kinds of extended data element. +- Extended data may contain several elements, each identified by a 2-bit-ID. +- So far, no extended data elements are defined hence the first 2 parameters +- are unused. The data should be skipped in order to update the number +- of read bits for the consistency check in applySBR(). +-*/ +-static int extractExtendedData( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */ +- HANDLE_FDK_BITSTREAM hBs /*!< Handle to the bit buffer */ +- , +- HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */ +-) { +- INT nBitsLeft; +- int extended_data; +- int i, frameOk = 1; +- +- extended_data = FDKreadBits(hBs, 1); +- +- if (extended_data) { +- int cnt; +- int bPsRead = 0; +- +- cnt = FDKreadBits(hBs, 4); +- if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8); +- +- nBitsLeft = 8 * cnt; +- +- /* sanity check for cnt */ +- if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { +- /* limit nBitsLeft */ +- nBitsLeft = (INT)FDKgetValidBits(hBs); +- /* set frame error */ +- frameOk = 0; +- } +- +- while (nBitsLeft > 7) { +- int extension_id = FDKreadBits(hBs, 2); +- nBitsLeft -= 2; +- +- switch (extension_id) { +- case EXTENSION_ID_PS_CODING: +- +- /* Read PS data from bitstream */ +- +- if (hParametricStereoDec != NULL) { +- if (bPsRead && +- !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot] +- .mpeg.bPsHeaderValid) { +- cnt = nBitsLeft >> 3; /* number of remaining bytes */ +- for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); +- nBitsLeft -= cnt * 8; +- } else { +- nBitsLeft -= +- (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft); +- bPsRead = 1; +- } +- } +- +- /* parametric stereo detected, could set channelMode accordingly here +- */ +- /* */ +- /* "The usage of this parametric stereo extension to HE-AAC is */ +- /* signalled implicitly in the bitstream. Hence, if an sbr_extension() +- */ +- /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of +- */ +- /* the bitstream, a decoder supporting the combination of SBR and PS +- */ +- /* shall operate the PS tool to generate a stereo output signal." */ +- /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */ +- +- break; +- +- default: +- cnt = nBitsLeft >> 3; /* number of remaining bytes */ +- for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8); +- nBitsLeft -= cnt * 8; +- break; +- } +- } +- +- if (nBitsLeft < 0) { +- frameOk = 0; +- goto bail; +- } else { +- /* Read fill bits for byte alignment */ +- FDKreadBits(hBs, nBitsLeft); +- } +- } +- +-bail: +- return (frameOk); +-} +- +-/*! +- \brief Read bitstream elements of a SBR channel element +- \return SbrFrameOK +-*/ +-int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA hFrameDataLeft, +- HANDLE_SBR_FRAME_DATA hFrameDataRight, +- HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev, +- UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBs, +- HANDLE_PS_DEC hParametricStereoDec, const UINT flags, +- const int overlap) { +- int i, bs_coupling = COUPLING_OFF; +- const int nCh = (hFrameDataRight == NULL) ? 1 : 2; +- +- if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { +- /* Reserved bits */ +- if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ +- FDKreadBits(hBs, 4); +- if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) { +- FDKreadBits(hBs, 4); +- } +- } +- } +- +- if (nCh == 2) { +- /* Read coupling flag */ +- bs_coupling = FDKreadBits(hBs, 1); +- if (bs_coupling) { +- hFrameDataLeft->coupling = COUPLING_LEVEL; +- hFrameDataRight->coupling = COUPLING_BAL; +- } else { +- hFrameDataLeft->coupling = COUPLING_OFF; +- hFrameDataRight->coupling = COUPLING_OFF; +- } +- } else { +- if (flags & SBRDEC_SYNTAX_SCAL) { +- FDKreadBits(hBs, 1); /* bs_coupling */ +- } +- hFrameDataLeft->coupling = COUPLING_OFF; +- } +- +- if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { +- if (flags & SBRDEC_USAC_HARMONICSBR) { +- hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs); +- if (hFrameDataLeft->sbrPatchingMode == 0) { +- hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs); +- if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ +- hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7); +- } else { +- hFrameDataLeft->sbrPitchInBins = 0; +- } +- } else { +- hFrameDataLeft->sbrOversamplingFlag = 0; +- hFrameDataLeft->sbrPitchInBins = 0; +- } +- +- if (nCh == 2) { +- if (bs_coupling) { +- hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode; +- hFrameDataRight->sbrOversamplingFlag = +- hFrameDataLeft->sbrOversamplingFlag; +- hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins; +- } else { +- hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs); +- if (hFrameDataRight->sbrPatchingMode == 0) { +- hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs); +- if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */ +- hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7); +- } else { +- hFrameDataRight->sbrPitchInBins = 0; +- } +- } else { +- hFrameDataRight->sbrOversamplingFlag = 0; +- hFrameDataRight->sbrPitchInBins = 0; +- } +- } +- } +- } else { +- if (nCh == 2) { +- hFrameDataRight->sbrPatchingMode = 1; +- hFrameDataRight->sbrOversamplingFlag = 0; +- hFrameDataRight->sbrPitchInBins = 0; +- } +- +- hFrameDataLeft->sbrPatchingMode = 1; +- hFrameDataLeft->sbrOversamplingFlag = 0; +- hFrameDataLeft->sbrPitchInBins = 0; +- } +- } else { +- if (nCh == 2) { +- hFrameDataRight->sbrPatchingMode = 1; +- hFrameDataRight->sbrOversamplingFlag = 0; +- hFrameDataRight->sbrPitchInBins = 0; +- } +- +- hFrameDataLeft->sbrPatchingMode = 1; +- hFrameDataLeft->sbrOversamplingFlag = 0; +- hFrameDataLeft->sbrPitchInBins = 0; +- } +- +- /* +- sbr_grid(): Grid control +- */ +- if (hHeaderData->bs_info.pvc_mode) { +- FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */ +- if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft, +- hFrameDataLeftPrev, pvc_mode_last, flags)) +- return 0; +- +- if (!checkFrameInfo(&hFrameDataLeft->frameInfo, +- hHeaderData->numberTimeSlots, overlap, +- hHeaderData->timeStep)) +- return 0; +- } else { +- if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0; +- +- if (!checkFrameInfo(&hFrameDataLeft->frameInfo, +- hHeaderData->numberTimeSlots, overlap, +- hHeaderData->timeStep)) +- return 0; +- } +- if (nCh == 2) { +- if (hFrameDataLeft->coupling) { +- FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, +- sizeof(FRAME_INFO)); +- hFrameDataRight->ampResolutionCurrentFrame = +- hFrameDataLeft->ampResolutionCurrentFrame; +- } else { +- if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags)) +- return 0; +- +- if (!checkFrameInfo(&hFrameDataRight->frameInfo, +- hHeaderData->numberTimeSlots, overlap, +- hHeaderData->timeStep)) +- return 0; +- } +- } +- +- /* +- sbr_dtdf(): Fetch domain vectors (time or frequency direction for +- delta-coding) +- */ +- sbrGetDirectionControlData(hFrameDataLeft, hBs, flags, +- hHeaderData->bs_info.pvc_mode); +- if (nCh == 2) { +- sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0); +- } +- +- /* sbr_invf() */ +- for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { +- hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); +- } +- if (nCh == 2) { +- if (hFrameDataLeft->coupling) { +- for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { +- hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; +- } +- } else { +- for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { +- hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2); +- } +- } +- } +- +- if (nCh == 1) { +- if (hHeaderData->bs_info.pvc_mode) { +- if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags, +- hHeaderData->bs_info.pvc_mode)) +- return 0; +- } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) +- return 0; +- +- sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); +- } else if (hFrameDataLeft->coupling) { +- if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) { +- return 0; +- } +- +- sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); +- +- if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) { +- return 0; +- } +- sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); +- } else { /* nCh == 2 && no coupling */ +- +- if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0; +- +- if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0; +- +- sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs); +- +- sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs); +- } +- +- sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags); +- if (nCh == 2) { +- sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags); +- } +- +- if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) { +- if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) { +- return 0; +- } +- } +- +- return 1; +-} +- +-/*! +- \brief Read direction control data from bitstream +-*/ +-void sbrGetDirectionControlData( +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ +- HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ +- const UINT flags, const int bs_pvc_mode) +- +-{ +- int i; +- int indepFlag = 0; +- +- if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { +- indepFlag = flags & SBRDEC_USAC_INDEP; +- } +- +- if (bs_pvc_mode == 0) { +- i = 0; +- if (indepFlag) { +- h_frame_data->domain_vec[i++] = 0; +- } +- for (; i < h_frame_data->frameInfo.nEnvelopes; i++) { +- h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1); +- } +- } +- +- i = 0; +- if (indepFlag) { +- h_frame_data->domain_vec_noise[i++] = 0; +- } +- for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { +- h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1); +- } +-} +- +-/*! +- \brief Read noise-floor-level data from bitstream +-*/ +-void sbrGetNoiseFloorData( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ +- HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ +-{ +- int i, j; +- int delta; +- COUPLING_MODE coupling; +- int noNoiseBands = hHeaderData->freqBandData.nNfb; +- +- Huffman hcb_noiseF; +- Huffman hcb_noise; +- int envDataTableCompFactor; +- +- coupling = h_frame_data->coupling; +- +- /* +- Select huffman codebook depending on coupling mode +- */ +- if (coupling == COUPLING_BAL) { +- hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; +- hcb_noiseF = +- (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" +- */ +- envDataTableCompFactor = 1; +- } else { +- hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; +- hcb_noiseF = +- (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" +- */ +- envDataTableCompFactor = 0; +- } +- +- /* +- Read raw noise-envelope data +- */ +- for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { +- if (h_frame_data->domain_vec_noise[i] == 0) { +- if (coupling == COUPLING_BAL) { +- h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = +- (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor); +- } else { +- h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] = +- (FIXP_SGL)(int)FDKreadBits(hBs, 5); +- } +- +- for (j = 1; j < noNoiseBands; j++) { +- delta = DecodeHuffmanCW(hcb_noiseF, hBs); +- h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] = +- (FIXP_SGL)(delta << envDataTableCompFactor); +- } +- } else { +- for (j = 0; j < noNoiseBands; j++) { +- delta = DecodeHuffmanCW(hcb_noise, hBs); +- h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] = +- (FIXP_SGL)(delta << envDataTableCompFactor); +- } +- } +- } +-} +- +-/* ns = mapNsMode2ns[pvcMode-1][nsMode] */ +-static const UCHAR mapNsMode2ns[2][2] = { +- {16, 4}, /* pvcMode = 1 */ +- {12, 3} /* pvcMode = 2 */ +-}; +- +-static int sbrGetPvcEnvelope( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ +- HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ +- const UINT flags, const UINT pvcMode) { +- int divMode, nsMode; +- int indepFlag = flags & SBRDEC_USAC_INDEP; +- UCHAR *pvcID = h_frame_data->pvcID; +- +- divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS); +- nsMode = FDKreadBit(hBs); +- FDK_ASSERT((pvcMode == 1) || (pvcMode == 2)); +- h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode]; +- +- if (divMode <= 3) { +- int i, k = 1, sum_length = 0, reuse_pcvID; +- +- /* special treatment for first time slot k=0 */ +- indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs)); +- if (reuse_pcvID) { +- pvcID[0] = hHeaderData->pvcIDprev; +- } else { +- pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS); +- } +- +- /* other time slots k>0 */ +- for (i = 0; i < divMode; i++) { +- int length, numBits = 4; +- +- if (sum_length >= 13) { +- numBits = 1; +- } else if (sum_length >= 11) { +- numBits = 2; +- } else if (sum_length >= 7) { +- numBits = 3; +- } +- +- length = FDKreadBits(hBs, numBits); +- sum_length += length + 1; +- if (sum_length >= PVC_NTIMESLOT) { +- return 0; /* parse error */ +- } +- for (; length--; k++) { +- pvcID[k] = pvcID[k - 1]; +- } +- pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); +- } +- for (; k < 16; k++) { +- pvcID[k] = pvcID[k - 1]; +- } +- } else { /* divMode >= 4 */ +- int num_grid_info, fixed_length, grid_info, j, k = 0; +- +- divMode -= 4; +- num_grid_info = 2 << divMode; +- fixed_length = 8 >> divMode; +- FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT); +- +- /* special treatment for first time slot k=0 */ +- indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs)); +- if (grid_info) { +- pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); +- } else { +- pvcID[k++] = hHeaderData->pvcIDprev; +- } +- j = fixed_length - 1; +- for (; j--; k++) { +- pvcID[k] = pvcID[k - 1]; +- } +- num_grid_info--; +- +- /* other time slots k>0 */ +- for (; num_grid_info--;) { +- j = fixed_length; +- grid_info = FDKreadBit(hBs); +- if (grid_info) { +- pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS); +- j--; +- } +- for (; j--; k++) { +- pvcID[k] = pvcID[k - 1]; +- } +- } +- } +- +- hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1]; +- +- /* usage of PVC excludes inter-TES tool */ +- h_frame_data->iTESactive = (UCHAR)0; +- +- return 1; +-} +-/*! +- \brief Read envelope data from bitstream +-*/ +-static int sbrGetEnvelope( +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ +- HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ +- const UINT flags) { +- int i, j; +- UCHAR no_band[MAX_ENVELOPES]; +- int delta = 0; +- int offset = 0; +- COUPLING_MODE coupling = h_frame_data->coupling; +- int ampRes = hHeaderData->bs_info.ampResolution; +- int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; +- int envDataTableCompFactor; +- int start_bits, start_bits_balance; +- Huffman hcb_t, hcb_f; +- +- h_frame_data->nScaleFactors = 0; +- +- if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) { +- if (flags & SBRDEC_ELD_GRID) +- ampRes = h_frame_data->ampResolutionCurrentFrame; +- else +- ampRes = 0; +- } +- h_frame_data->ampResolutionCurrentFrame = ampRes; +- +- /* +- Set number of bits for first value depending on amplitude resolution +- */ +- if (ampRes == 1) { +- start_bits = 6; +- start_bits_balance = 5; +- } else { +- start_bits = 7; +- start_bits_balance = 6; +- } +- +- /* +- Calculate number of values for each envelope and alltogether +- */ +- for (i = 0; i < nEnvelopes; i++) { +- no_band[i] = +- hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; +- h_frame_data->nScaleFactors += no_band[i]; +- } +- if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) return 0; +- +- /* +- Select Huffman codebook depending on coupling mode and amplitude resolution +- */ +- if (coupling == COUPLING_BAL) { +- envDataTableCompFactor = 1; +- if (ampRes == 0) { +- hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; +- hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; +- } else { +- hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; +- hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; +- } +- } else { +- envDataTableCompFactor = 0; +- if (ampRes == 0) { +- hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; +- hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; +- } else { +- hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; +- hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; +- } +- } +- +- h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */ +- /* +- Now read raw envelope data +- */ +- for (j = 0, offset = 0; j < nEnvelopes; j++) { +- if (h_frame_data->domain_vec[j] == 0) { +- if (coupling == COUPLING_BAL) { +- h_frame_data->iEnvelope[offset] = +- (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance)) +- << envDataTableCompFactor); +- } else { +- h_frame_data->iEnvelope[offset] = +- (FIXP_SGL)(int)FDKreadBits(hBs, start_bits); +- } +- } +- +- for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { +- if (h_frame_data->domain_vec[j] == 0) { +- delta = DecodeHuffmanCW(hcb_f, hBs); +- } else { +- delta = DecodeHuffmanCW(hcb_t, hBs); +- } +- +- h_frame_data->iEnvelope[offset + i] = +- (FIXP_SGL)(delta << envDataTableCompFactor); +- } +- if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) { +- int bs_temp_shape = FDKreadBit(hBs); +- FDK_ASSERT(j < 8); +- h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j); +- if (bs_temp_shape) { +- h_frame_data->interTempShapeMode[j] = +- FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */ +- } else { +- h_frame_data->interTempShapeMode[j] = 0; +- } +- } +- offset += no_band[j]; +- } +- +-#if ENV_EXP_FRACT +- /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional +- * part) */ +- for (i = 0; i < h_frame_data->nScaleFactors; i++) { +- h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT; +- } +-#endif +- +- return 1; +-} +- +-/***************************************************************************/ +-/*! +- \brief Generates frame info for FIXFIXonly frame class used for low delay +- version +- +- \return zero for error, one for correct. +- ****************************************************************************/ +-static int generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal, +- int numberTimeSlots, const UINT flags) { +- int nEnv, i, tranIdx; +- const int *pTable; +- +- switch (numberTimeSlots) { +- case 8: +- pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; +- break; +- case 15: +- pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; +- break; +- case 16: +- pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; +- break; +- default: +- return 0; +- } +- +- /* look number of envelopes in table */ +- nEnv = pTable[0]; +- /* look up envelope distribution in table */ +- for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2]; +- /* open and close frame border */ +- hSbrFrameInfo->borders[0] = 0; +- hSbrFrameInfo->borders[nEnv] = numberTimeSlots; +- hSbrFrameInfo->nEnvelopes = nEnv; +- +- /* transient idx */ +- tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; +- +- /* add noise floors */ +- hSbrFrameInfo->bordersNoise[0] = 0; +- hSbrFrameInfo->bordersNoise[1] = +- hSbrFrameInfo->borders[tranIdx ? tranIdx : 1]; +- hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; +- /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) +- */ +- hSbrFrameInfo->nNoiseEnvelopes = 2; +- +- return 1; +-} +- +-/*! +- \brief Extracts LowDelaySBR control data from the bitstream. +- +- \return zero for bitstream error, one for correct. +-*/ +-static int extractLowDelayGrid( +- HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */ +- HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA +- h_frame_data, /*!< contains the FRAME_INFO struct to be filled */ +- int timeSlots, const UINT flags) { +- FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; +- INT numberTimeSlots = hHeaderData->numberTimeSlots; +- INT temp = 0, k; +- +- /* FIXFIXonly framing case */ +- h_frame_data->frameInfo.frameClass = 0; +- +- /* get the transient position from the bitstream */ +- switch (timeSlots) { +- case 8: +- /* 3bit transient position (temp={0;..;7}) */ +- temp = FDKreadBits(hBitBuf, 3); +- break; +- +- case 16: +- case 15: +- /* 4bit transient position (temp={0;..;15}) */ +- temp = FDKreadBits(hBitBuf, 4); +- break; +- +- default: +- return 0; +- } +- +- /* For "case 15" only*/ +- if (temp >= timeSlots) { +- return 0; +- } +- +- /* calculate borders according to the transient position */ +- if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) { +- return 0; +- } +- +- /* decode freq res: */ +- for (k = 0; k < pFrameInfo->nEnvelopes; k++) { +- pFrameInfo->freqRes[k] = +- (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */ +- } +- +- return 1; +-} +- +-/*! +- \brief Extract the PVC frame information (structure FRAME_INFO) from the +- bitstream \return Zero for bitstream error, one for correct. +-*/ +-int extractPvcFrameInfo( +- HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the +- frame-info will be stored */ +- HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where +- the previous frame-info +- will be stored */ +- UCHAR pvc_mode_last, /**< PVC mode of last frame */ +- const UINT flags) { +- FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; +- FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo; +- int bs_var_len_hf, bs_noise_position; +- bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */ +- bs_var_len_hf = FDKreadBit(hBs); +- pFrameInfo->noisePosition = bs_noise_position; +- pFrameInfo->tranEnv = -1; +- +- /* Init for bs_noise_position == 0 in case a parse error is found below. */ +- pFrameInfo->nEnvelopes = 1; +- pFrameInfo->nNoiseEnvelopes = 1; +- pFrameInfo->freqRes[0] = 0; +- +- if (bs_var_len_hf) { /* 1 or 3 Bits */ +- pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1; +- if (pFrameInfo->varLength > 3) { +- pFrameInfo->varLength = +- 0; /* assume bs_var_len_hf == 0 in case of error */ +- return 0; /* reserved value -> parse error */ +- } +- } else { +- pFrameInfo->varLength = 0; +- } +- +- if (bs_noise_position) { +- pFrameInfo->nEnvelopes = 2; +- pFrameInfo->nNoiseEnvelopes = 2; +- FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes)); +- } +- +- /* frame border calculation */ +- if (hHeaderData->bs_info.pvc_mode > 0) { +- /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference. +- */ +- +- FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2)); +- +- /* left timeborder-offset: use the timeborder of prev SBR frame */ +- if (pPrevFrameInfo->nEnvelopes > 0) { +- pFrameInfo->borders[0] = +- pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT; +- FDK_ASSERT(pFrameInfo->borders[0] <= 3); +- } else { +- pFrameInfo->borders[0] = 0; +- } +- +- /* right timeborder-offset: */ +- pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength; +- +- if (pFrameInfo->nEnvelopes == 2) { +- pFrameInfo->borders[1] = pFrameInfo->noisePosition; +- } +- +- /* Calculation of PVC time borders t_EPVC */ +- if (pvc_mode_last == 0) { +- /* there was a legacy SBR frame before this frame => use bs_var_len' for +- * first PVC timeslot */ +- pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0]; +- } else { +- pFrameInfo->pvcBorders[0] = 0; +- } +- if (pFrameInfo->nEnvelopes == 2) { +- pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1]; +- } +- pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16; +- +- /* calculation of SBR noise-floor time-border vector: */ +- for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) { +- pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i]; +- } +- +- pFrameInfo->tranEnv = -1; /* tranEnv not used */ +- } +- return 1; +-} +- +-/*! +- \brief Extract the frame information (structure FRAME_INFO) from the +- bitstream \return Zero for bitstream error, one for correct. +-*/ +-int extractFrameInfo( +- HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the +- frame-info will be stored */ +- const UINT nrOfChannels, const UINT flags) { +- FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo; +- int numberTimeSlots = hHeaderData->numberTimeSlots; +- int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR, +- temp = 0, staticFreqRes; +- UCHAR frameClass; +- +- if (flags & SBRDEC_ELD_GRID) { +- /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames +- * and the LowDelayGrid for transient Frames */ +- frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */ +- if (frameClass == 1) { +- /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal +- * SBR-Grid for FIXIFX */ +- /* extract the AACLD-Sbr-Grid */ +- pFrameInfo->frameClass = frameClass; +- int err = 1; +- err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots, +- flags); +- return err; +- } +- } else { +- frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */ +- } +- +- switch (frameClass) { +- case 0: +- temp = FDKreadBits(hBs, 2); /* E [2 bits ] */ +- nEnv = (int)(1 << temp); /* E -> e */ +- +- if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) +- h_frame_data->ampResolutionCurrentFrame = +- FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */ +- +- staticFreqRes = FDKreadBits(hBs, 1); +- +- if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { +- if (nEnv > MAX_ENVELOPES_USAC) return 0; +- } else +- +- b = nEnv + 1; +- switch (nEnv) { +- case 1: +- switch (numberTimeSlots) { +- case 15: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, +- sizeof(FRAME_INFO)); +- break; +- case 16: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, +- sizeof(FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- case 2: +- switch (numberTimeSlots) { +- case 15: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, +- sizeof(FRAME_INFO)); +- break; +- case 16: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, +- sizeof(FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- case 4: +- switch (numberTimeSlots) { +- case 15: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, +- sizeof(FRAME_INFO)); +- break; +- case 16: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, +- sizeof(FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- case 8: +-#if (MAX_ENVELOPES >= 8) +- switch (numberTimeSlots) { +- case 15: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, +- sizeof(FRAME_INFO)); +- break; +- case 16: +- FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, +- sizeof(FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +-#else +- return 0; +-#endif +- } +- /* Apply correct freqRes (High is default) */ +- if (!staticFreqRes) { +- for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0; +- } +- +- break; +- case 1: +- case 2: +- temp = FDKreadBits(hBs, 2); /* A [2 bits] */ +- +- n = FDKreadBits(hBs, 2); /* n = N [2 bits] */ +- +- nEnv = n + 1; /* # envelopes */ +- b = nEnv + 1; /* # borders */ +- +- break; +- } +- +- switch (frameClass) { +- case 1: +- /* Decode borders: */ +- pFrameInfo->borders[0] = 0; /* first border */ +- border = temp + numberTimeSlots; /* A -> aR */ +- i = b - 1; /* frame info index for last border */ +- pFrameInfo->borders[i] = border; /* last border */ +- +- for (k = 0; k < n; k++) { +- temp = FDKreadBits(hBs, 2); /* R [2 bits] */ +- border -= (2 * temp + 2); /* R -> r */ +- pFrameInfo->borders[--i] = border; +- } +- +- /* Decode pointer: */ +- pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); +- p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ +- +- if (p > n + 1) return 0; +- +- pFrameInfo->tranEnv = p ? n + 2 - p : -1; +- +- /* Decode freq res: */ +- for (k = n; k >= 0; k--) { +- pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ +- } +- +- /* Calculate noise floor middle border: */ +- if (p == 0 || p == 1) +- pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; +- else +- pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; +- +- break; +- +- case 2: +- /* Decode borders: */ +- border = temp; /* A -> aL */ +- pFrameInfo->borders[0] = border; /* first border */ +- +- for (k = 1; k <= n; k++) { +- temp = FDKreadBits(hBs, 2); /* R [2 bits] */ +- border += (2 * temp + 2); /* R -> r */ +- pFrameInfo->borders[k] = border; +- } +- pFrameInfo->borders[k] = numberTimeSlots; /* last border */ +- +- /* Decode pointer: */ +- pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1)); +- p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ +- if (p > n + 1) return 0; +- +- if (p == 0 || p == 1) +- pFrameInfo->tranEnv = -1; +- else +- pFrameInfo->tranEnv = p - 1; +- +- /* Decode freq res: */ +- for (k = 0; k <= n; k++) { +- pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ +- } +- +- /* Calculate noise floor middle border: */ +- switch (p) { +- case 0: +- pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; +- break; +- case 1: +- pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; +- break; +- default: +- pFrameInfo->bordersNoise[1] = +- pFrameInfo->borders[pFrameInfo->tranEnv]; +- break; +- } +- +- break; +- +- case 3: +- /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ +- +- aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */ +- +- aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ +- +- nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */ +- +- nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */ +- +- /*------------------------------------------------------------------------- +- Calculate help variables +- --------------------------------------------------------------------------*/ +- +- /* general: */ +- nEnv = nL + nR + 1; /* # envelopes */ +- if (nEnv > MAX_ENVELOPES) return 0; +- b = nEnv + 1; /* # borders */ +- +- /*------------------------------------------------------------------------- +- Decode envelopes +- --------------------------------------------------------------------------*/ +- +- /* L-borders: */ +- border = aL; /* first border */ +- pFrameInfo->borders[0] = border; +- +- for (k = 1; k <= nL; k++) { +- temp = FDKreadBits(hBs, 2); /* R [2 bits] */ +- border += (2 * temp + 2); /* R -> r */ +- pFrameInfo->borders[k] = border; +- } +- +- /* R-borders: */ +- border = aR; /* last border */ +- i = nEnv; +- +- pFrameInfo->borders[i] = border; +- +- for (k = 0; k < nR; k++) { +- temp = FDKreadBits(hBs, 2); /* R [2 bits] */ +- border -= (2 * temp + 2); /* R -> r */ +- pFrameInfo->borders[--i] = border; +- } +- +- /* decode pointer: */ +- pointer_bits = +- DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1)); +- p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */ +- +- if (p > nL + nR + 1) return 0; +- +- pFrameInfo->tranEnv = p ? b - p : -1; +- +- /* decode freq res: */ +- for (k = 0; k < nEnv; k++) { +- pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ +- } +- +- /*------------------------------------------------------------------------- +- Decode noise floors +- --------------------------------------------------------------------------*/ +- pFrameInfo->bordersNoise[0] = aL; +- +- if (nEnv == 1) { +- /* 1 noise floor envelope: */ +- pFrameInfo->bordersNoise[1] = aR; +- } else { +- /* 2 noise floor envelopes */ +- if (p == 0 || p == 1) +- pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; +- else +- pFrameInfo->bordersNoise[1] = +- pFrameInfo->borders[pFrameInfo->tranEnv]; +- pFrameInfo->bordersNoise[2] = aR; +- } +- break; +- } +- +- /* +- Store number of envelopes, noise floor envelopes and frame class +- */ +- pFrameInfo->nEnvelopes = nEnv; +- +- if (nEnv == 1) +- pFrameInfo->nNoiseEnvelopes = 1; +- else +- pFrameInfo->nNoiseEnvelopes = 2; +- +- pFrameInfo->frameClass = frameClass; +- +- if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { +- /* calculate noise floor first and last borders: */ +- pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; +- pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = +- pFrameInfo->borders[nEnv]; +- } +- +- return 1; +-} +- +-/*! +- \brief Check if the frameInfo vector has reasonable values. +- \return Zero for error, one for correct +-*/ +-static int checkFrameInfo( +- FRAME_INFO *pFrameInfo, /*!< pointer to frameInfo */ +- int numberOfTimeSlots, /*!< QMF time slots per frame */ +- int overlap, /*!< Amount of overlap QMF time slots */ +- int timeStep) /*!< QMF slots to SBR slots step factor */ +-{ +- int maxPos, i, j; +- int startPos; +- int stopPos; +- int tranEnv; +- int startPosNoise; +- int stopPosNoise; +- int nEnvelopes = pFrameInfo->nEnvelopes; +- int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; +- +- if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0; +- +- if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0; +- +- startPos = pFrameInfo->borders[0]; +- stopPos = pFrameInfo->borders[nEnvelopes]; +- tranEnv = pFrameInfo->tranEnv; +- startPosNoise = pFrameInfo->bordersNoise[0]; +- stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; +- +- if (overlap < 0 || overlap > (3 * (4))) { +- return 0; +- } +- if (timeStep < 1 || timeStep > (4)) { +- return 0; +- } +- maxPos = numberOfTimeSlots + (overlap / timeStep); +- +- /* Check that the start and stop positions of the frame are reasonable values. +- */ +- if ((startPos < 0) || (startPos >= stopPos)) return 0; +- if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or +- directly after the overlap +- buffer */ +- return 0; +- if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for +- output after processing */ +- return 0; +- if (stopPos > maxPos) return 0; +- +- /* Check that the start border for every envelope is strictly later in time +- */ +- for (i = 0; i < nEnvelopes; i++) { +- if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0; +- } +- +- /* Check that the envelope to be shortened is actually among the envelopes */ +- if (tranEnv > nEnvelopes) return 0; +- +- /* Check the noise borders */ +- if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0; +- +- if (startPos != startPosNoise || stopPos != stopPosNoise) return 0; +- +- /* Check that the start border for every noise-envelope is strictly later in +- * time*/ +- for (i = 0; i < nNoiseEnvelopes; i++) { +- if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1]) +- return 0; +- } +- +- /* Check that every noise border is the same as an envelope border*/ +- for (i = 0; i < nNoiseEnvelopes; i++) { +- startPosNoise = pFrameInfo->bordersNoise[i]; +- +- for (j = 0; j < nEnvelopes; j++) { +- if (pFrameInfo->borders[j] == startPosNoise) break; +- } +- if (j == nEnvelopes) return 0; +- } +- +- return 1; +-} +diff --git a/libSBRdec/src/env_extr.h b/libSBRdec/src/env_extr.h +deleted file mode 100644 +index 38c04a3..0000000 +--- a/libSBRdec/src/env_extr.h ++++ /dev/null +@@ -1,415 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope extraction prototypes +-*/ +- +-#ifndef ENV_EXTR_H +-#define ENV_EXTR_H +- +-#include "sbrdecoder.h" +- +-#include "FDK_bitstream.h" +-#include "lpp_tran.h" +- +-#include "psdec.h" +-#include "pvc_dec.h" +- +-#define ENV_EXP_FRACT 0 +-/*!< Shift raw envelope data to support fractional numbers. +- Can be set to 8 instead of 0 to enhance accuracy during concealment. +- This is not required for conformance and #requantizeEnvelopeData() will +- become more expensive. +-*/ +- +-#define EXP_BITS 6 +-/*!< Size of exponent-part of a pseudo float envelope value (should be at least +- 6). The remaining bits in each word are used for the mantissa (should be at +- least 10). This format is used in the arrays iEnvelope[] and +- sbrNoiseFloorLevel[] in the FRAME_DATA struct which must fit in a certain part +- of the output buffer (See buffer management in sbr_dec.cpp). Exponents and +- mantissas could also be stored in separate arrays. Accessing the exponent or +- the mantissa would be simplified and the masks #MASK_E resp. #MASK_M would +- no longer be required. +-*/ +- +-#define MASK_M \ +- (((1 << (FRACT_BITS - EXP_BITS)) - 1) \ +- << EXP_BITS) /*!< Mask for extracting the mantissa of a pseudo float \ +- envelope value */ +-#define MASK_E \ +- ((1 << EXP_BITS) - 1) /*!< Mask for extracting the exponent of a pseudo \ +- float envelope value */ +- +-#define SIGN_EXT \ +- (((SCHAR)-1) ^ \ +- MASK_E) /*!< a CHAR-constant with all bits above our sign-bit set */ +-#define ROUNDING \ +- ((FIXP_SGL)( \ +- 1 << (EXP_BITS - 1))) /*!< 0.5-offset for rounding the mantissa of a \ +- pseudo-float envelope value */ +-#define NRG_EXP_OFFSET \ +- 16 /*!< Will be added to the reference energy's exponent to prevent negative \ +- numbers */ +-#define NOISE_EXP_OFFSET \ +- 38 /*!< Will be added to the noise level exponent to prevent negative \ +- numbers */ +- +-#define ADD_HARMONICS_FLAGS_SIZE 2 /* ceil(MAX_FREQ_COEFFS/32) */ +- +-typedef enum { +- HEADER_NOT_PRESENT, +- HEADER_ERROR, +- HEADER_OK, +- HEADER_RESET +-} SBR_HEADER_STATUS; +- +-typedef enum { +- SBR_NOT_INITIALIZED = 0, +- UPSAMPLING = 1, +- SBR_HEADER = 2, +- SBR_ACTIVE = 3 +-} SBR_SYNC_STATE; +- +-typedef enum { COUPLING_OFF = 0, COUPLING_LEVEL, COUPLING_BAL } COUPLING_MODE; +- +-typedef struct { +- UCHAR nSfb[2]; /*!< Number of SBR-bands for low and high freq-resolution */ +- UCHAR nNfb; /*!< Actual number of noise bands to read from the bitstream*/ +- UCHAR numMaster; /*!< Number of SBR-bands in v_k_master */ +- UCHAR lowSubband; /*!< QMF-band where SBR frequency range starts */ +- UCHAR highSubband; /*!< QMF-band where SBR frequency range ends */ +- UCHAR ov_highSubband; /*!< if headerchange applies this value holds the old +- highband value -> highband value of overlap area; +- required for overlap in usac when headerchange +- occurs between XVAR and VARX frame */ +- UCHAR limiterBandTable[MAX_NUM_LIMITERS + 1]; /*!< Limiter band table. */ +- UCHAR noLimiterBands; /*!< Number of limiter bands. */ +- UCHAR nInvfBands; /*!< Number of bands for inverse filtering */ +- UCHAR +- *freqBandTable[2]; /*!< Pointers to freqBandTableLo and freqBandTableHi */ +- UCHAR freqBandTableLo[MAX_FREQ_COEFFS / 2 + 1]; +- /*!< Mapping of SBR bands to QMF bands for low frequency resolution */ +- UCHAR freqBandTableHi[MAX_FREQ_COEFFS + 1]; +- /*!< Mapping of SBR bands to QMF bands for high frequency resolution */ +- UCHAR freqBandTableNoise[MAX_NOISE_COEFFS + 1]; +- /*!< Mapping of SBR noise bands to QMF bands */ +- UCHAR v_k_master[MAX_FREQ_COEFFS + 1]; +- /*!< Master BandTable which freqBandTable is derived from */ +-} FREQ_BAND_DATA; +- +-typedef FREQ_BAND_DATA *HANDLE_FREQ_BAND_DATA; +- +-#define SBRDEC_ELD_GRID 1 +-#define SBRDEC_SYNTAX_SCAL 2 +-#define SBRDEC_SYNTAX_USAC 4 +-#define SBRDEC_SYNTAX_RSVD50 8 +-#define SBRDEC_USAC_INDEP \ +- 16 /* Flag indicating that USAC global independency flag is active. */ +-#define SBRDEC_LOW_POWER \ +- 32 /* Flag indicating that Low Power QMF mode shall be used. */ +-#define SBRDEC_PS_DECODED \ +- 64 /* Flag indicating that PS was decoded and rendered. */ +-#define SBRDEC_QUAD_RATE \ +- 128 /* Flag indicating that USAC SBR 4:1 is active. \ +- */ +-#define SBRDEC_USAC_HARMONICSBR \ +- 256 /* Flag indicating that USAC HBE tool is active. */ +-#define SBRDEC_LD_MPS_QMF \ +- 512 /* Flag indicating that the LD-MPS QMF shall be used. */ +-#define SBRDEC_USAC_ITES \ +- 1024 /* Flag indicating that USAC inter TES tool is active. */ +-#define SBRDEC_SYNTAX_DRM \ +- 2048 /* Flag indicating that DRM30/DRM+ reverse syntax is being used. */ +-#define SBRDEC_ELD_DOWNSCALE \ +- 4096 /* Flag indicating that ELD downscaled mode decoding is used */ +-#define SBRDEC_DOWNSAMPLE \ +- 8192 /* Flag indicating that the downsampling mode is used. */ +-#define SBRDEC_FLUSH 16384 /* Flag is used to flush all elements in use. */ +-#define SBRDEC_FORCE_RESET \ +- 32768 /* Flag is used to force a reset of all elements in use. */ +-#define SBRDEC_SKIP_QMF_ANA \ +- (1 << 21) /* Flag indicating that the input data is provided in the QMF \ +- domain. */ +-#define SBRDEC_SKIP_QMF_SYN \ +- (1 << 22) /* Flag indicating that the output data is exported in the QMF \ +- domain. */ +- +-#define SBRDEC_HDR_STAT_RESET 1 +-#define SBRDEC_HDR_STAT_UPDATE 2 +- +-typedef struct { +- UCHAR ampResolution; /*!< Amplitude resolution of envelope values (0: 1.5dB, +- 1: 3dB) */ +- UCHAR +- xover_band; /*!< Start index in #v_k_master[] used for dynamic crossover +- frequency */ +- UCHAR sbr_preprocessing; /*!< SBR prewhitening flag. */ +- UCHAR pvc_mode; /*!< Predictive vector coding mode */ +-} SBR_HEADER_DATA_BS_INFO; +- +-typedef struct { +- /* Changes in these variables causes a reset of the decoder */ +- UCHAR startFreq; /*!< Index for SBR start frequency */ +- UCHAR stopFreq; /*!< Index for SBR highest frequency */ +- UCHAR freqScale; /*!< 0: linear scale, 1-3 logarithmic scales */ +- UCHAR alterScale; /*!< Flag for coarser frequency resolution */ +- UCHAR noise_bands; /*!< Noise bands per octave, read from bitstream*/ +- +- /* don't require reset */ +- UCHAR limiterBands; /*!< Index for number of limiter bands per octave */ +- UCHAR limiterGains; /*!< Index to select gain limit */ +- UCHAR interpolFreq; /*!< Select gain calculation method (1: per QMF channel, +- 0: per SBR band) */ +- UCHAR smoothingLength; /*!< Smoothing of gains over time (0: on 1: off) */ +- +-} SBR_HEADER_DATA_BS; +- +-typedef struct { +- SBR_SYNC_STATE +- syncState; /*!< The current initialization status of the header */ +- +- UCHAR status; /*!< Flags field used for signaling a reset right before the +- processing starts and an update from config (e.g. ASC). */ +- UCHAR +- frameErrorFlag; /*!< Frame data valid flag. CAUTION: This variable will be +- overwritten by the flag stored in the element +- structure. This is necessary because of the frame +- delay. There it might happen that different slots use +- the same header. */ +- UCHAR numberTimeSlots; /*!< AAC: 16,15 */ +- UCHAR numberOfAnalysisBands; /*!< Number of QMF analysis bands */ +- UCHAR timeStep; /*!< Time resolution of SBR in QMF-slots */ +- UINT +- sbrProcSmplRate; /*!< SBR processing sampling frequency (!= +- OutputSamplingRate) (always: CoreSamplingRate * +- UpSamplingFactor; even in single rate mode) */ +- +- SBR_HEADER_DATA_BS bs_data; /*!< current SBR header. */ +- SBR_HEADER_DATA_BS bs_dflt; /*!< Default sbr header. */ +- SBR_HEADER_DATA_BS_INFO bs_info; /*!< SBR info. */ +- +- FREQ_BAND_DATA freqBandData; /*!< Pointer to struct #FREQ_BAND_DATA */ +- UCHAR pvcIDprev; +-} SBR_HEADER_DATA; +- +-typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; +- +-typedef struct { +- UCHAR frameClass; /*!< Select grid type */ +- UCHAR nEnvelopes; /*!< Number of envelopes */ +- UCHAR borders[MAX_ENVELOPES + 1]; /*!< Envelope borders (in SBR-timeslots, +- e.g. mp3PRO: 0..11) */ +- UCHAR freqRes[MAX_ENVELOPES]; /*!< Frequency resolution for each envelope +- (0=low, 1=high) */ +- SCHAR tranEnv; /*!< Transient envelope, -1 if none */ +- UCHAR nNoiseEnvelopes; /*!< Number of noise envelopes */ +- UCHAR +- bordersNoise[MAX_NOISE_ENVELOPES + 1]; /*!< borders of noise envelopes */ +- UCHAR pvcBorders[MAX_PVC_ENVELOPES + 1]; +- UCHAR noisePosition; +- UCHAR varLength; +-} FRAME_INFO; +- +-typedef struct { +- FIXP_SGL sfb_nrg_prev[MAX_FREQ_COEFFS]; /*!< Previous envelope (required for +- differential-coded values) */ +- FIXP_SGL +- prevNoiseLevel[MAX_NOISE_COEFFS]; /*!< Previous noise envelope (required +- for differential-coded values) */ +- COUPLING_MODE coupling; /*!< Stereo-mode of previous frame */ +- INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Previous strength of filtering +- in transposer */ +- UCHAR ampRes; /*!< Previous amplitude resolution (0: 1.5dB, 1: 3dB) */ +- UCHAR stopPos; /*!< Position in time where last envelope ended */ +- UCHAR frameErrorFlag; /*!< Previous frame status */ +- UCHAR prevSbrPitchInBins; /*!< Previous frame pitchInBins */ +- FRAME_INFO prevFrameInfo; +-} SBR_PREV_FRAME_DATA; +- +-typedef SBR_PREV_FRAME_DATA *HANDLE_SBR_PREV_FRAME_DATA; +- +-typedef struct { +- int nScaleFactors; /*!< total number of scalefactors in frame */ +- +- FRAME_INFO frameInfo; /*!< time grid for current frame */ +- UCHAR domain_vec[MAX_ENVELOPES]; /*!< Bitfield containing direction of +- delta-coding for each envelope +- (0:frequency, 1:time) */ +- UCHAR domain_vec_noise +- [MAX_NOISE_ENVELOPES]; /*!< Same as above, but for noise envelopes */ +- +- INVF_MODE +- sbr_invf_mode[MAX_INVF_BANDS]; /*!< Strength of filtering in transposer */ +- COUPLING_MODE coupling; /*!< Stereo-mode */ +- int ampResolutionCurrentFrame; /*!< Amplitude resolution of envelope values +- (0: 1.5dB, 1: 3dB) */ +- +- ULONG addHarmonics[ADD_HARMONICS_FLAGS_SIZE]; /*!< Flags for synthetic sine +- addition (aligned to MSB) */ +- +- FIXP_SGL iEnvelope[MAX_NUM_ENVELOPE_VALUES]; /*!< Envelope data */ +- FIXP_SGL sbrNoiseFloorLevel[MAX_NUM_NOISE_VALUES]; /*!< Noise envelope data */ +- UCHAR iTESactive; /*!< One flag for each envelope to enable USAC inter-TES */ +- UCHAR +- interTempShapeMode[MAX_ENVELOPES]; /*!< USAC inter-TES: +- bs_inter_temp_shape_mode[ch][env] +- value */ +- UCHAR pvcID[PVC_NTIMESLOT]; /*!< One PVC ID value for each time slot */ +- UCHAR ns; +- UCHAR sinusoidal_position; +- +- UCHAR sbrPatchingMode; +- UCHAR sbrOversamplingFlag; +- UCHAR sbrPitchInBins; +-} SBR_FRAME_DATA; +- +-typedef SBR_FRAME_DATA *HANDLE_SBR_FRAME_DATA; +- +-/*! +-\brief Maps sampling frequencies to frequencies for which setup tables are +-available +- +-Maps arbitary sampling frequency to nearest neighbors for which setup tables +-are available (e.g. 25600 -> 24000). +-Used for startFreq calculation. +-The mapping is defined in 14496-3 (4.6.18.2.6), fs(SBR), and table 4.82 +- +-\return mapped sampling frequency +-*/ +-UINT sbrdec_mapToStdSampleRate(UINT fs, +- UINT isUsac); /*!< Output sampling frequency */ +- +-void initSbrPrevFrameData(HANDLE_SBR_PREV_FRAME_DATA h_prev_data, +- int timeSlots); +- +-int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_FRAME_DATA hFrameDataLeft, +- HANDLE_SBR_FRAME_DATA hFrameDataRight, +- HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev, +- UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBitBuf, +- HANDLE_PS_DEC hParametricStereoDec, const UINT flags, +- const int overlap); +- +-SBR_HEADER_STATUS +-sbrGetHeaderData(HANDLE_SBR_HEADER_DATA headerData, +- HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags, +- const int fIsSbrData, const UCHAR configMode); +- +-/*! +- \brief Initialize SBR header data +- +- Copy default values to the header data struct and patch some entries +- depending on the core codec. +-*/ +-SBR_ERROR +-initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, +- const int sampleRateOut, const INT downscaleFactor, +- const int samplesPerFrame, const UINT flags, +- const int setDefaultHdr); +-#endif +- +-/* Convert headroom bits to exponent */ +-#define SCALE2EXP(s) (15 - (s)) +-#define EXP2SCALE(e) (15 - (e)) +diff --git a/libSBRdec/src/hbe.cpp b/libSBRdec/src/hbe.cpp +deleted file mode 100644 +index 3310dcd..0000000 +--- a/libSBRdec/src/hbe.cpp ++++ /dev/null +@@ -1,2202 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Fast FFT routines prototypes +- \author Fabian Haussel +-*/ +- +-#include "hbe.h" +-#include "qmf.h" +-#include "env_extr.h" +- +-#define HBE_MAX_QMF_BANDS (40) +- +-#define HBE_MAX_OUT_SLOTS (11) +- +-#define QMF_WIN_LEN \ +- (12 + 6 - 4 - 1) /* 6 subband slots extra delay to align with HQ - 4 slots \ +- to compensate for critical sampling delay - 1 slot to \ +- align critical sampling exactly (w additional time \ +- domain delay)*/ +- +-#ifndef PI +-#define PI 3.14159265358979323846 +-#endif +- +-static const int xProducts[MAX_STRETCH_HBE - 1] = { +- 1, 1, 1}; /* Cross products on(1)/off(0) for T=2,3,4. */ +-static const int startSubband2kL[33] = { +- 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, +- 6, 8, 8, 8, 8, 8, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12}; +- +-static const int pmin = 12; +- +-static const FIXP_DBL hintReal_F[4][3] = { +- {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(0.39840335f), +- FL2FXCONST_DBL(-0.39840335f)}, +- {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f), +- FL2FXCONST_DBL(-0.39840335f)}, +- {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(-0.39840335f), +- FL2FXCONST_DBL(0.39840335f)}, +- {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f), +- FL2FXCONST_DBL(0.39840335f)}}; +- +-static const FIXP_DBL factors[4] = { +- FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f), +- FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f)}; +- +-#define PSCALE 32 +- +-static const FIXP_DBL p_F[128] = {FL2FXCONST_DBL(0.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(1.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(2.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(3.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(4.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(5.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(6.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(7.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(8.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(9.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(10.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(11.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(12.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(13.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(14.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(15.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(16.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(17.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(18.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(19.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(20.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(21.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(22.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(23.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(24.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(25.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(26.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(27.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(28.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(29.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(30.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(31.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(32.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(33.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(34.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(35.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(36.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(37.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(38.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(39.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(40.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(41.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(42.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(43.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(44.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(45.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(46.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(47.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(48.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(49.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(50.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(51.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(52.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(53.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(54.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(55.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(56.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(57.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(58.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(59.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(60.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(61.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(62.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(63.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(64.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(65.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(66.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(67.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(68.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(69.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(70.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(71.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(72.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(73.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(74.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(75.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(76.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(77.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(78.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(79.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(80.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(81.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(82.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(83.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(84.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(85.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(86.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(87.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(88.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(89.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(90.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(91.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(92.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(93.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(94.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(95.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(96.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(97.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(98.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(99.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(100.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(101.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(102.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(103.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(104.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(105.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(106.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(107.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(108.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(109.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(110.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(111.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(112.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(113.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(114.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(115.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(116.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(117.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(118.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(119.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(120.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(121.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(122.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(123.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(124.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(125.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(126.f / (PSCALE * 12.f)), +- FL2FXCONST_DBL(127.f / (PSCALE * 12.f))}; +- +-static const FIXP_DBL band_F[64] = { +- FL2FXCONST_DBL((0.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((1.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((2.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((3.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((4.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((5.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((6.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((7.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((8.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((9.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((10.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((11.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((12.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((13.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((14.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((15.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((16.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((17.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((18.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((19.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((20.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((21.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((22.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((23.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((24.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((25.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((26.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((27.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((28.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((29.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((30.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((31.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((32.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((33.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((34.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((35.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((36.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((37.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((38.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((39.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((40.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((41.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((42.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((43.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((44.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((45.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((46.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((47.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((48.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((49.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((50.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((51.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((52.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((53.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((54.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((55.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((56.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((57.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((58.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((59.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((60.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((61.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((62.f * 2.f + 1) / (PSCALE << 2)), +- FL2FXCONST_DBL((63.f * 2.f + 1) / (PSCALE << 2))}; +- +-static const FIXP_DBL tr_str[3] = {FL2FXCONST_DBL(1.f / 4.f), +- FL2FXCONST_DBL(2.f / 4.f), +- FL2FXCONST_DBL(3.f / 4.f)}; +- +-static const FIXP_DBL stretchfac[3] = {FL2FXCONST_DBL(1.f / 2.f), +- FL2FXCONST_DBL(1.f / 3.f), +- FL2FXCONST_DBL(1.f / 4.f)}; +- +-static const FIXP_DBL cos_F[64] = { +- 26353028, -79043208, 131685776, -184244944, 236697216, -289006912, +- 341142496, -393072608, 444773984, -496191392, 547325824, -598114752, +- 648559104, -698597248, 748230016, -797411904, 846083200, -894275136, +- 941928192, -989013760, 1035474624, -1081340672, 1126555136, -1171063296, +- 1214893696, -1257992192, 1300332544, -1341889408, 1382612736, -1422503808, +- 1461586944, -1499741440, 1537039104, -1573364864, 1608743808, -1643196672, +- 1676617344, -1709028992, 1740450560, -1770784896, 1800089472, -1828273536, +- 1855357440, -1881356288, 1906190080, -1929876608, 1952428928, -1973777664, +- 1993962880, -2012922240, 2030670208, -2047216000, 2062508288, -2076559488, +- 2089376128, -2100932224, 2111196800, -2120214784, 2127953792, -2134394368, +- 2139565056, -2143444864, 2146026624, -2147321856}; +- +-static const FIXP_DBL twiddle[121] = {1073741824, +- 1071442860, +- 1064555814, +- 1053110176, +- 1037154959, +- 1016758484, +- 992008094, +- 963009773, +- 929887697, +- 892783698, +- 851856663, +- 807281846, +- 759250125, +- 707967178, +- 653652607, +- 596538995, +- 536870912, +- 474903865, +- 410903207, +- 345142998, +- 277904834, +- 209476638, +- 140151432, +- 70226075, +- 0, +- -70226075, +- -140151432, +- -209476638, +- -277904834, +- -345142998, +- -410903207, +- -474903865, +- -536870912, +- -596538995, +- -653652607, +- -707967178, +- -759250125, +- -807281846, +- -851856663, +- -892783698, +- -929887697, +- -963009773, +- -992008094, +- -1016758484, +- -1037154959, +- -1053110176, +- -1064555814, +- -1071442860, +- -1073741824, +- -1071442860, +- -1064555814, +- -1053110176, +- -1037154959, +- -1016758484, +- -992008094, +- -963009773, +- -929887697, +- -892783698, +- -851856663, +- -807281846, +- -759250125, +- -707967178, +- -653652607, +- -596538995, +- -536870912, +- -474903865, +- -410903207, +- -345142998, +- -277904834, +- -209476638, +- -140151432, +- -70226075, +- 0, +- 70226075, +- 140151432, +- 209476638, +- 277904834, +- 345142998, +- 410903207, +- 474903865, +- 536870912, +- 596538995, +- 653652607, +- 707967178, +- 759250125, +- 807281846, +- 851856663, +- 892783698, +- 929887697, +- 963009773, +- 992008094, +- 1016758484, +- 1037154959, +- 1053110176, +- 1064555814, +- 1071442860, +- 1073741824, +- 1071442860, +- 1064555814, +- 1053110176, +- 1037154959, +- 1016758484, +- 992008094, +- 963009773, +- 929887697, +- 892783698, +- 851856663, +- 807281846, +- 759250125, +- 707967178, +- 653652607, +- 596538995, +- 536870912, +- 474903865, +- 410903207, +- 345142998, +- 277904834, +- 209476638, +- 140151432, +- 70226075, +- 0}; +- +-#if FIXP_QTW == FIXP_SGL +-#define HTW(x) (x) +-#else +-#define HTW(x) FX_DBL2FX_QTW(FX_SGL2FX_DBL((const FIXP_SGL)x)) +-#endif +- +-static const FIXP_QTW post_twiddle_cos_8[8] = { +- HTW(-1606), HTW(4756), HTW(-7723), HTW(10394), +- HTW(-12665), HTW(14449), HTW(-15679), HTW(16305)}; +- +-static const FIXP_QTW post_twiddle_cos_16[16] = { +- HTW(-804), HTW(2404), HTW(-3981), HTW(5520), HTW(-7005), HTW(8423), +- HTW(-9760), HTW(11003), HTW(-12140), HTW(13160), HTW(-14053), HTW(14811), +- HTW(-15426), HTW(15893), HTW(-16207), HTW(16364)}; +- +-static const FIXP_QTW post_twiddle_cos_24[24] = { +- HTW(-536), HTW(1606), HTW(-2669), HTW(3720), HTW(-4756), HTW(5771), +- HTW(-6762), HTW(7723), HTW(-8652), HTW(9543), HTW(-10394), HTW(11200), +- HTW(-11958), HTW(12665), HTW(-13318), HTW(13913), HTW(-14449), HTW(14924), +- HTW(-15334), HTW(15679), HTW(-15956), HTW(16165), HTW(-16305), HTW(16375)}; +- +-static const FIXP_QTW post_twiddle_cos_32[32] = { +- HTW(-402), HTW(1205), HTW(-2006), HTW(2801), HTW(-3590), HTW(4370), +- HTW(-5139), HTW(5897), HTW(-6639), HTW(7366), HTW(-8076), HTW(8765), +- HTW(-9434), HTW(10080), HTW(-10702), HTW(11297), HTW(-11866), HTW(12406), +- HTW(-12916), HTW(13395), HTW(-13842), HTW(14256), HTW(-14635), HTW(14978), +- HTW(-15286), HTW(15557), HTW(-15791), HTW(15986), HTW(-16143), HTW(16261), +- HTW(-16340), HTW(16379)}; +- +-static const FIXP_QTW post_twiddle_cos_40[40] = { +- HTW(-322), HTW(965), HTW(-1606), HTW(2245), HTW(-2880), HTW(3511), +- HTW(-4137), HTW(4756), HTW(-5368), HTW(5971), HTW(-6566), HTW(7150), +- HTW(-7723), HTW(8285), HTW(-8833), HTW(9368), HTW(-9889), HTW(10394), +- HTW(-10883), HTW(11356), HTW(-11810), HTW(12247), HTW(-12665), HTW(13063), +- HTW(-13441), HTW(13799), HTW(-14135), HTW(14449), HTW(-14741), HTW(15011), +- HTW(-15257), HTW(15480), HTW(-15679), HTW(15853), HTW(-16003), HTW(16129), +- HTW(-16229), HTW(16305), HTW(-16356), HTW(16381)}; +- +-static const FIXP_QTW post_twiddle_sin_8[8] = { +- HTW(16305), HTW(-15679), HTW(14449), HTW(-12665), +- HTW(10394), HTW(-7723), HTW(4756), HTW(-1606)}; +- +-static const FIXP_QTW post_twiddle_sin_16[16] = { +- HTW(16364), HTW(-16207), HTW(15893), HTW(-15426), HTW(14811), HTW(-14053), +- HTW(13160), HTW(-12140), HTW(11003), HTW(-9760), HTW(8423), HTW(-7005), +- HTW(5520), HTW(-3981), HTW(2404), HTW(-804)}; +- +-static const FIXP_QTW post_twiddle_sin_24[24] = { +- HTW(16375), HTW(-16305), HTW(16165), HTW(-15956), HTW(15679), HTW(-15334), +- HTW(14924), HTW(-14449), HTW(13913), HTW(-13318), HTW(12665), HTW(-11958), +- HTW(11200), HTW(-10394), HTW(9543), HTW(-8652), HTW(7723), HTW(-6762), +- HTW(5771), HTW(-4756), HTW(3720), HTW(-2669), HTW(1606), HTW(-536)}; +- +-static const FIXP_QTW post_twiddle_sin_32[32] = { +- HTW(16379), HTW(-16340), HTW(16261), HTW(-16143), HTW(15986), HTW(-15791), +- HTW(15557), HTW(-15286), HTW(14978), HTW(-14635), HTW(14256), HTW(-13842), +- HTW(13395), HTW(-12916), HTW(12406), HTW(-11866), HTW(11297), HTW(-10702), +- HTW(10080), HTW(-9434), HTW(8765), HTW(-8076), HTW(7366), HTW(-6639), +- HTW(5897), HTW(-5139), HTW(4370), HTW(-3590), HTW(2801), HTW(-2006), +- HTW(1205), HTW(-402)}; +- +-static const FIXP_QTW post_twiddle_sin_40[40] = { +- HTW(16381), HTW(-16356), HTW(16305), HTW(-16229), HTW(16129), HTW(-16003), +- HTW(15853), HTW(-15679), HTW(15480), HTW(-15257), HTW(15011), HTW(-14741), +- HTW(14449), HTW(-14135), HTW(13799), HTW(-13441), HTW(13063), HTW(-12665), +- HTW(12247), HTW(-11810), HTW(11356), HTW(-10883), HTW(10394), HTW(-9889), +- HTW(9368), HTW(-8833), HTW(8285), HTW(-7723), HTW(7150), HTW(-6566), +- HTW(5971), HTW(-5368), HTW(4756), HTW(-4137), HTW(3511), HTW(-2880), +- HTW(2245), HTW(-1606), HTW(965), HTW(-322)}; +- +-static const FIXP_DBL preModCos[32] = { +- -749875776, 786681536, 711263552, -821592064, -670937792, 854523392, +- 628995648, -885396032, -585538240, 914135680, 540670208, -940673088, +- -494499680, 964944384, 447137824, -986891008, -398698816, 1006460096, +- 349299264, -1023604544, -299058240, 1038283072, 248096752, -1050460288, +- -196537584, 1060106816, 144504928, -1067199488, -92124160, 1071721152, +- 39521456, -1073660992}; +- +-static const FIXP_DBL preModSin[32] = { +- 768510144, 730789760, -804379072, -691308864, 838310208, 650162560, +- -870221760, -607449920, 900036928, 563273856, -927683776, -517740896, +- 953095808, 470960608, -976211712, -423045728, 996975808, 374111712, +- -1015338112, -324276416, 1031254400, 273659904, -1044686336, -222384144, +- 1055601472, 170572640, -1063973632, -118350192, 1069782528, 65842640, +- -1073014208, -13176464}; +- +-/* The cube root function */ +-/***************************************************************************** +- +- functionname: invCubeRootNorm2 +- description: delivers 1/cuberoot(op) in Q1.31 format and modified exponent +- +-*****************************************************************************/ +-#define CUBE_ROOT_BITS 7 +-#define CUBE_ROOT_VALUES (128 + 2) +-#define CUBE_ROOT_BITS_MASK 0x7f +-#define CUBE_ROOT_FRACT_BITS_MASK 0x007FFFFF +-/* Inverse cube root table for operands running from 0.5 to 1.0 */ +-/* (INT) (1.0/cuberoot((op))); */ +-/* Implicit exponent is 1. */ +- +-LNK_SECTION_CONSTDATA +-static const FIXP_DBL invCubeRootTab[CUBE_ROOT_VALUES] = { +- (0x50a28be6), (0x506d1172), (0x503823c4), (0x5003c05a), (0x4fcfe4c0), +- (0x4f9c8e92), (0x4f69bb7d), (0x4f37693b), (0x4f059594), (0x4ed43e5f), +- (0x4ea36181), (0x4e72fcea), (0x4e430e98), (0x4e139495), (0x4de48cf5), +- (0x4db5f5db), (0x4d87cd73), (0x4d5a11f2), (0x4d2cc19c), (0x4cffdabb), +- (0x4cd35ba4), (0x4ca742b7), (0x4c7b8e5c), (0x4c503d05), (0x4c254d2a), +- (0x4bfabd50), (0x4bd08c00), (0x4ba6b7cd), (0x4b7d3f53), (0x4b542134), +- (0x4b2b5c18), (0x4b02eeb1), (0x4adad7b8), (0x4ab315ea), (0x4a8ba80d), +- (0x4a648cec), (0x4a3dc35b), (0x4a174a30), (0x49f1204a), (0x49cb448d), +- (0x49a5b5e2), (0x49807339), (0x495b7b86), (0x4936cdc2), (0x491268ec), +- (0x48ee4c08), (0x48ca761f), (0x48a6e63e), (0x48839b76), (0x486094de), +- (0x483dd190), (0x481b50ad), (0x47f91156), (0x47d712b3), (0x47b553f0), +- (0x4793d43c), (0x477292c9), (0x47518ece), (0x4730c785), (0x47103c2d), +- (0x46efec06), (0x46cfd655), (0x46affa61), (0x46905777), (0x4670ece4), +- (0x4651b9f9), (0x4632be0b), (0x4613f871), (0x45f56885), (0x45d70da5), +- (0x45b8e72f), (0x459af487), (0x457d3511), (0x455fa835), (0x45424d5d), +- (0x452523f6), (0x45082b6e), (0x44eb6337), (0x44cecac5), (0x44b2618d), +- (0x44962708), (0x447a1ab1), (0x445e3c02), (0x44428a7c), (0x4427059e), +- (0x440bacec), (0x43f07fe9), (0x43d57e1c), (0x43baa70e), (0x439ffa48), +- (0x43857757), (0x436b1dc8), (0x4350ed2b), (0x4336e511), (0x431d050c), +- (0x43034cb2), (0x42e9bb98), (0x42d05156), (0x42b70d85), (0x429defc0), +- (0x4284f7a2), (0x426c24cb), (0x425376d8), (0x423aed6a), (0x42228823), +- (0x420a46a6), (0x41f22898), (0x41da2d9f), (0x41c25561), (0x41aa9f86), +- (0x41930bba), (0x417b99a5), (0x416448f5), (0x414d1956), (0x41360a76), +- (0x411f1c06), (0x41084db5), (0x40f19f35), (0x40db1039), (0x40c4a074), +- (0x40ae4f9b), (0x40981d64), (0x40820985), (0x406c13b6), (0x40563bb1), +- (0x4040812e), (0x402ae3e7), (0x40156399), (0x40000000), (0x3FEAB8D9)}; +-/* n.a. */ +-static const FIXP_DBL invCubeRootCorrection[3] = {0x40000000, 0x50A28BE6, +- 0x6597FA95}; +- +-/***************************************************************************** +- * \brief calculate 1.0/cube_root(op), op contains mantissa and exponent +- * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or +- * negative +- * \param op_e: (i) pointer to the exponent of the operand (must be initialized) +- * and .. (o) pointer to the exponent of the result +- * \return: (o) mantissa of the result +- * \description: +- * This routine calculates the cube root of the input operand, that is +- * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). +- * The resulting mantissa is returned in format Q31. The exponent (*op_e) +- * is modified accordingly. It is not assured, that the result is fully +- * left-aligned but assumed to have not more than 2 bits headroom. There is one +- * macro to activate the use of this algorithm: FUNCTION_invCubeRootNorm2 By +- * means of activating the macro INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ, a +- * slightly higher precision is reachable (by default, not active). For DEBUG +- * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater +- * zero. +- * +- */ +-static +-#ifdef __arm__ +- FIXP_DBL FDK_FORCEINLINE +- invCubeRootNorm2(FIXP_DBL op_m, INT* op_e) +-#else +- FIXP_DBL +- invCubeRootNorm2(FIXP_DBL op_m, INT* op_e) +-#endif +-{ +- FDK_ASSERT(op_m > FIXP_DBL(0)); +- +- /* normalize input, calculate shift value */ +- INT exponent = (INT)fNormz(op_m) - 1; +- op_m <<= exponent; +- +- INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (CUBE_ROOT_BITS + 1))) & +- CUBE_ROOT_BITS_MASK; +- FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & CUBE_ROOT_FRACT_BITS_MASK) +- << (CUBE_ROOT_BITS + 1)); +- FIXP_DBL diff = invCubeRootTab[index + 1] - invCubeRootTab[index]; +- op_m = fMultAddDiv2(invCubeRootTab[index], diff << 1, fract); +-#if defined(INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ) +- /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... + +- * (1-fract)fract*(t[i+2]-t[i+1])/2 */ +- if (fract != (FIXP_DBL)0) { +- /* fract = fract * (1 - fract) */ +- fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; +- diff = diff - (invCubeRootTab[index + 2] - invCubeRootTab[index + 1]); +- op_m = fMultAddDiv2(op_m, fract, diff); +- } +-#endif /* INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ */ +- +- /* calculate the output exponent = input * exp/3 = cubicroot(m)*2^(exp/3) +- * where 2^(exp/3) = 2^k'*2 or 2^k'*2^(1/3) or 2^k'*2^(2/3) */ +- exponent = exponent - *op_e + 3; +- INT shift_tmp = +- ((INT)fMultDiv2((FIXP_SGL)fAbs(exponent), (FIXP_SGL)0x5556)) >> 16; +- if (exponent < 0) { +- shift_tmp = -shift_tmp; +- } +- INT rem = exponent - 3 * shift_tmp; +- if (rem < 0) { +- rem += 3; +- shift_tmp--; +- } +- +- *op_e = shift_tmp; +- op_m = fMultDiv2(op_m, invCubeRootCorrection[rem]) << 2; +- +- return (op_m); +-} +- +- /***************************************************************************** +- +- functionname: invFourthRootNorm2 +- description: delivers 1/FourthRoot(op) in Q1.31 format and modified +- exponent +- +- *****************************************************************************/ +- +-#define FOURTHROOT_BITS 7 +-#define FOURTHROOT_VALUES (128 + 2) +-#define FOURTHROOT_BITS_MASK 0x7f +-#define FOURTHROOT_FRACT_BITS_MASK 0x007FFFFF +- +-LNK_SECTION_CONSTDATA +-static const FIXP_DBL invFourthRootTab[FOURTHROOT_VALUES] = { +- (0x4c1bf829), (0x4bf61977), (0x4bd09843), (0x4bab72ef), (0x4b86a7eb), +- (0x4b6235ac), (0x4b3e1ab6), (0x4b1a5592), (0x4af6e4d4), (0x4ad3c718), +- (0x4ab0fb03), (0x4a8e7f42), (0x4a6c5288), (0x4a4a7393), (0x4a28e126), +- (0x4a079a0c), (0x49e69d16), (0x49c5e91f), (0x49a57d04), (0x498557ac), +- (0x49657802), (0x4945dcf9), (0x49268588), (0x490770ac), (0x48e89d6a), +- (0x48ca0ac9), (0x48abb7d6), (0x488da3a6), (0x486fcd4f), (0x485233ed), +- (0x4834d6a3), (0x4817b496), (0x47faccf0), (0x47de1ee0), (0x47c1a999), +- (0x47a56c51), (0x47896643), (0x476d96af), (0x4751fcd6), (0x473697ff), +- (0x471b6773), (0x47006a81), (0x46e5a079), (0x46cb08ae), (0x46b0a279), +- (0x46966d34), (0x467c683d), (0x466292f4), (0x4648ecbc), (0x462f74fe), +- (0x46162b20), (0x45fd0e91), (0x45e41ebe), (0x45cb5b19), (0x45b2c315), +- (0x459a562a), (0x458213cf), (0x4569fb81), (0x45520cbc), (0x453a4701), +- (0x4522a9d1), (0x450b34b0), (0x44f3e726), (0x44dcc0ba), (0x44c5c0f7), +- (0x44aee768), (0x4498339e), (0x4481a527), (0x446b3b96), (0x4454f67e), +- (0x443ed576), (0x4428d815), (0x4412fdf3), (0x43fd46ad), (0x43e7b1de), +- (0x43d23f23), (0x43bcee1e), (0x43a7be6f), (0x4392afb8), (0x437dc19d), +- (0x4368f3c5), (0x435445d6), (0x433fb779), (0x432b4856), (0x4316f81a), +- (0x4302c66f), (0x42eeb305), (0x42dabd8a), (0x42c6e5ad), (0x42b32b21), +- (0x429f8d96), (0x428c0cc2), (0x4278a859), (0x42656010), (0x4252339e), +- (0x423f22bc), (0x422c2d23), (0x4219528b), (0x420692b2), (0x41f3ed51), +- (0x41e16228), (0x41cef0f2), (0x41bc9971), (0x41aa5b62), (0x41983687), +- (0x41862aa2), (0x41743775), (0x41625cc3), (0x41509a50), (0x413eefe2), +- (0x412d5d3e), (0x411be22b), (0x410a7e70), (0x40f931d5), (0x40e7fc23), +- (0x40d6dd24), (0x40c5d4a2), (0x40b4e268), (0x40a40642), (0x40933ffc), +- (0x40828f64), (0x4071f447), (0x40616e73), (0x4050fdb9), (0x4040a1e6), +- (0x40305acc), (0x4020283c), (0x40100a08), (0x40000000), (0x3ff009f9), +-}; +- +-static const FIXP_DBL invFourthRootCorrection[4] = {0x40000000, 0x4C1BF829, +- 0x5A82799A, 0x6BA27E65}; +- +-/* The fourth root function */ +-/***************************************************************************** +- * \brief calculate 1.0/fourth_root(op), op contains mantissa and exponent +- * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or +- * negative +- * \param op_e: (i) pointer to the exponent of the operand (must be initialized) +- * and .. (o) pointer to the exponent of the result +- * \return: (o) mantissa of the result +- * \description: +- * This routine calculates the cube root of the input operand, that is +- * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). +- * The resulting mantissa is returned in format Q31. The exponent (*op_e) +- * is modified accordingly. It is not assured, that the result is fully +- * left-aligned but assumed to have not more than 2 bits headroom. There is one +- * macro to activate the use of this algorithm: FUNCTION_invFourthRootNorm2 By +- * means of activating the macro INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a +- * slightly higher precision is reachable (by default, not active). For DEBUG +- * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater +- * zero. +- * +- */ +- +-/* #define INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ +- +-static +-#ifdef __arm__ +- FIXP_DBL FDK_FORCEINLINE +- invFourthRootNorm2(FIXP_DBL op_m, INT* op_e) +-#else +- FIXP_DBL +- invFourthRootNorm2(FIXP_DBL op_m, INT* op_e) +-#endif +-{ +- FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0)); +- +- /* normalize input, calculate shift value */ +- INT exponent = (INT)fNormz(op_m) - 1; +- op_m <<= exponent; +- +- INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (FOURTHROOT_BITS + 1))) & +- FOURTHROOT_BITS_MASK; +- FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & FOURTHROOT_FRACT_BITS_MASK) +- << (FOURTHROOT_BITS + 1)); +- FIXP_DBL diff = invFourthRootTab[index + 1] - invFourthRootTab[index]; +- op_m = invFourthRootTab[index] + (fMultDiv2(diff, fract) << 1); +- +-#if defined(INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ) +- /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... + +- * (1-fract)fract*(t[i+2]-t[i+1])/2 */ +- if (fract != (FIXP_DBL)0) { +- /* fract = fract * (1 - fract) */ +- fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; +- diff = diff - (invFourthRootTab[index + 2] - invFourthRootTab[index + 1]); +- op_m = fMultAddDiv2(op_m, fract, diff); +- } +-#endif /* INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ +- +- exponent = exponent - *op_e + 4; +- INT rem = exponent & 0x00000003; +- INT shift_tmp = (exponent >> 2); +- +- *op_e = shift_tmp; +- op_m = fMultDiv2(op_m, invFourthRootCorrection[rem]) << 2; +- +- return (op_m); +-} +- +-/***************************************************************************** +- +- functionname: inv3EigthRootNorm2 +- description: delivers 1/cubert(op) normalized to .5...1 and the shift value +-of the OUTPUT +- +-*****************************************************************************/ +-#define THREEIGTHROOT_BITS 7 +-#define THREEIGTHROOT_VALUES (128 + 2) +-#define THREEIGTHROOT_BITS_MASK 0x7f +-#define THREEIGTHROOT_FRACT_BITS_MASK 0x007FFFFF +- +-LNK_SECTION_CONSTDATA +-static const FIXP_DBL inv3EigthRootTab[THREEIGTHROOT_VALUES] = { +- (0x45cae0f2), (0x45b981bf), (0x45a8492a), (0x45973691), (0x45864959), +- (0x457580e6), (0x4564dca4), (0x45545c00), (0x4543fe6b), (0x4533c35a), +- (0x4523aa44), (0x4513b2a4), (0x4503dbf7), (0x44f425be), (0x44e48f7b), +- (0x44d518b6), (0x44c5c0f7), (0x44b687c8), (0x44a76cb8), (0x44986f58), +- (0x44898f38), (0x447acbef), (0x446c2514), (0x445d9a3f), (0x444f2b0d), +- (0x4440d71a), (0x44329e07), (0x44247f73), (0x44167b04), (0x4408905e), +- (0x43fabf28), (0x43ed070b), (0x43df67b0), (0x43d1e0c5), (0x43c471f7), +- (0x43b71af6), (0x43a9db71), (0x439cb31c), (0x438fa1ab), (0x4382a6d2), +- (0x4375c248), (0x4368f3c5), (0x435c3b03), (0x434f97bc), (0x434309ac), +- (0x43369091), (0x432a2c28), (0x431ddc30), (0x4311a06c), (0x4305789c), +- (0x42f96483), (0x42ed63e5), (0x42e17688), (0x42d59c30), (0x42c9d4a6), +- (0x42be1fb1), (0x42b27d1a), (0x42a6ecac), (0x429b6e2f), (0x42900172), +- (0x4284a63f), (0x42795c64), (0x426e23b0), (0x4262fbf2), (0x4257e4f9), +- (0x424cde96), (0x4241e89a), (0x423702d8), (0x422c2d23), (0x4221674d), +- (0x4216b12c), (0x420c0a94), (0x4201735b), (0x41f6eb57), (0x41ec725f), +- (0x41e2084b), (0x41d7acf3), (0x41cd6030), (0x41c321db), (0x41b8f1ce), +- (0x41aecfe5), (0x41a4bbf8), (0x419ab5e6), (0x4190bd89), (0x4186d2bf), +- (0x417cf565), (0x41732558), (0x41696277), (0x415faca1), (0x415603b4), +- (0x414c6792), (0x4142d818), (0x4139552a), (0x412fdea6), (0x41267470), +- (0x411d1668), (0x4113c472), (0x410a7e70), (0x41014445), (0x40f815d4), +- (0x40eef302), (0x40e5dbb4), (0x40dccfcd), (0x40d3cf33), (0x40cad9cb), +- (0x40c1ef7b), (0x40b9102a), (0x40b03bbd), (0x40a7721c), (0x409eb32e), +- (0x4095feda), (0x408d5508), (0x4084b5a0), (0x407c208b), (0x407395b2), +- (0x406b14fd), (0x40629e56), (0x405a31a6), (0x4051ced8), (0x404975d5), +- (0x40412689), (0x4038e0dd), (0x4030a4bd), (0x40287215), (0x402048cf), +- (0x401828d7), (0x4010121a), (0x40080483), (0x40000000), (0x3ff8047d), +-}; +- +-/* The last value is rounded in order to avoid any overflow due to the values +- * range of the root table */ +-static const FIXP_DBL inv3EigthRootCorrection[8] = { +- 0x40000000, 0x45CAE0F2, 0x4C1BF829, 0x52FF6B55, +- 0x5A82799A, 0x62B39509, 0x6BA27E65, 0x75606373}; +- +-/* The 3/8 root function */ +-/***************************************************************************** +- * \brief calculate 1.0/3Eigth_root(op) = 1.0/(x)^(3/8), op contains mantissa +- * and exponent +- * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or +- * negative +- * \param op_e: (i) pointer to the exponent of the operand (must be initialized) +- * and .. (o) pointer to the exponent of the result +- * \return: (o) mantissa of the result +- * \description: +- * This routine calculates the cube root of the input operand, that is +- * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). +- * The resulting mantissa is returned in format Q31. The exponent (*op_e) +- * is modified accordingly. It is not assured, that the result is fully +- * left-aligned but assumed to have not more than 2 bits headroom. There is one +- * macro to activate the use of this algorithm: FUNCTION_inv3EigthRootNorm2 By +- * means of activating the macro INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a +- * slightly higher precision is reachable (by default, not active). For DEBUG +- * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater +- * zero. +- * +- */ +- +-/* #define INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ +- +-static +-#ifdef __arm__ +- FIXP_DBL FDK_FORCEINLINE +- inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e) +-#else +- FIXP_DBL +- inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e) +-#endif +-{ +- FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0)); +- +- /* normalize input, calculate shift op_mue */ +- INT exponent = (INT)fNormz(op_m) - 1; +- op_m <<= exponent; +- +- INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (THREEIGTHROOT_BITS + 1))) & +- THREEIGTHROOT_BITS_MASK; +- FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & THREEIGTHROOT_FRACT_BITS_MASK) +- << (THREEIGTHROOT_BITS + 1)); +- FIXP_DBL diff = inv3EigthRootTab[index + 1] - inv3EigthRootTab[index]; +- op_m = inv3EigthRootTab[index] + (fMultDiv2(diff, fract) << 1); +- +-#if defined(INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ) +- /* op_m = t[i] + (t[i+1]-t[i])*fract ... already computed ... + +- * (1-fract)fract*(t[i+2]-t[i+1])/2 */ +- if (fract != (FIXP_DBL)0) { +- /* fract = fract * (1 - fract) */ +- fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; +- diff = diff - (inv3EigthRootTab[index + 2] - inv3EigthRootTab[index + 1]); +- op_m = fMultAddDiv2(op_m, fract, diff); +- } +-#endif /* INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ +- +- exponent = exponent - *op_e + 8; +- INT rem = exponent & 0x00000007; +- INT shift_tmp = (exponent >> 3); +- +- *op_e = shift_tmp * 3; +- op_m = fMultDiv2(op_m, inv3EigthRootCorrection[rem]) << 2; +- +- return (fMult(op_m, fMult(op_m, op_m))); +-} +- +-SBR_ERROR +-QmfTransposerCreate(HANDLE_HBE_TRANSPOSER* hQmfTransposer, const int frameSize, +- int bDisableCrossProducts, int bSbr41) { +- HANDLE_HBE_TRANSPOSER hQmfTran = NULL; +- +- int i; +- +- if (hQmfTransposer != NULL) { +- /* Memory allocation */ +- /*--------------------------------------------------------------------------------------------*/ +- hQmfTran = +- (HANDLE_HBE_TRANSPOSER)FDKcalloc(1, sizeof(struct hbeTransposer)); +- if (hQmfTran == NULL) { +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- for (i = 0; i < MAX_STRETCH_HBE - 1; i++) { +- hQmfTran->bXProducts[i] = (bDisableCrossProducts ? 0 : xProducts[i]); +- } +- +- hQmfTran->timeDomainWinLen = frameSize; +- if (frameSize == 768) { +- hQmfTran->noCols = +- (8 * frameSize / 3) / QMF_SYNTH_CHANNELS; /* 32 for 24:64 */ +- } else { +- hQmfTran->noCols = +- (bSbr41 + 1) * 2 * frameSize / +- QMF_SYNTH_CHANNELS; /* 32 for 32:64 and 64 for 16:64 -> identical to +- sbrdec->no_cols */ +- } +- +- hQmfTran->noChannels = frameSize / hQmfTran->noCols; +- +- hQmfTran->qmfInBufSize = QMF_WIN_LEN; +- hQmfTran->qmfOutBufSize = 2 * (hQmfTran->noCols / 2 + QMF_WIN_LEN - 1); +- +- hQmfTran->inBuf_F = +- (INT_PCM*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(INT_PCM)); +- /* buffered time signal needs to be delayed by synthesis_size; max +- * synthesis_size = 20; */ +- if (hQmfTran->inBuf_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- hQmfTran->qmfInBufReal_F = +- (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*)); +- hQmfTran->qmfInBufImag_F = +- (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*)); +- +- if (hQmfTran->qmfInBufReal_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- if (hQmfTran->qmfInBufImag_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- for (i = 0; i < hQmfTran->qmfInBufSize; i++) { +- hQmfTran->qmfInBufReal_F[i] = (FIXP_DBL*)FDKaalloc( +- QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT); +- hQmfTran->qmfInBufImag_F[i] = (FIXP_DBL*)FDKaalloc( +- QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT); +- if (hQmfTran->qmfInBufReal_F[i] == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- if (hQmfTran->qmfInBufImag_F[i] == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- } +- +- hQmfTran->qmfHBEBufReal_F = +- (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*)); +- hQmfTran->qmfHBEBufImag_F = +- (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*)); +- +- if (hQmfTran->qmfHBEBufReal_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- if (hQmfTran->qmfHBEBufImag_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { +- hQmfTran->qmfHBEBufReal_F[i] = +- (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL)); +- hQmfTran->qmfHBEBufImag_F[i] = +- (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL)); +- if (hQmfTran->qmfHBEBufReal_F[i] == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- if (hQmfTran->qmfHBEBufImag_F[i] == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- } +- +- hQmfTran->qmfBufferCodecTempSlot_F = +- (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS / 2, sizeof(FIXP_DBL)); +- if (hQmfTran->qmfBufferCodecTempSlot_F == NULL) { +- QmfTransposerClose(hQmfTran); +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- hQmfTran->bSbr41 = bSbr41; +- +- hQmfTran->highband_exp[0] = 0; +- hQmfTran->highband_exp[1] = 0; +- hQmfTran->target_exp[0] = 0; +- hQmfTran->target_exp[1] = 0; +- +- *hQmfTransposer = hQmfTran; +- } +- +- return SBRDEC_OK; +-} +- +-SBR_ERROR QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer, +- UCHAR* FreqBandTable[2], UCHAR NSfb[2]) +-/* removed bSbr41 from parameterlist: +- don't know where to get this value from +- at call-side */ +-{ +- int L, sfb, patch, stopPatch, qmfErr; +- +- if (hQmfTransposer != NULL) { +- const FIXP_QTW* tmp_t_cos; +- const FIXP_QTW* tmp_t_sin; +- +- hQmfTransposer->startBand = FreqBandTable[0][0]; +- FDK_ASSERT((!hQmfTransposer->bSbr41 && hQmfTransposer->startBand <= 32) || +- (hQmfTransposer->bSbr41 && +- hQmfTransposer->startBand <= +- 16)); /* is checked by resetFreqBandTables() */ +- hQmfTransposer->stopBand = FreqBandTable[0][NSfb[0]]; +- +- hQmfTransposer->synthSize = +- 4 * ((hQmfTransposer->startBand + 4) / 8 + 1); /* 8, 12, 16, 20 */ +- hQmfTransposer->kstart = startSubband2kL[hQmfTransposer->startBand]; +- +- /* don't know where to take this information from */ +- /* hQmfTransposer->bSbr41 = bSbr41; */ +- +- if (hQmfTransposer->bSbr41) { +- if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 16) +- hQmfTransposer->kstart = 16 - hQmfTransposer->synthSize; +- } else if (hQmfTransposer->timeDomainWinLen == 768) { +- if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 24) +- hQmfTransposer->kstart = 24 - hQmfTransposer->synthSize; +- } +- +- hQmfTransposer->synthesisQmfPreModCos_F = +- &preModCos[hQmfTransposer->kstart]; +- hQmfTransposer->synthesisQmfPreModSin_F = +- &preModSin[hQmfTransposer->kstart]; +- +- L = 2 * hQmfTransposer->synthSize; /* 8, 16, 24, 32, 40 */ +- /* Change analysis post twiddles */ +- +- switch (L) { +- case 8: +- tmp_t_cos = post_twiddle_cos_8; +- tmp_t_sin = post_twiddle_sin_8; +- break; +- case 16: +- tmp_t_cos = post_twiddle_cos_16; +- tmp_t_sin = post_twiddle_sin_16; +- break; +- case 24: +- tmp_t_cos = post_twiddle_cos_24; +- tmp_t_sin = post_twiddle_sin_24; +- break; +- case 32: +- tmp_t_cos = post_twiddle_cos_32; +- tmp_t_sin = post_twiddle_sin_32; +- break; +- case 40: +- tmp_t_cos = post_twiddle_cos_40; +- tmp_t_sin = post_twiddle_sin_40; +- break; +- default: +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- qmfErr = qmfInitSynthesisFilterBank( +- &hQmfTransposer->HBESynthesisQMF, hQmfTransposer->synQmfStates, +- hQmfTransposer->noCols, 0, hQmfTransposer->synthSize, +- hQmfTransposer->synthSize, 1); +- if (qmfErr != 0) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- qmfErr = qmfInitAnalysisFilterBank( +- &hQmfTransposer->HBEAnalysiscQMF, hQmfTransposer->anaQmfStates, +- hQmfTransposer->noCols / 2, 0, 2 * hQmfTransposer->synthSize, +- 2 * hQmfTransposer->synthSize, 0); +- +- if (qmfErr != 0) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- hQmfTransposer->HBEAnalysiscQMF.t_cos = tmp_t_cos; +- hQmfTransposer->HBEAnalysiscQMF.t_sin = tmp_t_sin; +- +- FDKmemset(hQmfTransposer->xOverQmf, 0, +- MAX_NUM_PATCHES * sizeof(int)); /* global */ +- sfb = 0; +- if (hQmfTransposer->bSbr41) { +- stopPatch = MAX_NUM_PATCHES; +- hQmfTransposer->maxStretch = MAX_STRETCH_HBE; +- } else { +- stopPatch = MAX_STRETCH_HBE; +- } +- +- for (patch = 1; patch <= stopPatch; patch++) { +- while (sfb <= NSfb[0] && +- FreqBandTable[0][sfb] <= patch * hQmfTransposer->startBand) +- sfb++; +- if (sfb <= NSfb[0]) { +- /* If the distance is larger than three QMF bands - try aligning to high +- * resolution frequency bands instead. */ +- if ((patch * hQmfTransposer->startBand - FreqBandTable[0][sfb - 1]) <= +- 3) { +- hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[0][sfb - 1]; +- } else { +- int sfb_tmp = 0; +- while (sfb_tmp <= NSfb[1] && +- FreqBandTable[1][sfb_tmp] <= patch * hQmfTransposer->startBand) +- sfb_tmp++; +- hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[1][sfb_tmp - 1]; +- } +- } else { +- hQmfTransposer->xOverQmf[patch - 1] = hQmfTransposer->stopBand; +- hQmfTransposer->maxStretch = fMin(patch, MAX_STRETCH_HBE); +- break; +- } +- } +- +- hQmfTransposer->highband_exp[0] = 0; +- hQmfTransposer->highband_exp[1] = 0; +- hQmfTransposer->target_exp[0] = 0; +- hQmfTransposer->target_exp[1] = 0; +- } +- +- return SBRDEC_OK; +-} +- +-void QmfTransposerClose(HANDLE_HBE_TRANSPOSER hQmfTransposer) { +- int i; +- +- if (hQmfTransposer != NULL) { +- if (hQmfTransposer->inBuf_F) FDKfree(hQmfTransposer->inBuf_F); +- +- if (hQmfTransposer->qmfInBufReal_F) { +- for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) { +- FDKafree(hQmfTransposer->qmfInBufReal_F[i]); +- } +- FDKfree(hQmfTransposer->qmfInBufReal_F); +- } +- +- if (hQmfTransposer->qmfInBufImag_F) { +- for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) { +- FDKafree(hQmfTransposer->qmfInBufImag_F[i]); +- } +- FDKfree(hQmfTransposer->qmfInBufImag_F); +- } +- +- if (hQmfTransposer->qmfHBEBufReal_F) { +- for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { +- FDKfree(hQmfTransposer->qmfHBEBufReal_F[i]); +- } +- FDKfree(hQmfTransposer->qmfHBEBufReal_F); +- } +- +- if (hQmfTransposer->qmfHBEBufImag_F) { +- for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { +- FDKfree(hQmfTransposer->qmfHBEBufImag_F[i]); +- } +- FDKfree(hQmfTransposer->qmfHBEBufImag_F); +- } +- +- FDKfree(hQmfTransposer->qmfBufferCodecTempSlot_F); +- +- FDKfree(hQmfTransposer); +- } +-} +- +-inline void scaleUp(FIXP_DBL* real_m, FIXP_DBL* imag_m, INT* _e) { +- INT reserve; +- /* shift gc_r and gc_i up if possible */ +- reserve = CntLeadingZeros((INT(*real_m) ^ INT((*real_m >> 31))) | +- (INT(*imag_m) ^ INT((*imag_m >> 31)))) - +- 1; +- reserve = fMax(reserve - 1, +- 0); /* Leave one bit headroom such that (real_m^2 + imag_m^2) +- does not overflow later if both are 0x80000000. */ +- reserve = fMin(reserve, *_e); +- FDK_ASSERT(reserve >= 0); +- *real_m <<= reserve; +- *imag_m <<= reserve; +- *_e -= reserve; +-} +- +-static void calculateCenterFIXP(FIXP_DBL gammaVecReal, FIXP_DBL gammaVecImag, +- FIXP_DBL* centerReal, FIXP_DBL* centerImag, +- INT* exponent, int stretch, int mult) { +- scaleUp(&gammaVecReal, &gammaVecImag, exponent); +- FIXP_DBL energy = fPow2Div2(gammaVecReal) + fPow2Div2(gammaVecImag); +- +- if (energy != FL2FXCONST_DBL(0.f)) { +- FIXP_DBL gc_r_m, gc_i_m, factor_m = (FIXP_DBL)0; +- INT factor_e, gc_e; +- factor_e = 2 * (*exponent) + 1; +- +- switch (stretch) { +- case 2: +- factor_m = invFourthRootNorm2(energy, &factor_e); +- break; +- case 3: +- factor_m = invCubeRootNorm2(energy, &factor_e); +- break; +- case 4: +- factor_m = inv3EigthRootNorm2(energy, &factor_e); +- break; +- } +- +- gc_r_m = fMultDiv2(gammaVecReal, +- factor_m); /* exponent = HBE_SCALE + factor_e + 1 */ +- gc_i_m = fMultDiv2(gammaVecImag, +- factor_m); /* exponent = HBE_SCALE + factor_e + 1*/ +- gc_e = *exponent + factor_e + 1; +- +- scaleUp(&gc_r_m, &gc_i_m, &gc_e); +- +- switch (mult) { +- case 0: +- *centerReal = gc_r_m; +- *centerImag = gc_i_m; +- break; +- case 1: +- *centerReal = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m); +- *centerImag = fMult(gc_r_m, gc_i_m); +- gc_e = 2 * gc_e + 1; +- break; +- case 2: +- FIXP_DBL tmp_r = gc_r_m; +- FIXP_DBL tmp_i = gc_i_m; +- gc_r_m = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m); +- gc_i_m = fMult(tmp_r, gc_i_m); +- gc_e = 3 * gc_e + 1 + 1; +- cplxMultDiv2(¢erReal[0], ¢erImag[0], gc_r_m, gc_i_m, tmp_r, +- tmp_i); +- break; +- } +- +- scaleUp(centerReal, centerImag, &gc_e); +- +- FDK_ASSERT(gc_e >= 0); +- *exponent = gc_e; +- } else { +- *centerReal = energy; /* energy = 0 */ +- *centerImag = energy; /* energy = 0 */ +- *exponent = (INT)energy; +- } +-} +- +-static int getHBEScaleFactorFrame(const int bSbr41, const int maxStretch, +- const int pitchInBins) { +- if (pitchInBins >= pmin * (1 + bSbr41)) { +- /* crossproducts enabled */ +- return 26; +- } else { +- return (maxStretch == 2) ? 24 : 25; +- } +-} +- +-static void addHighBandPart(FIXP_DBL g_r_m, FIXP_DBL g_i_m, INT g_e, +- FIXP_DBL mult, FIXP_DBL gammaCenterReal_m, +- FIXP_DBL gammaCenterImag_m, INT gammaCenter_e, +- INT stretch, INT scale_factor_hbe, +- FIXP_DBL* qmfHBEBufReal_F, +- FIXP_DBL* qmfHBEBufImag_F) { +- if ((g_r_m | g_i_m) != FL2FXCONST_DBL(0.f)) { +- FIXP_DBL factor_m = (FIXP_DBL)0; +- INT factor_e; +- INT add = (stretch == 4) ? 1 : 0; +- INT shift = (stretch == 4) ? 1 : 2; +- +- scaleUp(&g_r_m, &g_i_m, &g_e); +- FIXP_DBL energy = fPow2AddDiv2(fPow2Div2(g_r_m), g_i_m); +- factor_e = 2 * g_e + 1; +- +- switch (stretch) { +- case 2: +- factor_m = invFourthRootNorm2(energy, &factor_e); +- break; +- case 3: +- factor_m = invCubeRootNorm2(energy, &factor_e); +- break; +- case 4: +- factor_m = inv3EigthRootNorm2(energy, &factor_e); +- break; +- } +- +- factor_m = fMult(factor_m, mult); +- +- FIXP_DBL tmp_r, tmp_i; +- cplxMultDiv2(&tmp_r, &tmp_i, g_r_m, g_i_m, gammaCenterReal_m, +- gammaCenterImag_m); +- +- g_r_m = fMultDiv2(tmp_r, factor_m) << shift; +- g_i_m = fMultDiv2(tmp_i, factor_m) << shift; +- g_e = scale_factor_hbe - (g_e + factor_e + gammaCenter_e + add); +- fMax((INT)0, g_e); +- *qmfHBEBufReal_F += g_r_m >> g_e; +- *qmfHBEBufImag_F += g_i_m >> g_e; +- } +-} +- +-void QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer, +- FIXP_DBL** qmfBufferCodecReal, +- FIXP_DBL** qmfBufferCodecImag, int nColsIn, +- FIXP_DBL** ppQmfBufferOutReal_F, +- FIXP_DBL** ppQmfBufferOutImag_F, +- FIXP_DBL lpcFilterStatesReal[2 + (3 * (4))][(64)], +- FIXP_DBL lpcFilterStatesImag[2 + (3 * (4))][(64)], +- int pitchInBins, int scale_lb, int scale_hbe, +- int* scale_hb, int timeStep, int firstSlotOffsset, +- int ov_len, +- KEEP_STATES_SYNCED_MODE keepStatesSyncedMode) { +- int i, j, stretch, band, sourceband, r, s; +- int qmfVocoderColsIn = hQmfTransposer->noCols / 2; +- int bSbr41 = hQmfTransposer->bSbr41; +- +- const int winLength[3] = {10, 8, 6}; +- const int slotOffset = 6; /* hQmfTransposer->winLen-6; */ +- +- int qmfOffset = 2 * hQmfTransposer->kstart; +- int scale_border = (nColsIn == 64) ? 32 : nColsIn; +- +- INT slot_stretch4[9] = {0, 0, 0, 0, 2, 4, 6, 8, 10}; +- INT slot_stretch2[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +- INT slot_stretch3[10] = {0, 0, 0, 1, 3, 4, 6, 7, 9, 10}; +- INT filt_stretch3[10] = {0, 0, 0, 1, 0, 1, 0, 1, 0, 1}; +- INT filt_dummy[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +- INT* pSlotStretch; +- INT* pFilt; +- +- int offset = 0; /* where to take QmfTransposer data */ +- +- int signPreMod = +- (hQmfTransposer->synthesisQmfPreModCos_F[0] < FL2FXCONST_DBL(0.f)) ? 1 +- : -1; +- +- int scale_factor_hbe = +- getHBEScaleFactorFrame(bSbr41, hQmfTransposer->maxStretch, pitchInBins); +- +- if (keepStatesSyncedMode != KEEP_STATES_SYNCED_OFF) { +- offset = hQmfTransposer->noCols - ov_len - LPC_ORDER; +- } +- +- hQmfTransposer->highband_exp[0] = hQmfTransposer->highband_exp[1]; +- hQmfTransposer->target_exp[0] = hQmfTransposer->target_exp[1]; +- +- hQmfTransposer->highband_exp[1] = scale_factor_hbe; +- hQmfTransposer->target_exp[1] = +- fixMax(hQmfTransposer->highband_exp[1], hQmfTransposer->highband_exp[0]); +- +- scale_factor_hbe = hQmfTransposer->target_exp[1]; +- +- int shift_ov = hQmfTransposer->target_exp[0] - hQmfTransposer->target_exp[1]; +- +- if (shift_ov != 0) { +- for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { +- for (band = 0; band < QMF_SYNTH_CHANNELS; band++) { +- if (shift_ov >= 0) { +- hQmfTransposer->qmfHBEBufReal_F[i][band] <<= shift_ov; +- hQmfTransposer->qmfHBEBufImag_F[i][band] <<= shift_ov; +- } else { +- hQmfTransposer->qmfHBEBufReal_F[i][band] >>= (-shift_ov); +- hQmfTransposer->qmfHBEBufImag_F[i][band] >>= (-shift_ov); +- } +- } +- } +- } +- +- if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_OFF) && shift_ov != 0) { +- for (i = timeStep * firstSlotOffsset; i < ov_len; i++) { +- for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; +- band++) { +- if (shift_ov >= 0) { +- ppQmfBufferOutReal_F[i][band] <<= shift_ov; +- ppQmfBufferOutImag_F[i][band] <<= shift_ov; +- } else { +- ppQmfBufferOutReal_F[i][band] >>= (-shift_ov); +- ppQmfBufferOutImag_F[i][band] >>= (-shift_ov); +- } +- } +- } +- +- /* shift lpc filterstates */ +- for (i = 0; i < timeStep * firstSlotOffsset + LPC_ORDER; i++) { +- for (band = 0; band < (64); band++) { +- if (shift_ov >= 0) { +- lpcFilterStatesReal[i][band] <<= shift_ov; +- lpcFilterStatesImag[i][band] <<= shift_ov; +- } else { +- lpcFilterStatesReal[i][band] >>= (-shift_ov); +- lpcFilterStatesImag[i][band] >>= (-shift_ov); +- } +- } +- } +- } +- +- FIXP_DBL twid_m_new[3][2]; /* [stretch][cos/sin] */ +- INT stepsize = 1 + !bSbr41, sine_offset = 24, mod = 96; +- INT mult[3] = {1, 2, 3}; +- +- for (s = 0; s <= MAX_STRETCH_HBE - 2; s++) { +- twid_m_new[s][0] = twiddle[(mult[s] * (stepsize * pitchInBins)) % mod]; +- twid_m_new[s][1] = +- twiddle[((mult[s] * (stepsize * pitchInBins)) + sine_offset) % mod]; +- } +- +- /* Time-stretch */ +- for (j = 0; j < qmfVocoderColsIn; j++) { +- int sign = -1, k, z, addrshift, codecTemp_e; +- /* update inbuf */ +- for (i = 0; i < hQmfTransposer->synthSize; i++) { +- hQmfTransposer->inBuf_F[i] = +- hQmfTransposer->inBuf_F[i + 2 * hQmfTransposer->synthSize]; +- } +- +- /* run synthesis for two sbr slots as transposer uses +- half slots double bands representation */ +- for (z = 0; z < 2; z++) { +- int scale_factor = ((nColsIn == 64) && ((2 * j + z) < scale_border)) +- ? scale_lb +- : scale_hbe; +- codecTemp_e = scale_factor - 1; /* -2 for Div2 and cos/sin scale of 1 */ +- +- for (k = 0; k < hQmfTransposer->synthSize; k++) { +- int ki = hQmfTransposer->kstart + k; +- hQmfTransposer->qmfBufferCodecTempSlot_F[k] = +- fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModCos_F[k], +- qmfBufferCodecReal[2 * j + z][ki]); +- hQmfTransposer->qmfBufferCodecTempSlot_F[k] += +- fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModSin_F[k], +- qmfBufferCodecImag[2 * j + z][ki]); +- } +- +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); +- +- qmfSynthesisFilteringSlot( +- &hQmfTransposer->HBESynthesisQMF, +- hQmfTransposer->qmfBufferCodecTempSlot_F, NULL, 0, +- -7 - hQmfTransposer->HBESynthesisQMF.filterScale - codecTemp_e + 1, +- hQmfTransposer->inBuf_F + hQmfTransposer->synthSize * (z + 1), 1, +- pWorkBuffer); +- +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); +- } +- +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); +- +- qmfAnalysisFilteringSlot(&hQmfTransposer->HBEAnalysiscQMF, +- hQmfTransposer->qmfInBufReal_F[QMF_WIN_LEN - 1], +- hQmfTransposer->qmfInBufImag_F[QMF_WIN_LEN - 1], +- hQmfTransposer->inBuf_F + 1, 1, pWorkBuffer); +- +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); +- +- if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_NORMAL) && +- j <= qmfVocoderColsIn - ((LPC_ORDER + ov_len + QMF_WIN_LEN - 1) >> 1)) { +- /* update in buffer */ +- for (i = 0; i < QMF_WIN_LEN - 1; i++) { +- FDKmemcpy( +- hQmfTransposer->qmfInBufReal_F[i], +- hQmfTransposer->qmfInBufReal_F[i + 1], +- sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); +- FDKmemcpy( +- hQmfTransposer->qmfInBufImag_F[i], +- hQmfTransposer->qmfInBufImag_F[i + 1], +- sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); +- } +- continue; +- } +- +- for (stretch = 2; stretch <= hQmfTransposer->maxStretch; stretch++) { +- int start = slotOffset - winLength[stretch - 2] / 2; +- int stop = slotOffset + winLength[stretch - 2] / 2; +- +- FIXP_DBL factor = FL2FXCONST_DBL(1.f / 3.f); +- +- for (band = hQmfTransposer->xOverQmf[stretch - 2]; +- band < hQmfTransposer->xOverQmf[stretch - 1]; band++) { +- FIXP_DBL gammaCenterReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}, +- gammaCenterImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}; +- INT gammaCenter_e[2] = {0, 0}; +- +- FIXP_DBL gammaVecReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}, +- gammaVecImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}; +- INT gammaVec_e[2] = {0, 0}; +- +- FIXP_DBL wingain = (FIXP_DBL)0; +- +- gammaCenter_e[0] = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- gammaCenter_e[1] = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- +- /* interpolation filters for 3rd order */ +- sourceband = 2 * band / stretch - qmfOffset; +- FDK_ASSERT(sourceband >= 0); +- +- /* maximum gammaCenter_e == 20 */ +- calculateCenterFIXP( +- hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband], +- hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband], +- &gammaCenterReal_m[0], &gammaCenterImag_m[0], &gammaCenter_e[0], +- stretch, stretch - 2); +- +- if (stretch == 4) { +- r = band - 2 * (band / 2); +- sourceband += (r == 0) ? -1 : 1; +- pSlotStretch = slot_stretch4; +- factor = FL2FXCONST_DBL(2.f / 3.f); +- pFilt = filt_dummy; +- } else if (stretch == 2) { +- r = 0; +- sourceband = 2 * band / stretch - qmfOffset; +- pSlotStretch = slot_stretch2; +- factor = FL2FXCONST_DBL(1.f / 3.f); +- pFilt = filt_dummy; +- } else { +- r = 2 * band - 3 * (2 * band / 3); +- sourceband = 2 * band / stretch - qmfOffset; +- pSlotStretch = slot_stretch3; +- factor = FL2FXCONST_DBL(1.4142f / 3.0f); +- pFilt = filt_stretch3; +- } +- +- if (r == 2) { +- calculateCenterFIXP( +- hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband + 1], +- hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband + 1], +- &gammaCenterReal_m[1], &gammaCenterImag_m[1], &gammaCenter_e[1], +- stretch, stretch - 2); +- +- factor = FL2FXCONST_DBL(1.4142f / 6.0f); +- } +- +- if (r == 2) { +- for (k = start; k < stop; k++) { +- gammaVecReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband]; +- gammaVecReal_m[1] = +- hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband + 1]; +- gammaVecImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband]; +- gammaVecImag_m[1] = +- hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband + 1]; +- gammaVec_e[0] = gammaVec_e[1] = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- +- if (pFilt[k] == 1) { +- FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF; +- gammaVecReal_m[0] = +- (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) - +- fMult(gammaVecImag_m[0], +- hintReal_F[(sourceband + 3) % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVecImag_m[0] = +- (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) + +- fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- +- tmpRealF = hQmfTransposer +- ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband]; +- tmpImagF = hQmfTransposer +- ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband]; +- +- gammaVecReal_m[0] += +- (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) - +- fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVecImag_m[0] += +- (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) + +- fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVec_e[0]++; +- +- tmpRealF = gammaVecReal_m[1]; +- +- gammaVecReal_m[1] = +- (fMult(gammaVecReal_m[1], hintReal_F[sourceband % 4][2]) - +- fMult(gammaVecImag_m[1], +- hintReal_F[(sourceband + 3) % 4][2])) >> +- 1; +- gammaVecImag_m[1] = +- (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][2]) + +- fMult(gammaVecImag_m[1], hintReal_F[sourceband % 4][2])) >> +- 1; +- +- tmpRealF = +- hQmfTransposer +- ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband + 1]; +- tmpImagF = +- hQmfTransposer +- ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband + 1]; +- +- gammaVecReal_m[1] += +- (fMult(tmpRealF, hintReal_F[sourceband % 4][2]) - +- fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][2])) >> +- 1; +- gammaVecImag_m[1] += +- (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][2]) + +- fMult(tmpImagF, hintReal_F[sourceband % 4][2])) >> +- 1; +- gammaVec_e[1]++; +- } +- +- addHighBandPart(gammaVecReal_m[1], gammaVecImag_m[1], gammaVec_e[1], +- factor, gammaCenterReal_m[0], gammaCenterImag_m[0], +- gammaCenter_e[0], stretch, scale_factor_hbe, +- &hQmfTransposer->qmfHBEBufReal_F[k][band], +- &hQmfTransposer->qmfHBEBufImag_F[k][band]); +- +- addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0], +- factor, gammaCenterReal_m[1], gammaCenterImag_m[1], +- gammaCenter_e[1], stretch, scale_factor_hbe, +- &hQmfTransposer->qmfHBEBufReal_F[k][band], +- &hQmfTransposer->qmfHBEBufImag_F[k][band]); +- } +- } else { +- for (k = start; k < stop; k++) { +- gammaVecReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband]; +- gammaVecImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband]; +- gammaVec_e[0] = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- +- if (pFilt[k] == 1) { +- FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF; +- gammaVecReal_m[0] = +- (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) - +- fMult(gammaVecImag_m[0], +- hintReal_F[(sourceband + 3) % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVecImag_m[0] = +- (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) + +- fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- +- tmpRealF = hQmfTransposer +- ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband]; +- tmpImagF = hQmfTransposer +- ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband]; +- +- gammaVecReal_m[0] += +- (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) - +- fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVecImag_m[0] += +- (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) + +- fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >> +- 1; /* sum should be <= 1 because of sin/cos multiplication */ +- gammaVec_e[0]++; +- } +- +- addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0], +- factor, gammaCenterReal_m[0], gammaCenterImag_m[0], +- gammaCenter_e[0], stretch, scale_factor_hbe, +- &hQmfTransposer->qmfHBEBufReal_F[k][band], +- &hQmfTransposer->qmfHBEBufImag_F[k][band]); +- } +- } +- +- /* pitchInBins is given with the resolution of a 768 bins FFT and we +- * need 64 QMF units so factor 768/64 = 12 */ +- if (pitchInBins >= pmin * (1 + bSbr41)) { +- int tr, ti1, ti2, mTr = 0, ts1 = 0, ts2 = 0, mVal_e = 0, temp_e = 0; +- int sqmag0_e = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- +- FIXP_DBL mVal_F = FL2FXCONST_DBL(0.f), sqmag0_F, sqmag1_F, sqmag2_F, +- temp_F, f1_F; /* all equal exponent */ +- sign = -1; +- +- sourceband = 2 * band / stretch - qmfOffset; /* consistent with the +- already computed for +- stretch = 3,4. */ +- FDK_ASSERT(sourceband >= 0); +- +- FIXP_DBL sqmag0R_F = +- hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband]; +- FIXP_DBL sqmag0I_F = +- hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband]; +- scaleUp(&sqmag0R_F, &sqmag0I_F, &sqmag0_e); +- +- sqmag0_F = fPow2Div2(sqmag0R_F); +- sqmag0_F += fPow2Div2(sqmag0I_F); +- sqmag0_e = 2 * sqmag0_e + 1; +- +- for (tr = 1; tr < stretch; tr++) { +- int sqmag1_e = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- int sqmag2_e = +- SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- +- FIXP_DBL tmp_band = band_F[band]; +- FIXP_DBL tr_p = +- fMult(p_F[pitchInBins] >> bSbr41, tr_str[tr - 1]); /* scale 7 */ +- f1_F = +- fMult(tmp_band - tr_p, stretchfac[stretch - 2]); /* scale 7 */ +- ti1 = (INT)(f1_F >> (DFRACT_BITS - 1 - 7)) - qmfOffset; +- ti2 = (INT)(((f1_F) + ((p_F[pitchInBins] >> bSbr41) >> 2)) >> +- (DFRACT_BITS - 1 - 7)) - +- qmfOffset; +- +- if (ti1 >= 0 && ti2 < 2 * hQmfTransposer->synthSize) { +- FIXP_DBL sqmag1R_F = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ti1]; +- FIXP_DBL sqmag1I_F = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ti1]; +- scaleUp(&sqmag1R_F, &sqmag1I_F, &sqmag1_e); +- sqmag1_F = fPow2Div2(sqmag1R_F); +- sqmag1_F += fPow2Div2(sqmag1I_F); +- sqmag1_e = 2 * sqmag1_e + 1; +- +- FIXP_DBL sqmag2R_F = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ti2]; +- FIXP_DBL sqmag2I_F = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ti2]; +- scaleUp(&sqmag2R_F, &sqmag2I_F, &sqmag2_e); +- sqmag2_F = fPow2Div2(sqmag2R_F); +- sqmag2_F += fPow2Div2(sqmag2I_F); +- sqmag2_e = 2 * sqmag2_e + 1; +- +- int shift1 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag1_e, 31); +- int shift2 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag2_e, 31); +- +- temp_F = fMin((sqmag1_F >> shift1), (sqmag2_F >> shift2)); +- temp_e = fMax(sqmag1_e, sqmag2_e); +- +- int shift3 = fMin(fMax(temp_e, mVal_e) - temp_e, 31); +- int shift4 = fMin(fMax(temp_e, mVal_e) - mVal_e, 31); +- +- if ((temp_F >> shift3) > (mVal_F >> shift4)) { +- mVal_F = temp_F; +- mVal_e = temp_e; /* equals sqmag2_e + shift2 */ +- mTr = tr; +- ts1 = ti1; +- ts2 = ti2; +- } +- } +- } +- +- int shift1 = fMin(fMax(sqmag0_e, mVal_e) - sqmag0_e, 31); +- int shift2 = fMin(fMax(sqmag0_e, mVal_e) - mVal_e, 31); +- +- if ((mVal_F >> shift2) > (sqmag0_F >> shift1) && ts1 >= 0 && +- ts2 < 2 * hQmfTransposer->synthSize) { +- INT gammaOut_e[2]; +- FIXP_DBL gammaOutReal_m[2], gammaOutImag_m[2]; +- FIXP_DBL tmpReal_m = (FIXP_DBL)0, tmpImag_m = (FIXP_DBL)0; +- +- int Tcenter, Tvec; +- +- Tcenter = stretch - mTr; /* default phase power parameters */ +- Tvec = mTr; +- switch (stretch) /* 2 tap block creation design depends on stretch +- order */ +- { +- case 2: +- wingain = +- FL2FXCONST_DBL(5.f / 12.f); /* sum of taps divided by two */ +- +- if (hQmfTransposer->bXProducts[0]) { +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; +- +- for (k = 0; k < 2; k++) { +- gammaVecReal_m[k] = +- hQmfTransposer->qmfInBufReal_F[slotOffset - 1 + k][ts2]; +- gammaVecImag_m[k] = +- hQmfTransposer->qmfInBufImag_F[slotOffset - 1 + k][ts2]; +- } +- +- gammaCenter_e[0] = SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- } +- break; +- +- case 4: +- wingain = +- FL2FXCONST_DBL(6.f / 12.f); /* sum of taps divided by two */ +- if (hQmfTransposer->bXProducts[2]) { +- if (mTr == 1) { +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; +- +- for (k = 0; k < 2; k++) { +- gammaVecReal_m[k] = +- hQmfTransposer +- ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts2]; +- gammaVecImag_m[k] = +- hQmfTransposer +- ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts2]; +- } +- } else if (mTr == 2) { +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; +- +- for (k = 0; k < 2; k++) { +- gammaVecReal_m[k] = +- hQmfTransposer +- ->qmfInBufReal_F[slotOffset + (k - 1)][ts2]; +- gammaVecImag_m[k] = +- hQmfTransposer +- ->qmfInBufImag_F[slotOffset + (k - 1)][ts2]; +- } +- } else /* (mTr == 3) */ +- { +- sign = 1; +- Tcenter = mTr; /* opposite phase power parameters as ts2 is +- center */ +- Tvec = stretch - mTr; +- +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; +- +- for (k = 0; k < 2; k++) { +- gammaVecReal_m[k] = +- hQmfTransposer +- ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts1]; +- gammaVecImag_m[k] = +- hQmfTransposer +- ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts1]; +- } +- } +- +- gammaCenter_e[0] = SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- } +- break; +- +- case 3: +- wingain = FL2FXCONST_DBL(5.6568f / +- 12.f); /* sum of taps divided by two */ +- +- if (hQmfTransposer->bXProducts[1]) { +- FIXP_DBL tmpReal_F, tmpImag_F; +- if (mTr == 1) { +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; +- gammaVecReal_m[1] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; +- gammaVecImag_m[1] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; +- +- addrshift = -2; +- tmpReal_F = +- hQmfTransposer +- ->qmfInBufReal_F[addrshift + slotOffset][ts2]; +- tmpImag_F = +- hQmfTransposer +- ->qmfInBufImag_F[addrshift + slotOffset][ts2]; +- +- gammaVecReal_m[0] = +- (fMult(factors[ts2 % 4], tmpReal_F) - +- fMult(factors[(ts2 + 3) % 4], tmpImag_F)) >> +- 1; +- gammaVecImag_m[0] = +- (fMult(factors[(ts2 + 3) % 4], tmpReal_F) + +- fMult(factors[ts2 % 4], tmpImag_F)) >> +- 1; +- +- tmpReal_F = +- hQmfTransposer +- ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts2]; +- tmpImag_F = +- hQmfTransposer +- ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts2]; +- +- gammaVecReal_m[0] += +- (fMult(factors[ts2 % 4], tmpReal_F) - +- fMult(factors[(ts2 + 1) % 4], tmpImag_F)) >> +- 1; +- gammaVecImag_m[0] += +- (fMult(factors[(ts2 + 1) % 4], tmpReal_F) + +- fMult(factors[ts2 % 4], tmpImag_F)) >> +- 1; +- +- } else /* (mTr == 2) */ +- { +- sign = 1; +- Tcenter = mTr; /* opposite phase power parameters as ts2 is +- center */ +- Tvec = stretch - mTr; +- +- gammaCenterReal_m[0] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; +- gammaCenterImag_m[0] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; +- gammaVecReal_m[1] = +- hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; +- gammaVecImag_m[1] = +- hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; +- +- addrshift = -2; +- tmpReal_F = +- hQmfTransposer +- ->qmfInBufReal_F[addrshift + slotOffset][ts1]; +- tmpImag_F = +- hQmfTransposer +- ->qmfInBufImag_F[addrshift + slotOffset][ts1]; +- +- gammaVecReal_m[0] = +- (fMult(factors[ts1 % 4], tmpReal_F) - +- fMult(factors[(ts1 + 3) % 4], tmpImag_F)) >> +- 1; +- gammaVecImag_m[0] = +- (fMult(factors[(ts1 + 3) % 4], tmpReal_F) + +- fMult(factors[ts1 % 4], tmpImag_F)) >> +- 1; +- +- tmpReal_F = +- hQmfTransposer +- ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts1]; +- tmpImag_F = +- hQmfTransposer +- ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts1]; +- +- gammaVecReal_m[0] += +- (fMult(factors[ts1 % 4], tmpReal_F) - +- fMult(factors[(ts1 + 1) % 4], tmpImag_F)) >> +- 1; +- gammaVecImag_m[0] += +- (fMult(factors[(ts1 + 1) % 4], tmpReal_F) + +- fMult(factors[ts1 % 4], tmpImag_F)) >> +- 1; +- } +- +- gammaCenter_e[0] = gammaVec_e[1] = SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); +- gammaVec_e[0] = +- SCALE2EXP( +- -hQmfTransposer->HBEAnalysiscQMF.outScalefactor) + +- 1; +- } +- break; +- default: +- FDK_ASSERT(0); +- break; +- } /* stretch cases */ +- +- /* parameter controlled phase modification parts */ +- /* maximum *_e == 20 */ +- calculateCenterFIXP(gammaCenterReal_m[0], gammaCenterImag_m[0], +- &gammaCenterReal_m[0], &gammaCenterImag_m[0], +- &gammaCenter_e[0], stretch, Tcenter - 1); +- calculateCenterFIXP(gammaVecReal_m[0], gammaVecImag_m[0], +- &gammaVecReal_m[0], &gammaVecImag_m[0], +- &gammaVec_e[0], stretch, Tvec - 1); +- calculateCenterFIXP(gammaVecReal_m[1], gammaVecImag_m[1], +- &gammaVecReal_m[1], &gammaVecImag_m[1], +- &gammaVec_e[1], stretch, Tvec - 1); +- +- /* Final multiplication of prepared parts */ +- for (k = 0; k < 2; k++) { +- gammaOutReal_m[k] = +- fMultDiv2(gammaVecReal_m[k], gammaCenterReal_m[0]) - +- fMultDiv2(gammaVecImag_m[k], gammaCenterImag_m[0]); +- gammaOutImag_m[k] = +- fMultDiv2(gammaVecReal_m[k], gammaCenterImag_m[0]) + +- fMultDiv2(gammaVecImag_m[k], gammaCenterReal_m[0]); +- gammaOut_e[k] = gammaCenter_e[0] + gammaVec_e[k] + 1; +- } +- +- scaleUp(&gammaOutReal_m[0], &gammaOutImag_m[0], &gammaOut_e[0]); +- scaleUp(&gammaOutReal_m[1], &gammaOutImag_m[1], &gammaOut_e[1]); +- FDK_ASSERT(gammaOut_e[0] >= 0); +- FDK_ASSERT(gammaOut_e[0] < 32); +- +- tmpReal_m = gammaOutReal_m[0]; +- tmpImag_m = gammaOutImag_m[0]; +- +- INT modstretch4 = ((stretch == 4) && (mTr == 2)); +- +- FIXP_DBL cos_twid = twid_m_new[stretch - 2 - modstretch4][0]; +- FIXP_DBL sin_twid = sign * twid_m_new[stretch - 2 - modstretch4][1]; +- +- gammaOutReal_m[0] = +- fMult(tmpReal_m, cos_twid) - +- fMult(tmpImag_m, sin_twid); /* sum should be <= 1 because of +- sin/cos multiplication */ +- gammaOutImag_m[0] = +- fMult(tmpImag_m, cos_twid) + +- fMult(tmpReal_m, sin_twid); /* sum should be <= 1 because of +- sin/cos multiplication */ +- +- /* wingain */ +- for (k = 0; k < 2; k++) { +- gammaOutReal_m[k] = (fMult(gammaOutReal_m[k], wingain) << 1); +- gammaOutImag_m[k] = (fMult(gammaOutImag_m[k], wingain) << 1); +- } +- +- gammaOutReal_m[1] >>= 1; +- gammaOutImag_m[1] >>= 1; +- gammaOut_e[0] += 2; +- gammaOut_e[1] += 2; +- +- /* OLA including window scaling by wingain/3 */ +- for (k = 0; k < 2; k++) /* need k=1 to correspond to +- grainModImag[slotOffset] -> out to +- j*2+(slotOffset-offset) */ +- { +- hQmfTransposer->qmfHBEBufReal_F[(k + slotOffset - 1)][band] += +- gammaOutReal_m[k] >> (scale_factor_hbe - gammaOut_e[k]); +- hQmfTransposer->qmfHBEBufImag_F[(k + slotOffset - 1)][band] += +- gammaOutImag_m[k] >> (scale_factor_hbe - gammaOut_e[k]); +- } +- } /* mVal > qThrQMF * qThrQMF * sqmag0 && ts1 > 0 && ts2 < 64 */ +- } /* p >= pmin */ +- } /* for band */ +- } /* for stretch */ +- +- for (i = 0; i < QMF_WIN_LEN - 1; i++) { +- FDKmemcpy(hQmfTransposer->qmfInBufReal_F[i], +- hQmfTransposer->qmfInBufReal_F[i + 1], +- sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); +- FDKmemcpy(hQmfTransposer->qmfInBufImag_F[i], +- hQmfTransposer->qmfInBufImag_F[i + 1], +- sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); +- } +- +- if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) { +- if (2 * j >= offset) { +- /* copy first two slots of internal buffer to output */ +- if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) { +- for (i = 0; i < 2; i++) { +- FDKmemcpy(&ppQmfBufferOutReal_F[2 * j - offset + i] +- [hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer +- ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- FDKmemcpy(&ppQmfBufferOutImag_F[2 * j - offset + i] +- [hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer +- ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- } +- } else { +- for (i = 0; i < 2; i++) { +- FDKmemcpy(&ppQmfBufferOutReal_F[2 * j + i + ov_len] +- [hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer +- ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- FDKmemcpy(&ppQmfBufferOutImag_F[2 * j + i + ov_len] +- [hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer +- ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- } +- } +- } +- } +- +- /* move slots up */ +- for (i = 0; i < HBE_MAX_OUT_SLOTS - 2; i++) { +- FDKmemcpy( +- &hQmfTransposer->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer->qmfHBEBufReal_F[i + 2][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- FDKmemcpy( +- &hQmfTransposer->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], +- &hQmfTransposer->qmfHBEBufImag_F[i + 2][hQmfTransposer->xOverQmf[0]], +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- } +- +- /* finally set last two slot to zero */ +- for (i = 0; i < 2; i++) { +- FDKmemset(&hQmfTransposer->qmfHBEBufReal_F[HBE_MAX_OUT_SLOTS - 1 - i] +- [hQmfTransposer->xOverQmf[0]], +- 0, +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- FDKmemset(&hQmfTransposer->qmfHBEBufImag_F[HBE_MAX_OUT_SLOTS - 1 - i] +- [hQmfTransposer->xOverQmf[0]], +- 0, +- (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * +- sizeof(FIXP_DBL)); +- } +- } /* qmfVocoderColsIn */ +- +- if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) { +- if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) { +- for (i = 0; i < ov_len + LPC_ORDER; i++) { +- for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; +- band++) { +- FIXP_DBL tmpR = ppQmfBufferOutReal_F[i][band]; +- FIXP_DBL tmpI = ppQmfBufferOutImag_F[i][band]; +- +- ppQmfBufferOutReal_F[i][band] = +- fMult(tmpR, cos_F[band]) - +- fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1 +- because of sin/cos +- multiplication */ +- ppQmfBufferOutImag_F[i][band] = +- fMult(tmpR, (-cos_F[64 - band - 1])) + +- fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos +- multiplication */ +- } +- } +- } else { +- for (i = offset; i < hQmfTransposer->noCols; i++) { +- for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; +- band++) { +- FIXP_DBL tmpR = ppQmfBufferOutReal_F[i + ov_len][band]; +- FIXP_DBL tmpI = ppQmfBufferOutImag_F[i + ov_len][band]; +- +- ppQmfBufferOutReal_F[i + ov_len][band] = +- fMult(tmpR, cos_F[band]) - +- fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1 +- because of sin/cos +- multiplication */ +- ppQmfBufferOutImag_F[i + ov_len][band] = +- fMult(tmpR, (-cos_F[64 - band - 1])) + +- fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos +- multiplication */ +- } +- } +- } +- } +- +- *scale_hb = EXP2SCALE(scale_factor_hbe); +-} +- +-int* GetxOverBandQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) { +- if (hQmfTransposer) +- return hQmfTransposer->xOverQmf; +- else +- return NULL; +-} +- +-int Get41SbrQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) { +- if (hQmfTransposer != NULL) +- return hQmfTransposer->bSbr41; +- else +- return 0; +-} +diff --git a/libSBRdec/src/hbe.h b/libSBRdec/src/hbe.h +deleted file mode 100644 +index fdffe1e..0000000 +--- a/libSBRdec/src/hbe.h ++++ /dev/null +@@ -1,200 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#ifndef HBE_H +-#define HBE_H +- +-#include "sbrdecoder.h" +- +-#ifndef QMF_SYNTH_CHANNELS +-#define QMF_SYNTH_CHANNELS (64) +-#endif +- +-#define HBE_QMF_FILTER_STATE_ANA_SIZE (400) +-#define HBE_QMF_FILTER_STATE_SYN_SIZE (200) +- +-#ifndef MAX_NUM_PATCHES_HBE +-#define MAX_NUM_PATCHES_HBE (6) +-#endif +-#define MAX_STRETCH_HBE (4) +- +-typedef enum { +- KEEP_STATES_SYNCED_OFF = 0, /*!< normal QMF transposer behaviour */ +- KEEP_STATES_SYNCED_NORMAL = 1, /*!< QMF transposer called for syncing of +- states the last 8/14 slots are calculated in +- case next frame is HBE */ +- KEEP_STATES_SYNCED_OUTDIFF = +- 2, /*!< QMF transposer behaviour as in normal case, but the calculated +- slots are directly written to overlap area of buffer; only used in +- resetSbrDec function */ +- KEEP_STATES_SYNCED_NOOUT = +- 3 /*!< QMF transposer is called for syncing of states only, not output +- is generated at all; only used in resetSbrDec function */ +-} KEEP_STATES_SYNCED_MODE; +- +-struct hbeTransposer { +- int xOverQmf[MAX_NUM_PATCHES_HBE]; +- +- int maxStretch; +- int timeDomainWinLen; +- int qmfInBufSize; +- int qmfOutBufSize; +- int noCols; +- int noChannels; +- int startBand; +- int stopBand; +- int bSbr41; +- +- INT_PCM *inBuf_F; +- FIXP_DBL **qmfInBufReal_F; +- FIXP_DBL **qmfInBufImag_F; +- +- FIXP_DBL *qmfBufferCodecTempSlot_F; +- +- QMF_FILTER_BANK HBEAnalysiscQMF; +- QMF_FILTER_BANK HBESynthesisQMF; +- +- FIXP_DBL const *synthesisQmfPreModCos_F; +- FIXP_DBL const *synthesisQmfPreModSin_F; +- +- FIXP_QAS anaQmfStates[HBE_QMF_FILTER_STATE_ANA_SIZE]; +- FIXP_QSS synQmfStates[HBE_QMF_FILTER_STATE_SYN_SIZE]; +- +- FIXP_DBL **qmfHBEBufReal_F; +- FIXP_DBL **qmfHBEBufImag_F; +- +- int bXProducts[MAX_STRETCH_HBE]; +- +- int kstart; +- int synthSize; +- +- int highband_exp[2]; +- int target_exp[2]; +-}; +- +-typedef struct hbeTransposer *HANDLE_HBE_TRANSPOSER; +- +-SBR_ERROR QmfTransposerCreate(HANDLE_HBE_TRANSPOSER *hQmfTransposer, +- const int frameSize, int bDisableCrossProducts, +- int bSbr41); +- +-SBR_ERROR QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer, +- UCHAR *FreqBandTable[2], UCHAR NSfb[2]); +- +-void QmfTransposerClose(HANDLE_HBE_TRANSPOSER hQmfTransposer); +- +-void QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer, +- FIXP_DBL **qmfBufferCodecReal, +- FIXP_DBL **qmfBufferCodecImag, int nColsIn, +- FIXP_DBL **ppQmfBufferOutReal_F, +- FIXP_DBL **ppQmfBufferOutImag_F, +- FIXP_DBL lpcFilterStatesReal[2 + (3 * (4))][(64)], +- FIXP_DBL lpcFilterStatesImag[2 + (3 * (4))][(64)], +- int pitchInBins, int scale_lb, int scale_hbe, +- int *scale_hb, int timeStep, int firstSlotOffsset, +- int ov_len, +- KEEP_STATES_SYNCED_MODE keepStatesSyncedMode); +- +-int *GetxOverBandQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer); +- +-int Get41SbrQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer); +-#endif /* HBE_H */ +diff --git a/libSBRdec/src/huff_dec.cpp b/libSBRdec/src/huff_dec.cpp +deleted file mode 100644 +index 90c9541..0000000 +--- a/libSBRdec/src/huff_dec.cpp ++++ /dev/null +@@ -1,137 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Huffman Decoder +-*/ +- +-#include "huff_dec.h" +- +-/***************************************************************************/ +-/*! +- \brief Decodes one huffman code word +- +- Reads bits from the bitstream until a valid codeword is found. +- The table entries are interpreted either as index to the next entry +- or - if negative - as the codeword. +- +- \return decoded value +- +- \author +- +-****************************************************************************/ +-int DecodeHuffmanCW(Huffman h, /*!< pointer to huffman codebook table */ +- HANDLE_FDK_BITSTREAM hBs) /*!< Handle to Bitbuffer */ +-{ +- SCHAR index = 0; +- int value, bit; +- +- while (index >= 0) { +- bit = FDKreadBits(hBs, 1); +- index = h[index][bit]; +- } +- +- value = index + 64; /* Add offset */ +- +- return value; +-} +diff --git a/libSBRdec/src/huff_dec.h b/libSBRdec/src/huff_dec.h +deleted file mode 100644 +index 9aa62b4..0000000 +--- a/libSBRdec/src/huff_dec.h ++++ /dev/null +@@ -1,117 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Huffman Decoder +-*/ +-#ifndef HUFF_DEC_H +-#define HUFF_DEC_H +- +-#include "sbrdecoder.h" +-#include "FDK_bitstream.h" +- +-typedef const SCHAR (*Huffman)[2]; +- +-int DecodeHuffmanCW(Huffman h, HANDLE_FDK_BITSTREAM hBitBuf); +- +-#endif +diff --git a/libSBRdec/src/lpp_tran.cpp b/libSBRdec/src/lpp_tran.cpp +deleted file mode 100644 +index 2ef07eb..0000000 +--- a/libSBRdec/src/lpp_tran.cpp ++++ /dev/null +@@ -1,1471 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Low Power Profile Transposer +- This module provides the transposer. The main entry point is lppTransposer(). +- The function generates high frequency content by copying data from the low +- band (provided by core codec) into the high band. This process is also +- referred to as "patching". The function also implements spectral whitening by +- means of inverse filtering based on LPC coefficients. +- +- Together with the QMF filterbank the transposer can be tested using a supplied +- test program. See main_audio.cpp for details. This module does use fractional +- arithmetic and the accuracy of the computations has an impact on the overall +- sound quality. The module also needs to take into account the different +- scaling of spectral data. +- +- \sa lppTransposer(), main_audio.cpp, sbr_scale.h, \ref documentationOverview +-*/ +- +-#ifdef __ANDROID__ +-#include "log/log.h" +-#endif +- +-#include "lpp_tran.h" +- +-#include "sbr_ram.h" +-#include "sbr_rom.h" +- +-#include "genericStds.h" +-#include "autocorr2nd.h" +- +-#include "HFgen_preFlat.h" +- +-#if defined(__arm__) +-#include "arm/lpp_tran_arm.cpp" +-#endif +- +-#define LPC_SCALE_FACTOR 2 +- +-/*! +- * +- * \brief Get bandwidth expansion factor from filtering level +- * +- * Returns a filter parameter (bandwidth expansion factor) depending on +- * the desired filtering level signalled in the bitstream. +- * When switching the filtering level from LOW to OFF, an additional +- * level is being inserted to achieve a smooth transition. +- */ +- +-static FIXP_DBL mapInvfMode(INVF_MODE mode, INVF_MODE prevMode, +- WHITENING_FACTORS whFactors) { +- switch (mode) { +- case INVF_LOW_LEVEL: +- if (prevMode == INVF_OFF) +- return whFactors.transitionLevel; +- else +- return whFactors.lowLevel; +- +- case INVF_MID_LEVEL: +- return whFactors.midLevel; +- +- case INVF_HIGH_LEVEL: +- return whFactors.highLevel; +- +- default: +- if (prevMode == INVF_LOW_LEVEL) +- return whFactors.transitionLevel; +- else +- return whFactors.off; +- } +-} +- +-/*! +- * +- * \brief Perform inverse filtering level emphasis +- * +- * Retrieve bandwidth expansion factor and apply smoothing for each filter band +- * +- */ +- +-static void inverseFilteringLevelEmphasis( +- HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ +- UCHAR nInvfBands, /*!< Number of bands for inverse filtering */ +- INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ +- INVF_MODE *sbr_invf_mode_prev, /*!< Previous inverse filtering modes */ +- FIXP_DBL *bwVector /*!< Resulting filtering levels */ +-) { +- for (int i = 0; i < nInvfBands; i++) { +- FIXP_DBL accu; +- FIXP_DBL bwTmp = mapInvfMode(sbr_invf_mode[i], sbr_invf_mode_prev[i], +- hLppTrans->pSettings->whFactors); +- +- if (bwTmp < hLppTrans->bwVectorOld[i]) { +- accu = fMultDiv2(FL2FXCONST_DBL(0.75f), bwTmp) + +- fMultDiv2(FL2FXCONST_DBL(0.25f), hLppTrans->bwVectorOld[i]); +- } else { +- accu = fMultDiv2(FL2FXCONST_DBL(0.90625f), bwTmp) + +- fMultDiv2(FL2FXCONST_DBL(0.09375f), hLppTrans->bwVectorOld[i]); +- } +- +- if (accu> 1) { +- bwVector[i] = FL2FXCONST_DBL(0.0f); +- } else { +- bwVector[i] = fixMin(accu << 1, FL2FXCONST_DBL(0.99609375f)); +- } +- } +-} +- +-/* Resulting autocorrelation determinant exponent */ +-#define ACDET_EXP \ +- (2 * (DFRACT_BITS + sbrScaleFactor->lb_scale + 10 - ac.det_scale)) +-#define AC_EXP (-sbrScaleFactor->lb_scale + LPC_SCALE_FACTOR) +-#define ALPHA_EXP (-sbrScaleFactor->lb_scale + LPC_SCALE_FACTOR + 1) +-/* Resulting transposed QMF values exponent 16 bit normalized samplebits +- * assumed. */ +-#define QMFOUT_EXP ((SAMPLE_BITS - 15) - sbrScaleFactor->lb_scale) +- +-static inline void calc_qmfBufferReal(FIXP_DBL **qmfBufferReal, +- const FIXP_DBL *const lowBandReal, +- const int startSample, +- const int stopSample, const UCHAR hiBand, +- const int dynamicScale, const int descale, +- const FIXP_SGL a0r, const FIXP_SGL a1r) { +- FIXP_DBL accu1, accu2; +- int i; +- +- for (i = 0; i < stopSample - startSample; i++) { +- accu1 = fMultDiv2(a1r, lowBandReal[i]); +- accu1 = (fMultDiv2(a0r, lowBandReal[i + 1]) + accu1); +- accu1 = accu1 >> dynamicScale; +- +- accu1 <<= 1; +- accu2 = (lowBandReal[i + 2] >> descale); +- qmfBufferReal[i + startSample][hiBand] = accu1 + accu2; +- } +-} +- +-/*! +- * +- * \brief Perform transposition by patching of subband samples. +- * This function serves as the main entry point into the module. The function +- * determines the areas for the patching process (these are the source range as +- * well as the target range) and implements spectral whitening by means of +- * inverse filtering. The function autoCorrelation2nd() is an auxiliary function +- * for calculating the LPC coefficients for the filtering. The actual +- * calculation of the LPC coefficients and the implementation of the filtering +- * are done as part of lppTransposer(). +- * +- * Note that the filtering is done on all available QMF subsamples, whereas the +- * patching is only done on those QMF subsamples that will be used in the next +- * QMF synthesis. The filtering is also implemented before the patching includes +- * further dependencies on parameters from the SBR data. +- * +- */ +- +-void lppTransposer( +- HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ +- QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ +- FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband +- samples (source) */ +- +- FIXP_DBL *degreeAlias, /*!< Vector for results of aliasing estimation */ +- FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of +- subband samples (source) */ +- const int useLP, const int fPreWhitening, const int v_k_master0, +- const int timeStep, /*!< Time step of envelope */ +- const int firstSlotOffs, /*!< Start position in time */ +- const int lastSlotOffs, /*!< Number of overlap-slots into next frame */ +- const int nInvfBands, /*!< Number of bands for inverse filtering */ +- INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ +- INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */ +-) { +- INT bwIndex[MAX_NUM_PATCHES]; +- FIXP_DBL bwVector[MAX_NUM_PATCHES]; /*!< pole moving factors */ +- FIXP_DBL preWhiteningGains[(64) / 2]; +- int preWhiteningGains_exp[(64) / 2]; +- +- int i; +- int loBand, start, stop; +- TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings; +- PATCH_PARAM *patchParam = pSettings->patchParam; +- int patch; +- +- FIXP_SGL alphar[LPC_ORDER], a0r, a1r; +- FIXP_SGL alphai[LPC_ORDER], a0i = 0, a1i = 0; +- FIXP_SGL bw = FL2FXCONST_SGL(0.0f); +- +- int autoCorrLength; +- +- FIXP_DBL k1, k1_below = 0, k1_below2 = 0; +- +- ACORR_COEFS ac; +- int startSample; +- int stopSample; +- int stopSampleClear; +- +- int comLowBandScale; +- int ovLowBandShift; +- int lowBandShift; +- /* int ovHighBandShift;*/ +- +- alphai[0] = FL2FXCONST_SGL(0.0f); +- alphai[1] = FL2FXCONST_SGL(0.0f); +- +- startSample = firstSlotOffs * timeStep; +- stopSample = pSettings->nCols + lastSlotOffs * timeStep; +- FDK_ASSERT((lastSlotOffs * timeStep) <= pSettings->overlap); +- +- inverseFilteringLevelEmphasis(hLppTrans, nInvfBands, sbr_invf_mode, +- sbr_invf_mode_prev, bwVector); +- +- stopSampleClear = stopSample; +- +- autoCorrLength = pSettings->nCols + pSettings->overlap; +- +- if (pSettings->noOfPatches > 0) { +- /* Set upper subbands to zero: +- This is required in case that the patches do not cover the complete +- highband (because the last patch would be too short). Possible +- optimization: Clearing bands up to usb would be sufficient here. */ +- int targetStopBand = +- patchParam[pSettings->noOfPatches - 1].targetStartBand + +- patchParam[pSettings->noOfPatches - 1].numBandsInPatch; +- +- int memSize = ((64) - targetStopBand) * sizeof(FIXP_DBL); +- +- if (!useLP) { +- for (i = startSample; i < stopSampleClear; i++) { +- FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize); +- FDKmemclear(&qmfBufferImag[i][targetStopBand], memSize); +- } +- } else { +- for (i = startSample; i < stopSampleClear; i++) { +- FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize); +- } +- } +- } +-#ifdef __ANDROID__ +- else { +- // Safetynet logging +- android_errorWriteLog(0x534e4554, "112160868"); +- } +-#endif +- +- /* init bwIndex for each patch */ +- FDKmemclear(bwIndex, sizeof(bwIndex)); +- +- /* +- Calc common low band scale factor +- */ +- comLowBandScale = +- fixMin(sbrScaleFactor->ov_lb_scale, sbrScaleFactor->lb_scale); +- +- ovLowBandShift = sbrScaleFactor->ov_lb_scale - comLowBandScale; +- lowBandShift = sbrScaleFactor->lb_scale - comLowBandScale; +- /* ovHighBandShift = firstSlotOffs == 0 ? ovLowBandShift:0;*/ +- +- if (fPreWhitening) { +- sbrDecoder_calculateGainVec( +- qmfBufferReal, qmfBufferImag, +- DFRACT_BITS - 1 - 16 - +- sbrScaleFactor->ov_lb_scale, /* convert scale to exponent */ +- DFRACT_BITS - 1 - 16 - +- sbrScaleFactor->lb_scale, /* convert scale to exponent */ +- pSettings->overlap, preWhiteningGains, preWhiteningGains_exp, +- v_k_master0, startSample, stopSample); +- } +- +- /* outer loop over bands to do analysis only once for each band */ +- +- if (!useLP) { +- start = pSettings->lbStartPatching; +- stop = pSettings->lbStopPatching; +- } else { +- start = fixMax(1, pSettings->lbStartPatching - 2); +- stop = patchParam[0].targetStartBand; +- } +- +- for (loBand = start; loBand < stop; loBand++) { +- FIXP_DBL lowBandReal[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER]; +- FIXP_DBL *plowBandReal = lowBandReal; +- FIXP_DBL **pqmfBufferReal = +- qmfBufferReal + firstSlotOffs * timeStep /* + pSettings->overlap */; +- FIXP_DBL lowBandImag[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER]; +- FIXP_DBL *plowBandImag = lowBandImag; +- FIXP_DBL **pqmfBufferImag = +- qmfBufferImag + firstSlotOffs * timeStep /* + pSettings->overlap */; +- int resetLPCCoeffs = 0; +- int dynamicScale = DFRACT_BITS - 1 - LPC_SCALE_FACTOR; +- int acDetScale = 0; /* scaling of autocorrelation determinant */ +- +- for (i = 0; +- i < LPC_ORDER + firstSlotOffs * timeStep /*+pSettings->overlap*/; +- i++) { +- *plowBandReal++ = hLppTrans->lpcFilterStatesRealLegSBR[i][loBand]; +- if (!useLP) +- *plowBandImag++ = hLppTrans->lpcFilterStatesImagLegSBR[i][loBand]; +- } +- +- /* +- Take old slope length qmf slot source values out of (overlap)qmf buffer +- */ +- if (!useLP) { +- for (i = 0; +- i < pSettings->nCols + pSettings->overlap - firstSlotOffs * timeStep; +- i++) { +- *plowBandReal++ = (*pqmfBufferReal++)[loBand]; +- *plowBandImag++ = (*pqmfBufferImag++)[loBand]; +- } +- } else { +- /* pSettings->overlap is always even */ +- FDK_ASSERT((pSettings->overlap & 1) == 0); +- for (i = 0; i < ((pSettings->nCols + pSettings->overlap - +- firstSlotOffs * timeStep) >> +- 1); +- i++) { +- *plowBandReal++ = (*pqmfBufferReal++)[loBand]; +- *plowBandReal++ = (*pqmfBufferReal++)[loBand]; +- } +- if (pSettings->nCols & 1) { +- *plowBandReal++ = (*pqmfBufferReal++)[loBand]; +- } +- } +- +- /* +- Determine dynamic scaling value. +- */ +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(lowBandReal, LPC_ORDER + pSettings->overlap) + +- ovLowBandShift); +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(&lowBandReal[LPC_ORDER + pSettings->overlap], +- pSettings->nCols) + +- lowBandShift); +- if (!useLP) { +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(lowBandImag, LPC_ORDER + pSettings->overlap) + +- ovLowBandShift); +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(&lowBandImag[LPC_ORDER + pSettings->overlap], +- pSettings->nCols) + +- lowBandShift); +- } +- dynamicScale = fixMax( +- 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */ +- +- /* +- Scale temporal QMF buffer. +- */ +- scaleValues(&lowBandReal[0], LPC_ORDER + pSettings->overlap, +- dynamicScale - ovLowBandShift); +- scaleValues(&lowBandReal[LPC_ORDER + pSettings->overlap], pSettings->nCols, +- dynamicScale - lowBandShift); +- +- if (!useLP) { +- scaleValues(&lowBandImag[0], LPC_ORDER + pSettings->overlap, +- dynamicScale - ovLowBandShift); +- scaleValues(&lowBandImag[LPC_ORDER + pSettings->overlap], +- pSettings->nCols, dynamicScale - lowBandShift); +- } +- +- if (!useLP) { +- acDetScale += autoCorr2nd_cplx(&ac, lowBandReal + LPC_ORDER, +- lowBandImag + LPC_ORDER, autoCorrLength); +- } else { +- acDetScale += +- autoCorr2nd_real(&ac, lowBandReal + LPC_ORDER, autoCorrLength); +- } +- +- /* Examine dynamic of determinant in autocorrelation. */ +- acDetScale += 2 * (comLowBandScale + dynamicScale); +- acDetScale *= 2; /* two times reflection coefficent scaling */ +- acDetScale += ac.det_scale; /* ac scaling of determinant */ +- +- /* In case of determinant < 10^-38, resetLPCCoeffs=1 has to be enforced. */ +- if (acDetScale > 126) { +- resetLPCCoeffs = 1; +- } +- +- alphar[1] = FL2FXCONST_SGL(0.0f); +- if (!useLP) alphai[1] = FL2FXCONST_SGL(0.0f); +- +- if (ac.det != FL2FXCONST_DBL(0.0f)) { +- FIXP_DBL tmp, absTmp, absDet; +- +- absDet = fixp_abs(ac.det); +- +- if (!useLP) { +- tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) - +- ((fMultDiv2(ac.r01i, ac.r12i) + fMultDiv2(ac.r02r, ac.r11r)) >> +- (LPC_SCALE_FACTOR - 1)); +- } else { +- tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) - +- (fMultDiv2(ac.r02r, ac.r11r) >> (LPC_SCALE_FACTOR - 1)); +- } +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is first filter coeff >= 1(4) +- */ +- { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); +- scale = scale + ac.det_scale; +- +- if ((scale > 0) && (result >= (FIXP_DBL)MAXVAL_DBL >> scale)) { +- resetLPCCoeffs = 1; +- } else { +- alphar[1] = FX_DBL2FX_SGL(scaleValue(result, scale)); +- if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) { +- alphar[1] = -alphar[1]; +- } +- } +- } +- +- if (!useLP) { +- tmp = (fMultDiv2(ac.r01i, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) + +- ((fMultDiv2(ac.r01r, ac.r12i) - +- (FIXP_DBL)fMultDiv2(ac.r02i, ac.r11r)) >> +- (LPC_SCALE_FACTOR - 1)); +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is second filter coeff >= 1(4) +- */ +- { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); +- scale = scale + ac.det_scale; +- +- if ((scale > 0) && +- (result >= /*FL2FXCONST_DBL(1.f)*/ (FIXP_DBL)MAXVAL_DBL >> +- scale)) { +- resetLPCCoeffs = 1; +- } else { +- alphai[1] = FX_DBL2FX_SGL(scaleValue(result, scale)); +- if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) { +- alphai[1] = -alphai[1]; +- } +- } +- } +- } +- } +- +- alphar[0] = FL2FXCONST_SGL(0.0f); +- if (!useLP) alphai[0] = FL2FXCONST_SGL(0.0f); +- +- if (ac.r11r != FL2FXCONST_DBL(0.0f)) { +- /* ac.r11r is always >=0 */ +- FIXP_DBL tmp, absTmp; +- +- if (!useLP) { +- tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) + +- (fMultDiv2(alphar[1], ac.r12r) + fMultDiv2(alphai[1], ac.r12i)); +- } else { +- if (ac.r01r >= FL2FXCONST_DBL(0.0f)) +- tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) + +- fMultDiv2(alphar[1], ac.r12r); +- else +- tmp = -((-ac.r01r) >> (LPC_SCALE_FACTOR + 1)) + +- fMultDiv2(alphar[1], ac.r12r); +- } +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is first filter coeff >= 1(4) +- */ +- +- if (absTmp >= (ac.r11r >> 1)) { +- resetLPCCoeffs = 1; +- } else { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); +- alphar[0] = FX_DBL2FX_SGL(scaleValue(result, scale + 1)); +- +- if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f))) +- alphar[0] = -alphar[0]; +- } +- +- if (!useLP) { +- tmp = (ac.r01i >> (LPC_SCALE_FACTOR + 1)) + +- (fMultDiv2(alphai[1], ac.r12r) - fMultDiv2(alphar[1], ac.r12i)); +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is second filter coeff >= 1(4) +- */ +- if (absTmp >= (ac.r11r >> 1)) { +- resetLPCCoeffs = 1; +- } else { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); +- alphai[0] = FX_DBL2FX_SGL(scaleValue(result, scale + 1)); +- if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f))) +- alphai[0] = -alphai[0]; +- } +- } +- } +- +- if (!useLP) { +- /* Now check the quadratic criteria */ +- if ((fMultDiv2(alphar[0], alphar[0]) + fMultDiv2(alphai[0], alphai[0])) >= +- FL2FXCONST_DBL(0.5f)) +- resetLPCCoeffs = 1; +- if ((fMultDiv2(alphar[1], alphar[1]) + fMultDiv2(alphai[1], alphai[1])) >= +- FL2FXCONST_DBL(0.5f)) +- resetLPCCoeffs = 1; +- } +- +- if (resetLPCCoeffs) { +- alphar[0] = FL2FXCONST_SGL(0.0f); +- alphar[1] = FL2FXCONST_SGL(0.0f); +- if (!useLP) { +- alphai[0] = FL2FXCONST_SGL(0.0f); +- alphai[1] = FL2FXCONST_SGL(0.0f); +- } +- } +- +- if (useLP) { +- /* Aliasing detection */ +- if (ac.r11r == FL2FXCONST_DBL(0.0f)) { +- k1 = FL2FXCONST_DBL(0.0f); +- } else { +- if (fixp_abs(ac.r01r) >= fixp_abs(ac.r11r)) { +- if (fMultDiv2(ac.r01r, ac.r11r) < FL2FX_DBL(0.0f)) { +- k1 = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_SGL(1.0f)*/; +- } else { +- /* Since this value is squared later, it must not ever become -1.0f. +- */ +- k1 = (FIXP_DBL)(MINVAL_DBL + 1) /*FL2FXCONST_SGL(-1.0f)*/; +- } +- } else { +- INT scale; +- FIXP_DBL result = +- fDivNorm(fixp_abs(ac.r01r), fixp_abs(ac.r11r), &scale); +- k1 = scaleValue(result, scale); +- +- if (!((ac.r01r < FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f)))) { +- k1 = -k1; +- } +- } +- } +- if ((loBand > 1) && (loBand < v_k_master0)) { +- /* Check if the gain should be locked */ +- FIXP_DBL deg = +- /*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - fPow2(k1_below); +- degreeAlias[loBand] = FL2FXCONST_DBL(0.0f); +- if (((loBand & 1) == 0) && (k1 < FL2FXCONST_DBL(0.0f))) { +- if (k1_below < FL2FXCONST_DBL(0.0f)) { /* 2-Ch Aliasing Detection */ +- degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; +- if (k1_below2 > +- FL2FXCONST_DBL(0.0f)) { /* 3-Ch Aliasing Detection */ +- degreeAlias[loBand - 1] = deg; +- } +- } else if (k1_below2 > +- FL2FXCONST_DBL(0.0f)) { /* 3-Ch Aliasing Detection */ +- degreeAlias[loBand] = deg; +- } +- } +- if (((loBand & 1) == 1) && (k1 > FL2FXCONST_DBL(0.0f))) { +- if (k1_below > FL2FXCONST_DBL(0.0f)) { /* 2-CH Aliasing Detection */ +- degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; +- if (k1_below2 < +- FL2FXCONST_DBL(0.0f)) { /* 3-CH Aliasing Detection */ +- degreeAlias[loBand - 1] = deg; +- } +- } else if (k1_below2 < +- FL2FXCONST_DBL(0.0f)) { /* 3-CH Aliasing Detection */ +- degreeAlias[loBand] = deg; +- } +- } +- } +- /* remember k1 values of the 2 QMF channels below the current channel */ +- k1_below2 = k1_below; +- k1_below = k1; +- } +- +- patch = 0; +- +- while (patch < pSettings->noOfPatches) { /* inner loop over every patch */ +- +- int hiBand = loBand + patchParam[patch].targetBandOffs; +- +- if (loBand < patchParam[patch].sourceStartBand || +- loBand >= patchParam[patch].sourceStopBand +- //|| hiBand >= hLppTrans->pSettings->noChannels +- ) { +- /* Lowband not in current patch - proceed */ +- patch++; +- continue; +- } +- +- FDK_ASSERT(hiBand < (64)); +- +- /* bwIndex[patch] is already initialized with value from previous band +- * inside this patch */ +- while (hiBand >= pSettings->bwBorders[bwIndex[patch]] && +- bwIndex[patch] < MAX_NUM_PATCHES - 1) { +- bwIndex[patch]++; +- } +- +- /* +- Filter Step 2: add the left slope with the current filter to the buffer +- pure source values are already in there +- */ +- bw = FX_DBL2FX_SGL(bwVector[bwIndex[patch]]); +- +- a0r = FX_DBL2FX_SGL( +- fMult(bw, alphar[0])); /* Apply current bandwidth expansion factor */ +- +- if (!useLP) a0i = FX_DBL2FX_SGL(fMult(bw, alphai[0])); +- bw = FX_DBL2FX_SGL(fPow2(bw)); +- a1r = FX_DBL2FX_SGL(fMult(bw, alphar[1])); +- if (!useLP) a1i = FX_DBL2FX_SGL(fMult(bw, alphai[1])); +- +- /* +- Filter Step 3: insert the middle part which won't be windowed +- */ +- if (bw <= FL2FXCONST_SGL(0.0f)) { +- if (!useLP) { +- int descale = +- fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); +- for (i = startSample; i < stopSample; i++) { +- FIXP_DBL accu1, accu2; +- accu1 = lowBandReal[LPC_ORDER + i] >> descale; +- accu2 = lowBandImag[LPC_ORDER + i] >> descale; +- if (fPreWhitening) { +- accu1 = scaleValueSaturate( +- fMultDiv2(accu1, preWhiteningGains[loBand]), +- preWhiteningGains_exp[loBand] + 1); +- accu2 = scaleValueSaturate( +- fMultDiv2(accu2, preWhiteningGains[loBand]), +- preWhiteningGains_exp[loBand] + 1); +- } +- qmfBufferReal[i][hiBand] = accu1; +- qmfBufferImag[i][hiBand] = accu2; +- } +- } else { +- int descale = +- fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); +- for (i = startSample; i < stopSample; i++) { +- qmfBufferReal[i][hiBand] = lowBandReal[LPC_ORDER + i] >> descale; +- } +- } +- } else { /* bw <= 0 */ +- +- if (!useLP) { +- int descale = +- fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); +-#ifdef FUNCTION_LPPTRANSPOSER_func1 +- lppTransposer_func1( +- lowBandReal + LPC_ORDER + startSample, +- lowBandImag + LPC_ORDER + startSample, +- qmfBufferReal + startSample, qmfBufferImag + startSample, +- stopSample - startSample, (int)hiBand, dynamicScale, descale, a0r, +- a0i, a1r, a1i, fPreWhitening, preWhiteningGains[loBand], +- preWhiteningGains_exp[loBand] + 1); +-#else +- for (i = startSample; i < stopSample; i++) { +- FIXP_DBL accu1, accu2; +- +- accu1 = (fMultDiv2(a0r, lowBandReal[LPC_ORDER + i - 1]) - +- fMultDiv2(a0i, lowBandImag[LPC_ORDER + i - 1]) + +- fMultDiv2(a1r, lowBandReal[LPC_ORDER + i - 2]) - +- fMultDiv2(a1i, lowBandImag[LPC_ORDER + i - 2])) >> +- dynamicScale; +- accu2 = (fMultDiv2(a0i, lowBandReal[LPC_ORDER + i - 1]) + +- fMultDiv2(a0r, lowBandImag[LPC_ORDER + i - 1]) + +- fMultDiv2(a1i, lowBandReal[LPC_ORDER + i - 2]) + +- fMultDiv2(a1r, lowBandImag[LPC_ORDER + i - 2])) >> +- dynamicScale; +- +- accu1 = (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << 1); +- accu2 = (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << 1); +- if (fPreWhitening) { +- accu1 = scaleValueSaturate( +- fMultDiv2(accu1, preWhiteningGains[loBand]), +- preWhiteningGains_exp[loBand] + 1); +- accu2 = scaleValueSaturate( +- fMultDiv2(accu2, preWhiteningGains[loBand]), +- preWhiteningGains_exp[loBand] + 1); +- } +- qmfBufferReal[i][hiBand] = accu1; +- qmfBufferImag[i][hiBand] = accu2; +- } +-#endif +- } else { +- FDK_ASSERT(dynamicScale >= 0); +- calc_qmfBufferReal( +- qmfBufferReal, &(lowBandReal[LPC_ORDER + startSample - 2]), +- startSample, stopSample, hiBand, dynamicScale, +- fMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)), a0r, +- a1r); +- } +- } /* bw <= 0 */ +- +- patch++; +- +- } /* inner loop over patches */ +- +- /* +- * store the unmodified filter coefficients if there is +- * an overlapping envelope +- *****************************************************************/ +- +- } /* outer loop over bands (loBand) */ +- +- if (useLP) { +- for (loBand = pSettings->lbStartPatching; +- loBand < pSettings->lbStopPatching; loBand++) { +- patch = 0; +- while (patch < pSettings->noOfPatches) { +- UCHAR hiBand = loBand + patchParam[patch].targetBandOffs; +- +- if (loBand < patchParam[patch].sourceStartBand || +- loBand >= patchParam[patch].sourceStopBand || +- hiBand >= (64) /* Highband out of range (biterror) */ +- ) { +- /* Lowband not in current patch or highband out of range (might be +- * caused by biterrors)- proceed */ +- patch++; +- continue; +- } +- +- if (hiBand != patchParam[patch].targetStartBand) +- degreeAlias[hiBand] = degreeAlias[loBand]; +- +- patch++; +- } +- } /* end for loop */ +- } +- +- for (i = 0; i < nInvfBands; i++) { +- hLppTrans->bwVectorOld[i] = bwVector[i]; +- } +- +- /* +- set high band scale factor +- */ +- sbrScaleFactor->hb_scale = comLowBandScale - (LPC_SCALE_FACTOR); +-} +- +-void lppTransposerHBE( +- HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ +- HANDLE_HBE_TRANSPOSER hQmfTransposer, +- QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ +- FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband +- samples (source) */ +- FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of +- subband samples (source) */ +- const int timeStep, /*!< Time step of envelope */ +- const int firstSlotOffs, /*!< Start position in time */ +- const int lastSlotOffs, /*!< Number of overlap-slots into next frame */ +- const int nInvfBands, /*!< Number of bands for inverse filtering */ +- INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ +- INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */ +-) { +- INT bwIndex; +- FIXP_DBL bwVector[MAX_NUM_PATCHES_HBE]; /*!< pole moving factors */ +- +- int i; +- int loBand, start, stop; +- TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings; +- PATCH_PARAM *patchParam = pSettings->patchParam; +- +- FIXP_SGL alphar[LPC_ORDER], a0r, a1r; +- FIXP_SGL alphai[LPC_ORDER], a0i = 0, a1i = 0; +- FIXP_SGL bw = FL2FXCONST_SGL(0.0f); +- +- int autoCorrLength; +- +- ACORR_COEFS ac; +- int startSample; +- int stopSample; +- int stopSampleClear; +- +- int comBandScale; +- int ovLowBandShift; +- int lowBandShift; +- /* int ovHighBandShift;*/ +- +- alphai[0] = FL2FXCONST_SGL(0.0f); +- alphai[1] = FL2FXCONST_SGL(0.0f); +- +- startSample = firstSlotOffs * timeStep; +- stopSample = pSettings->nCols + lastSlotOffs * timeStep; +- +- inverseFilteringLevelEmphasis(hLppTrans, nInvfBands, sbr_invf_mode, +- sbr_invf_mode_prev, bwVector); +- +- stopSampleClear = stopSample; +- +- autoCorrLength = pSettings->nCols + pSettings->overlap; +- +- if (pSettings->noOfPatches > 0) { +- /* Set upper subbands to zero: +- This is required in case that the patches do not cover the complete +- highband (because the last patch would be too short). Possible +- optimization: Clearing bands up to usb would be sufficient here. */ +- int targetStopBand = +- patchParam[pSettings->noOfPatches - 1].targetStartBand + +- patchParam[pSettings->noOfPatches - 1].numBandsInPatch; +- +- int memSize = ((64) - targetStopBand) * sizeof(FIXP_DBL); +- +- for (i = startSample; i < stopSampleClear; i++) { +- FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize); +- FDKmemclear(&qmfBufferImag[i][targetStopBand], memSize); +- } +- } +-#ifdef __ANDROID__ +- else { +- // Safetynet logging +- android_errorWriteLog(0x534e4554, "112160868"); +- } +-#endif +- +- /* +- Calc common low band scale factor +- */ +- comBandScale = sbrScaleFactor->hb_scale; +- +- ovLowBandShift = sbrScaleFactor->hb_scale - comBandScale; +- lowBandShift = sbrScaleFactor->hb_scale - comBandScale; +- /* ovHighBandShift = firstSlotOffs == 0 ? ovLowBandShift:0;*/ +- +- /* outer loop over bands to do analysis only once for each band */ +- +- start = hQmfTransposer->startBand; +- stop = hQmfTransposer->stopBand; +- +- for (loBand = start; loBand < stop; loBand++) { +- bwIndex = 0; +- +- FIXP_DBL lowBandReal[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER]; +- FIXP_DBL lowBandImag[(((1024) / (32) * (4) / 2) + (3 * (4))) + LPC_ORDER]; +- +- int resetLPCCoeffs = 0; +- int dynamicScale = DFRACT_BITS - 1 - LPC_SCALE_FACTOR; +- int acDetScale = 0; /* scaling of autocorrelation determinant */ +- +- for (i = 0; i < LPC_ORDER; i++) { +- lowBandReal[i] = hLppTrans->lpcFilterStatesRealHBE[i][loBand]; +- lowBandImag[i] = hLppTrans->lpcFilterStatesImagHBE[i][loBand]; +- } +- +- for (; i < LPC_ORDER + firstSlotOffs * timeStep; i++) { +- lowBandReal[i] = hLppTrans->lpcFilterStatesRealHBE[i][loBand]; +- lowBandImag[i] = hLppTrans->lpcFilterStatesImagHBE[i][loBand]; +- } +- +- /* +- Take old slope length qmf slot source values out of (overlap)qmf buffer +- */ +- for (i = firstSlotOffs * timeStep; +- i < pSettings->nCols + pSettings->overlap; i++) { +- lowBandReal[i + LPC_ORDER] = qmfBufferReal[i][loBand]; +- lowBandImag[i + LPC_ORDER] = qmfBufferImag[i][loBand]; +- } +- +- /* store unmodified values to buffer */ +- for (i = 0; i < LPC_ORDER + pSettings->overlap; i++) { +- hLppTrans->lpcFilterStatesRealHBE[i][loBand] = +- qmfBufferReal[pSettings->nCols - LPC_ORDER + i][loBand]; +- hLppTrans->lpcFilterStatesImagHBE[i][loBand] = +- qmfBufferImag[pSettings->nCols - LPC_ORDER + i][loBand]; +- } +- +- /* +- Determine dynamic scaling value. +- */ +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(lowBandReal, LPC_ORDER + pSettings->overlap) + +- ovLowBandShift); +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(&lowBandReal[LPC_ORDER + pSettings->overlap], +- pSettings->nCols) + +- lowBandShift); +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(lowBandImag, LPC_ORDER + pSettings->overlap) + +- ovLowBandShift); +- dynamicScale = +- fixMin(dynamicScale, +- getScalefactor(&lowBandImag[LPC_ORDER + pSettings->overlap], +- pSettings->nCols) + +- lowBandShift); +- +- dynamicScale = fixMax( +- 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */ +- +- /* +- Scale temporal QMF buffer. +- */ +- scaleValues(&lowBandReal[0], LPC_ORDER + pSettings->overlap, +- dynamicScale - ovLowBandShift); +- scaleValues(&lowBandReal[LPC_ORDER + pSettings->overlap], pSettings->nCols, +- dynamicScale - lowBandShift); +- scaleValues(&lowBandImag[0], LPC_ORDER + pSettings->overlap, +- dynamicScale - ovLowBandShift); +- scaleValues(&lowBandImag[LPC_ORDER + pSettings->overlap], pSettings->nCols, +- dynamicScale - lowBandShift); +- +- acDetScale += autoCorr2nd_cplx(&ac, lowBandReal + LPC_ORDER, +- lowBandImag + LPC_ORDER, autoCorrLength); +- +- /* Examine dynamic of determinant in autocorrelation. */ +- acDetScale += 2 * (comBandScale + dynamicScale); +- acDetScale *= 2; /* two times reflection coefficent scaling */ +- acDetScale += ac.det_scale; /* ac scaling of determinant */ +- +- /* In case of determinant < 10^-38, resetLPCCoeffs=1 has to be enforced. */ +- if (acDetScale > 126) { +- resetLPCCoeffs = 1; +- } +- +- alphar[1] = FL2FXCONST_SGL(0.0f); +- alphai[1] = FL2FXCONST_SGL(0.0f); +- +- if (ac.det != FL2FXCONST_DBL(0.0f)) { +- FIXP_DBL tmp, absTmp, absDet; +- +- absDet = fixp_abs(ac.det); +- +- tmp = (fMultDiv2(ac.r01r, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) - +- ((fMultDiv2(ac.r01i, ac.r12i) + fMultDiv2(ac.r02r, ac.r11r)) >> +- (LPC_SCALE_FACTOR - 1)); +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is first filter coeff >= 1(4) +- */ +- { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); +- scale = scale + ac.det_scale; +- +- if ((scale > 0) && (result >= (FIXP_DBL)MAXVAL_DBL >> scale)) { +- resetLPCCoeffs = 1; +- } else { +- alphar[1] = FX_DBL2FX_SGL(scaleValue(result, scale)); +- if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) { +- alphar[1] = -alphar[1]; +- } +- } +- } +- +- tmp = (fMultDiv2(ac.r01i, ac.r12r) >> (LPC_SCALE_FACTOR - 1)) + +- ((fMultDiv2(ac.r01r, ac.r12i) - +- (FIXP_DBL)fMultDiv2(ac.r02i, ac.r11r)) >> +- (LPC_SCALE_FACTOR - 1)); +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is second filter coeff >= 1(4) +- */ +- { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); +- scale = scale + ac.det_scale; +- +- if ((scale > 0) && +- (result >= /*FL2FXCONST_DBL(1.f)*/ (FIXP_DBL)MAXVAL_DBL >> scale)) { +- resetLPCCoeffs = 1; +- } else { +- alphai[1] = FX_DBL2FX_SGL(scaleValue(result, scale)); +- if ((tmp < FL2FX_DBL(0.0f)) ^ (ac.det < FL2FX_DBL(0.0f))) { +- alphai[1] = -alphai[1]; +- } +- } +- } +- } +- +- alphar[0] = FL2FXCONST_SGL(0.0f); +- alphai[0] = FL2FXCONST_SGL(0.0f); +- +- if (ac.r11r != FL2FXCONST_DBL(0.0f)) { +- /* ac.r11r is always >=0 */ +- FIXP_DBL tmp, absTmp; +- +- tmp = (ac.r01r >> (LPC_SCALE_FACTOR + 1)) + +- (fMultDiv2(alphar[1], ac.r12r) + fMultDiv2(alphai[1], ac.r12i)); +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is first filter coeff >= 1(4) +- */ +- +- if (absTmp >= (ac.r11r >> 1)) { +- resetLPCCoeffs = 1; +- } else { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); +- alphar[0] = FX_DBL2FX_SGL(scaleValue(result, scale + 1)); +- +- if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f))) +- alphar[0] = -alphar[0]; +- } +- +- tmp = (ac.r01i >> (LPC_SCALE_FACTOR + 1)) + +- (fMultDiv2(alphai[1], ac.r12r) - fMultDiv2(alphar[1], ac.r12i)); +- +- absTmp = fixp_abs(tmp); +- +- /* +- Quick check: is second filter coeff >= 1(4) +- */ +- if (absTmp >= (ac.r11r >> 1)) { +- resetLPCCoeffs = 1; +- } else { +- INT scale; +- FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); +- alphai[0] = FX_DBL2FX_SGL(scaleValue(result, scale + 1)); +- if ((tmp > FL2FX_DBL(0.0f)) ^ (ac.r11r < FL2FX_DBL(0.0f))) { +- alphai[0] = -alphai[0]; +- } +- } +- } +- +- /* Now check the quadratic criteria */ +- if ((fMultDiv2(alphar[0], alphar[0]) + fMultDiv2(alphai[0], alphai[0])) >= +- FL2FXCONST_DBL(0.5f)) { +- resetLPCCoeffs = 1; +- } +- if ((fMultDiv2(alphar[1], alphar[1]) + fMultDiv2(alphai[1], alphai[1])) >= +- FL2FXCONST_DBL(0.5f)) { +- resetLPCCoeffs = 1; +- } +- +- if (resetLPCCoeffs) { +- alphar[0] = FL2FXCONST_SGL(0.0f); +- alphar[1] = FL2FXCONST_SGL(0.0f); +- alphai[0] = FL2FXCONST_SGL(0.0f); +- alphai[1] = FL2FXCONST_SGL(0.0f); +- } +- +- while (bwIndex < MAX_NUM_PATCHES - 1 && +- loBand >= pSettings->bwBorders[bwIndex]) { +- bwIndex++; +- } +- +- /* +- Filter Step 2: add the left slope with the current filter to the buffer +- pure source values are already in there +- */ +- bw = FX_DBL2FX_SGL(bwVector[bwIndex]); +- +- a0r = FX_DBL2FX_SGL( +- fMult(bw, alphar[0])); /* Apply current bandwidth expansion factor */ +- a0i = FX_DBL2FX_SGL(fMult(bw, alphai[0])); +- bw = FX_DBL2FX_SGL(fPow2(bw)); +- a1r = FX_DBL2FX_SGL(fMult(bw, alphar[1])); +- a1i = FX_DBL2FX_SGL(fMult(bw, alphai[1])); +- +- /* +- Filter Step 3: insert the middle part which won't be windowed +- */ +- if (bw <= FL2FXCONST_SGL(0.0f)) { +- int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); +- for (i = startSample; i < stopSample; i++) { +- qmfBufferReal[i][loBand] = lowBandReal[LPC_ORDER + i] >> descale; +- qmfBufferImag[i][loBand] = lowBandImag[LPC_ORDER + i] >> descale; +- } +- } else { /* bw <= 0 */ +- +- int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); +- +- for (i = startSample; i < stopSample; i++) { +- FIXP_DBL accu1, accu2; +- +- accu1 = (fMultDiv2(a0r, lowBandReal[LPC_ORDER + i - 1]) - +- fMultDiv2(a0i, lowBandImag[LPC_ORDER + i - 1]) + +- fMultDiv2(a1r, lowBandReal[LPC_ORDER + i - 2]) - +- fMultDiv2(a1i, lowBandImag[LPC_ORDER + i - 2])) >> +- dynamicScale; +- accu2 = (fMultDiv2(a0i, lowBandReal[LPC_ORDER + i - 1]) + +- fMultDiv2(a0r, lowBandImag[LPC_ORDER + i - 1]) + +- fMultDiv2(a1i, lowBandReal[LPC_ORDER + i - 2]) + +- fMultDiv2(a1r, lowBandImag[LPC_ORDER + i - 2])) >> +- dynamicScale; +- +- qmfBufferReal[i][loBand] = +- (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << 1); +- qmfBufferImag[i][loBand] = +- (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << 1); +- } +- } /* bw <= 0 */ +- +- /* +- * store the unmodified filter coefficients if there is +- * an overlapping envelope +- *****************************************************************/ +- +- } /* outer loop over bands (loBand) */ +- +- for (i = 0; i < nInvfBands; i++) { +- hLppTrans->bwVectorOld[i] = bwVector[i]; +- } +- +- /* +- set high band scale factor +- */ +- sbrScaleFactor->hb_scale = comBandScale - (LPC_SCALE_FACTOR); +-} +- +-/*! +- * +- * \brief Initialize one low power transposer instance +- * +- * +- */ +-SBR_ERROR +-createLppTransposer( +- HANDLE_SBR_LPP_TRANS hs, /*!< Handle of low power transposer */ +- TRANSPOSER_SETTINGS *pSettings, /*!< Pointer to settings */ +- const int highBandStartSb, /*!< ? */ +- UCHAR *v_k_master, /*!< Master table */ +- const int numMaster, /*!< Valid entries in master table */ +- const int usb, /*!< Highband area stop subband */ +- const int timeSlots, /*!< Number of time slots */ +- const int nCols, /*!< Number of colums (codec qmf bank) */ +- UCHAR *noiseBandTable, /*!< Mapping of SBR noise bands to QMF bands */ +- const int noNoiseBands, /*!< Number of noise bands */ +- UINT fs, /*!< Sample Frequency */ +- const int chan, /*!< Channel number */ +- const int overlap) { +- /* FB inverse filtering settings */ +- hs->pSettings = pSettings; +- +- pSettings->nCols = nCols; +- pSettings->overlap = overlap; +- +- switch (timeSlots) { +- case 15: +- case 16: +- break; +- +- default: +- return SBRDEC_UNSUPPORTED_CONFIG; /* Unimplemented */ +- } +- +- if (chan == 0) { +- /* Init common data only once */ +- hs->pSettings->nCols = nCols; +- +- return resetLppTransposer(hs, highBandStartSb, v_k_master, numMaster, +- noiseBandTable, noNoiseBands, usb, fs); +- } +- return SBRDEC_OK; +-} +- +-static int findClosestEntry(UCHAR goalSb, UCHAR *v_k_master, UCHAR numMaster, +- UCHAR direction) { +- int index; +- +- if (goalSb <= v_k_master[0]) return v_k_master[0]; +- +- if (goalSb >= v_k_master[numMaster]) return v_k_master[numMaster]; +- +- if (direction) { +- index = 0; +- while (v_k_master[index] < goalSb) { +- index++; +- } +- } else { +- index = numMaster; +- while (v_k_master[index] > goalSb) { +- index--; +- } +- } +- +- return v_k_master[index]; +-} +- +-/*! +- * +- * \brief Reset memory for one lpp transposer instance +- * +- * \return SBRDEC_OK on success, SBRDEC_UNSUPPORTED_CONFIG on error +- */ +-SBR_ERROR +-resetLppTransposer( +- HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ +- UCHAR highBandStartSb, /*!< High band area: start subband */ +- UCHAR *v_k_master, /*!< Master table */ +- UCHAR numMaster, /*!< Valid entries in master table */ +- UCHAR *noiseBandTable, /*!< Mapping of SBR noise bands to QMF bands */ +- UCHAR noNoiseBands, /*!< Number of noise bands */ +- UCHAR usb, /*!< High band area: stop subband */ +- UINT fs /*!< SBR output sampling frequency */ +-) { +- TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings; +- PATCH_PARAM *patchParam = pSettings->patchParam; +- +- int i, patch; +- int targetStopBand; +- int sourceStartBand; +- int patchDistance; +- int numBandsInPatch; +- +- int lsb = v_k_master[0]; /* Start subband expressed in "non-critical" sampling +- terms*/ +- int xoverOffset = highBandStartSb - +- lsb; /* Calculate distance in QMF bands between k0 and kx */ +- int startFreqHz; +- +- int desiredBorder; +- +- usb = fixMin(usb, v_k_master[numMaster]); /* Avoid endless loops (compare with +- float code). */ +- +- /* +- * Plausibility check +- */ +- +- if (pSettings->nCols == 64) { +- if (lsb < 4) { +- /* 4:1 SBR Requirement k0 >= 4 missed! */ +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- } else if (lsb - SHIFT_START_SB < 4) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* +- * Initialize the patching parameter +- */ +- /* ISO/IEC 14496-3 (Figure 4.48): goalSb = round( 2.048e6 / fs ) */ +- desiredBorder = (((2048000 * 2) / fs) + 1) >> 1; +- +- desiredBorder = findClosestEntry(desiredBorder, v_k_master, numMaster, +- 1); /* Adapt region to master-table */ +- +- /* First patch */ +- sourceStartBand = SHIFT_START_SB + xoverOffset; +- targetStopBand = lsb + xoverOffset; /* upperBand */ +- +- /* Even (odd) numbered channel must be patched to even (odd) numbered channel +- */ +- patch = 0; +- while (targetStopBand < usb) { +- /* Too many patches? +- Allow MAX_NUM_PATCHES+1 patches here. +- we need to check later again, since patch might be the highest patch +- AND contain less than 3 bands => actual number of patches will be reduced +- by 1. +- */ +- if (patch > MAX_NUM_PATCHES) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- patchParam[patch].guardStartBand = targetStopBand; +- patchParam[patch].targetStartBand = targetStopBand; +- +- numBandsInPatch = +- desiredBorder - targetStopBand; /* Get the desired range of the patch */ +- +- if (numBandsInPatch >= lsb - sourceStartBand) { +- /* Desired number bands are not available -> patch whole source range */ +- patchDistance = +- targetStopBand - sourceStartBand; /* Get the targetOffset */ +- patchDistance = +- patchDistance & ~1; /* Rounding off odd numbers and make all even */ +- numBandsInPatch = +- lsb - (targetStopBand - +- patchDistance); /* Update number of bands to be patched */ +- numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, +- v_k_master, numMaster, 0) - +- targetStopBand; /* Adapt region to master-table */ +- } +- +- if (pSettings->nCols == 64) { +- if (numBandsInPatch == 0 && sourceStartBand == SHIFT_START_SB) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- } +- +- /* Desired number bands are available -> get the minimal even patching +- * distance */ +- patchDistance = +- numBandsInPatch + targetStopBand - lsb; /* Get minimal distance */ +- patchDistance = (patchDistance + 1) & +- ~1; /* Rounding up odd numbers and make all even */ +- +- if (numBandsInPatch > 0) { +- patchParam[patch].sourceStartBand = targetStopBand - patchDistance; +- patchParam[patch].targetBandOffs = patchDistance; +- patchParam[patch].numBandsInPatch = numBandsInPatch; +- patchParam[patch].sourceStopBand = +- patchParam[patch].sourceStartBand + numBandsInPatch; +- +- targetStopBand += patchParam[patch].numBandsInPatch; +- patch++; +- } +- +- /* All patches but first */ +- sourceStartBand = SHIFT_START_SB; +- +- /* Check if we are close to desiredBorder */ +- if (desiredBorder - targetStopBand < 3) /* MPEG doc */ +- { +- desiredBorder = usb; +- } +- } +- +- patch--; +- +- /* If highest patch contains less than three subband: skip it */ +- if ((patch > 0) && (patchParam[patch].numBandsInPatch < 3)) { +- patch--; +- targetStopBand = +- patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch; +- } +- +- /* now check if we don't have one too many */ +- if (patch >= MAX_NUM_PATCHES) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- pSettings->noOfPatches = patch + 1; +- +- /* Check lowest and highest source subband */ +- pSettings->lbStartPatching = targetStopBand; +- pSettings->lbStopPatching = 0; +- for (patch = 0; patch < pSettings->noOfPatches; patch++) { +- pSettings->lbStartPatching = +- fixMin(pSettings->lbStartPatching, patchParam[patch].sourceStartBand); +- pSettings->lbStopPatching = +- fixMax(pSettings->lbStopPatching, patchParam[patch].sourceStopBand); +- } +- +- for (i = 0; i < noNoiseBands; i++) { +- pSettings->bwBorders[i] = noiseBandTable[i + 1]; +- } +- for (; i < MAX_NUM_NOISE_VALUES; i++) { +- pSettings->bwBorders[i] = 255; +- } +- +- /* +- * Choose whitening factors +- */ +- +- startFreqHz = +- ((lsb + xoverOffset) * fs) >> 7; /* Shift does a division by 2*(64) */ +- +- for (i = 1; i < NUM_WHFACTOR_TABLE_ENTRIES; i++) { +- if (startFreqHz < FDK_sbrDecoder_sbr_whFactorsIndex[i]) break; +- } +- i--; +- +- pSettings->whFactors.off = FDK_sbrDecoder_sbr_whFactorsTable[i][0]; +- pSettings->whFactors.transitionLevel = +- FDK_sbrDecoder_sbr_whFactorsTable[i][1]; +- pSettings->whFactors.lowLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][2]; +- pSettings->whFactors.midLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][3]; +- pSettings->whFactors.highLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][4]; +- +- return SBRDEC_OK; +-} +diff --git a/libSBRdec/src/lpp_tran.h b/libSBRdec/src/lpp_tran.h +deleted file mode 100644 +index 51b4395..0000000 +--- a/libSBRdec/src/lpp_tran.h ++++ /dev/null +@@ -1,275 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Low Power Profile Transposer +-*/ +- +-#ifndef LPP_TRAN_H +-#define LPP_TRAN_H +- +-#include "sbrdecoder.h" +-#include "hbe.h" +-#include "qmf.h" +- +-/* +- Common +-*/ +-#define QMF_OUT_SCALE 8 +- +-/* +- Frequency scales +-*/ +- +-/* +- Env-Adjust +-*/ +-#define MAX_NOISE_ENVELOPES 2 +-#define MAX_NOISE_COEFFS 5 +-#define MAX_NUM_NOISE_VALUES (MAX_NOISE_ENVELOPES * MAX_NOISE_COEFFS) +-#define MAX_NUM_LIMITERS 12 +- +-/* Set MAX_ENVELOPES to the largest value of all supported BSFORMATs +- by overriding MAX_ENVELOPES in the correct order: */ +-#define MAX_ENVELOPES_LEGACY 5 +-#define MAX_ENVELOPES_USAC 8 +-#define MAX_ENVELOPES MAX_ENVELOPES_USAC +- +-#define MAX_FREQ_COEFFS_DUAL_RATE 48 +-#define MAX_FREQ_COEFFS_QUAD_RATE 56 +-#define MAX_FREQ_COEFFS MAX_FREQ_COEFFS_QUAD_RATE +- +-#define MAX_FREQ_COEFFS_FS44100 35 +-#define MAX_FREQ_COEFFS_FS48000 32 +- +-#define MAX_NUM_ENVELOPE_VALUES (MAX_ENVELOPES * MAX_FREQ_COEFFS) +- +-#define MAX_GAIN_EXP 34 +-/* Maximum gain will be sqrt(0.5 * 2^MAX_GAIN_EXP) +- example: 34=99dB */ +-#define MAX_GAIN_CONCEAL_EXP 1 +-/* Maximum gain will be sqrt(0.5 * 2^MAX_GAIN_CONCEAL_EXP) in concealment case +- * (0dB) */ +- +-/* +- LPP Transposer +-*/ +-#define LPC_ORDER 2 +- +-#define MAX_INVF_BANDS MAX_NOISE_COEFFS +- +-#define MAX_NUM_PATCHES 6 +-#define SHIFT_START_SB 1 /*!< lowest subband of source range */ +- +-typedef enum { +- INVF_OFF = 0, +- INVF_LOW_LEVEL, +- INVF_MID_LEVEL, +- INVF_HIGH_LEVEL, +- INVF_SWITCHED /* not a real choice but used here to control behaviour */ +-} INVF_MODE; +- +-/** parameter set for one single patch */ +-typedef struct { +- UCHAR sourceStartBand; /*!< first band in lowbands where to take the samples +- from */ +- UCHAR +- sourceStopBand; /*!< first band in lowbands which is not included in the +- patch anymore */ +- UCHAR guardStartBand; /*!< first band in highbands to be filled with zeros in +- order to reduce interferences between patches */ +- UCHAR +- targetStartBand; /*!< first band in highbands to be filled with whitened +- lowband signal */ +- UCHAR targetBandOffs; /*!< difference between 'startTargetBand' and +- 'startSourceBand' */ +- UCHAR numBandsInPatch; /*!< number of consecutive bands in this one patch */ +-} PATCH_PARAM; +- +-/** whitening factors for different levels of whitening +- need to be initialized corresponding to crossover frequency */ +-typedef struct { +- FIXP_DBL off; /*!< bw factor for signal OFF */ +- FIXP_DBL transitionLevel; +- FIXP_DBL lowLevel; /*!< bw factor for signal LOW_LEVEL */ +- FIXP_DBL midLevel; /*!< bw factor for signal MID_LEVEL */ +- FIXP_DBL highLevel; /*!< bw factor for signal HIGH_LEVEL */ +-} WHITENING_FACTORS; +- +-/*! The transposer settings are calculated on a header reset and are shared by +- * both channels. */ +-typedef struct { +- UCHAR nCols; /*!< number subsamples of a codec frame */ +- UCHAR noOfPatches; /*!< number of patches */ +- UCHAR lbStartPatching; /*!< first band of lowbands that will be patched */ +- UCHAR lbStopPatching; /*!< first band that won't be patched anymore*/ +- UCHAR bwBorders[MAX_NUM_NOISE_VALUES]; /*!< spectral bands with different +- inverse filtering levels */ +- +- PATCH_PARAM +- patchParam[MAX_NUM_PATCHES]; /*!< new parameter set for patching */ +- WHITENING_FACTORS +- whFactors; /*!< the pole moving factors for certain +- whitening levels as indicated in the bitstream +- depending on the crossover frequency */ +- UCHAR overlap; /*!< Overlap size */ +-} TRANSPOSER_SETTINGS; +- +-typedef struct { +- TRANSPOSER_SETTINGS *pSettings; /*!< Common settings for both channels */ +- FIXP_DBL +- bwVectorOld[MAX_NUM_PATCHES]; /*!< pole moving factors of past frame */ +- FIXP_DBL lpcFilterStatesRealLegSBR[LPC_ORDER + (3 * (4))][( +- 32)]; /*!< pointer array to save filter states */ +- +- FIXP_DBL lpcFilterStatesImagLegSBR[LPC_ORDER + (3 * (4))][( +- 32)]; /*!< pointer array to save filter states */ +- +- FIXP_DBL lpcFilterStatesRealHBE[LPC_ORDER + (3 * (4))][( +- 64)]; /*!< pointer array to save filter states */ +- FIXP_DBL lpcFilterStatesImagHBE[LPC_ORDER + (3 * (4))][( +- 64)]; /*!< pointer array to save filter states */ +-} SBR_LPP_TRANS; +- +-typedef SBR_LPP_TRANS *HANDLE_SBR_LPP_TRANS; +- +-void lppTransposer(HANDLE_SBR_LPP_TRANS hLppTrans, +- QMF_SCALE_FACTOR *sbrScaleFactor, FIXP_DBL **qmfBufferReal, +- +- FIXP_DBL *degreeAlias, FIXP_DBL **qmfBufferImag, +- const int useLP, const int fPreWhitening, +- const int v_k_master0, const int timeStep, +- const int firstSlotOffset, const int lastSlotOffset, +- const int nInvfBands, INVF_MODE *sbr_invf_mode, +- INVF_MODE *sbr_invf_mode_prev); +- +-void lppTransposerHBE( +- HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ +- HANDLE_HBE_TRANSPOSER hQmfTransposer, +- QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ +- FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband +- samples (source) */ +- FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of +- subband samples (source) */ +- const int timeStep, /*!< Time step of envelope */ +- const int firstSlotOffs, /*!< Start position in time */ +- const int lastSlotOffs, /*!< Number of overlap-slots into next frame */ +- const int nInvfBands, /*!< Number of bands for inverse filtering */ +- INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ +- INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */ +-); +- +-SBR_ERROR +-createLppTransposer(HANDLE_SBR_LPP_TRANS hLppTrans, +- TRANSPOSER_SETTINGS *pSettings, const int highBandStartSb, +- UCHAR *v_k_master, const int numMaster, const int usb, +- const int timeSlots, const int nCols, UCHAR *noiseBandTable, +- const int noNoiseBands, UINT fs, const int chan, +- const int overlap); +- +-SBR_ERROR +-resetLppTransposer(HANDLE_SBR_LPP_TRANS hLppTrans, UCHAR highBandStartSb, +- UCHAR *v_k_master, UCHAR numMaster, UCHAR *noiseBandTable, +- UCHAR noNoiseBands, UCHAR usb, UINT fs); +- +-#endif /* LPP_TRAN_H */ +diff --git a/libSBRdec/src/psbitdec.cpp b/libSBRdec/src/psbitdec.cpp +deleted file mode 100644 +index 82bb65b..0000000 +--- a/libSBRdec/src/psbitdec.cpp ++++ /dev/null +@@ -1,594 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "psbitdec.h" +- +-#include "sbr_rom.h" +-#include "huff_dec.h" +- +-/* PS dec privat functions */ +-SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d); +- +-/***************************************************************************/ +-/*! +- \brief huffman decoding by codebook table +- +- \return index of huffman codebook table +- +-****************************************************************************/ +-static SCHAR decode_huff_cw( +- Huffman h, /*!< pointer to huffman codebook table */ +- HANDLE_FDK_BITSTREAM hBitBuf, /*!< Handle to Bitbuffer */ +- int *length) /*!< length of huffman codeword (or NULL) */ +-{ +- UCHAR bit = 0; +- SCHAR index = 0; +- UCHAR bitCount = 0; +- +- while (index >= 0) { +- bit = FDKreadBits(hBitBuf, 1); +- bitCount++; +- index = h[index][bit]; +- } +- if (length) { +- *length = bitCount; +- } +- return (index + 64); /* Add offset */ +-} +- +-/***************************************************************************/ +-/*! +- \brief helper function - limiting of value to min/max values +- +- \return limited value +- +-****************************************************************************/ +- +-static SCHAR limitMinMax(SCHAR i, SCHAR min, SCHAR max) { +- if (i < min) +- return min; +- else if (i > max) +- return max; +- else +- return i; +-} +- +-/***************************************************************************/ +-/*! +- \brief Decodes delta values in-place and updates +- data buffers according to quantization classes. +- +- When delta coded in frequency the first element is deltacode from zero. +- aIndex buffer is decoded from delta values to actual values. +- +- \return none +- +-****************************************************************************/ +-static void deltaDecodeArray( +- SCHAR enable, SCHAR *aIndex, /*!< ICC/IID parameters */ +- SCHAR *aPrevFrameIndex, /*!< ICC/IID parameters of previous frame */ +- SCHAR DtDf, UCHAR nrElements, /*!< as conveyed in bitstream */ +- /*!< output array size: nrElements*stride */ +- UCHAR stride, /*!< 1=dflt, 2=half freq. resolution */ +- SCHAR minIdx, SCHAR maxIdx) { +- int i; +- +- /* Delta decode */ +- if (enable == 1) { +- if (DtDf == 0) { /* Delta coded in freq */ +- aIndex[0] = 0 + aIndex[0]; +- aIndex[0] = limitMinMax(aIndex[0], minIdx, maxIdx); +- for (i = 1; i < nrElements; i++) { +- aIndex[i] = aIndex[i - 1] + aIndex[i]; +- aIndex[i] = limitMinMax(aIndex[i], minIdx, maxIdx); +- } +- } else { /* Delta time */ +- for (i = 0; i < nrElements; i++) { +- aIndex[i] = aPrevFrameIndex[i * stride] + aIndex[i]; +- aIndex[i] = limitMinMax(aIndex[i], minIdx, maxIdx); +- } +- } +- } else { /* No data is sent, set index to zero */ +- for (i = 0; i < nrElements; i++) { +- aIndex[i] = 0; +- } +- } +- if (stride == 2) { +- for (i = nrElements * stride - 1; i > 0; i--) { +- aIndex[i] = aIndex[i >> 1]; +- } +- } +-} +- +-/***************************************************************************/ +-/*! +- \brief Mapping of ICC/IID parameters to 20 stereo bands +- +- \return none +- +-****************************************************************************/ +-static void map34IndexTo20(SCHAR *aIndex, /*!< decoded ICC/IID parameters */ +- UCHAR noBins) /*!< number of stereo bands */ +-{ +- aIndex[0] = (2 * aIndex[0] + aIndex[1]) / 3; +- aIndex[1] = (aIndex[1] + 2 * aIndex[2]) / 3; +- aIndex[2] = (2 * aIndex[3] + aIndex[4]) / 3; +- aIndex[3] = (aIndex[4] + 2 * aIndex[5]) / 3; +- aIndex[4] = (aIndex[6] + aIndex[7]) / 2; +- aIndex[5] = (aIndex[8] + aIndex[9]) / 2; +- aIndex[6] = aIndex[10]; +- aIndex[7] = aIndex[11]; +- aIndex[8] = (aIndex[12] + aIndex[13]) / 2; +- aIndex[9] = (aIndex[14] + aIndex[15]) / 2; +- aIndex[10] = aIndex[16]; +- /* For IPD/OPD it stops here */ +- +- if (noBins == NO_HI_RES_BINS) { +- aIndex[11] = aIndex[17]; +- aIndex[12] = aIndex[18]; +- aIndex[13] = aIndex[19]; +- aIndex[14] = (aIndex[20] + aIndex[21]) / 2; +- aIndex[15] = (aIndex[22] + aIndex[23]) / 2; +- aIndex[16] = (aIndex[24] + aIndex[25]) / 2; +- aIndex[17] = (aIndex[26] + aIndex[27]) / 2; +- aIndex[18] = (aIndex[28] + aIndex[29] + aIndex[30] + aIndex[31]) / 4; +- aIndex[19] = (aIndex[32] + aIndex[33]) / 2; +- } +-} +- +-/***************************************************************************/ +-/*! +- \brief Decodes delta coded IID, ICC, IPD and OPD indices +- +- \return PS processing flag. If set to 1 +- +-****************************************************************************/ +-int DecodePs(struct PS_DEC *h_ps_d, /*!< PS handle */ +- const UCHAR frameError, /*!< Flag telling that frame had errors */ +- PS_DEC_COEFFICIENTS *pScratch) { +- MPEG_PS_BS_DATA *pBsData; +- UCHAR gr, env; +- int bPsHeaderValid, bPsDataAvail; +- +- /* Assign Scratch */ +- h_ps_d->specificTo.mpeg.pCoef = pScratch; +- +- /* Shortcuts to avoid deferencing and keep the code readable */ +- pBsData = &h_ps_d->bsData[h_ps_d->processSlot].mpeg; +- bPsHeaderValid = pBsData->bPsHeaderValid; +- bPsDataAvail = +- (h_ps_d->bPsDataAvail[h_ps_d->processSlot] == ppt_mpeg) ? 1 : 0; +- +- /*************************************************************************************** +- * Decide whether to process or to conceal PS data or not. */ +- +- if ((h_ps_d->psDecodedPrv && !frameError && !bPsDataAvail) || +- (!h_ps_d->psDecodedPrv && +- (frameError || !bPsDataAvail || !bPsHeaderValid))) { +- /* Don't apply PS processing. +- * Declare current PS header and bitstream data invalid. */ +- pBsData->bPsHeaderValid = 0; +- h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; +- return (0); +- } +- +- if (frameError || +- !bPsHeaderValid) { /* no new PS data available (e.g. frame loss) */ +- /* => keep latest data constant (i.e. FIX with noEnv=0) */ +- pBsData->noEnv = 0; +- } +- +- /*************************************************************************************** +- * Decode bitstream payload or prepare parameter for concealment: +- */ +- for (env = 0; env < pBsData->noEnv; env++) { +- SCHAR *aPrevIidIndex; +- SCHAR *aPrevIccIndex; +- +- UCHAR noIidSteps = pBsData->bFineIidQ ? NO_IID_STEPS_FINE : NO_IID_STEPS; +- +- if (env == 0) { +- aPrevIidIndex = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex; +- aPrevIccIndex = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex; +- } else { +- aPrevIidIndex = pBsData->aaIidIndex[env - 1]; +- aPrevIccIndex = pBsData->aaIccIndex[env - 1]; +- } +- +- deltaDecodeArray(pBsData->bEnableIid, pBsData->aaIidIndex[env], +- aPrevIidIndex, pBsData->abIidDtFlag[env], +- FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid], +- (pBsData->freqResIid) ? 1 : 2, -noIidSteps, noIidSteps); +- +- deltaDecodeArray(pBsData->bEnableIcc, pBsData->aaIccIndex[env], +- aPrevIccIndex, pBsData->abIccDtFlag[env], +- FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc], +- (pBsData->freqResIcc) ? 1 : 2, 0, NO_ICC_STEPS - 1); +- } /* for (env=0; envnoEnv; env++) */ +- +- /* handling of FIX noEnv=0 */ +- if (pBsData->noEnv == 0) { +- /* set noEnv=1, keep last parameters or force 0 if not enabled */ +- pBsData->noEnv = 1; +- +- if (pBsData->bEnableIid) { +- pBsData->bFineIidQ = h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ; +- pBsData->freqResIid = h_ps_d->specificTo.mpeg.prevFreqResIid; +- for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { +- pBsData->aaIidIndex[pBsData->noEnv - 1][gr] = +- h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; +- } +- } else { +- for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { +- pBsData->aaIidIndex[pBsData->noEnv - 1][gr] = 0; +- } +- } +- +- if (pBsData->bEnableIcc) { +- pBsData->freqResIcc = h_ps_d->specificTo.mpeg.prevFreqResIcc; +- for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { +- pBsData->aaIccIndex[pBsData->noEnv - 1][gr] = +- h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; +- } +- } else { +- for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { +- pBsData->aaIccIndex[pBsData->noEnv - 1][gr] = 0; +- } +- } +- } +- +- /* Update previous frame Iid quantization */ +- h_ps_d->specificTo.mpeg.bPrevFrameFineIidQ = pBsData->bFineIidQ; +- +- /* Update previous frequency resolution for IID */ +- h_ps_d->specificTo.mpeg.prevFreqResIid = pBsData->freqResIid; +- +- /* Update previous frequency resolution for ICC */ +- h_ps_d->specificTo.mpeg.prevFreqResIcc = pBsData->freqResIcc; +- +- /* Update previous frame index buffers */ +- for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { +- h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr] = +- pBsData->aaIidIndex[pBsData->noEnv - 1][gr]; +- } +- for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { +- h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr] = +- pBsData->aaIccIndex[pBsData->noEnv - 1][gr]; +- } +- +- /* PS data from bitstream (if avail) was decoded now */ +- h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; +- +- /* handling of env borders for FIX & VAR */ +- if (pBsData->bFrameClass == 0) { +- /* FIX_BORDERS NoEnv=0,1,2,4 */ +- pBsData->aEnvStartStop[0] = 0; +- for (env = 1; env < pBsData->noEnv; env++) { +- pBsData->aEnvStartStop[env] = +- (env * h_ps_d->noSubSamples) / pBsData->noEnv; +- } +- pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; +- /* 1024 (32 slots) env borders: 0, 8, 16, 24, 32 */ +- /* 960 (30 slots) env borders: 0, 7, 15, 22, 30 */ +- } else { /* if (h_ps_d->bFrameClass == 0) */ +- /* VAR_BORDERS NoEnv=1,2,3,4 */ +- pBsData->aEnvStartStop[0] = 0; +- +- /* handle case aEnvStartStop[noEnv]aEnvStartStop[pBsData->noEnv] < h_ps_d->noSubSamples) { +- for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { +- pBsData->aaIidIndex[pBsData->noEnv][gr] = +- pBsData->aaIidIndex[pBsData->noEnv - 1][gr]; +- } +- for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { +- pBsData->aaIccIndex[pBsData->noEnv][gr] = +- pBsData->aaIccIndex[pBsData->noEnv - 1][gr]; +- } +- pBsData->noEnv++; +- pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; +- } +- +- /* enforce strictly monotonic increasing borders */ +- for (env = 1; env < pBsData->noEnv; env++) { +- UCHAR thr; +- thr = (UCHAR)h_ps_d->noSubSamples - (pBsData->noEnv - env); +- if (pBsData->aEnvStartStop[env] > thr) { +- pBsData->aEnvStartStop[env] = thr; +- } else { +- thr = pBsData->aEnvStartStop[env - 1] + 1; +- if (pBsData->aEnvStartStop[env] < thr) { +- pBsData->aEnvStartStop[env] = thr; +- } +- } +- } +- } /* if (h_ps_d->bFrameClass == 0) ... else */ +- +- /* copy data prior to possible 20<->34 in-place mapping */ +- for (env = 0; env < pBsData->noEnv; env++) { +- UCHAR i; +- for (i = 0; i < NO_HI_RES_IID_BINS; i++) { +- h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][i] = +- pBsData->aaIidIndex[env][i]; +- } +- for (i = 0; i < NO_HI_RES_ICC_BINS; i++) { +- h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][i] = +- pBsData->aaIccIndex[env][i]; +- } +- } +- +- /* MPEG baseline PS */ +- /* Baseline version of PS always uses the hybrid filter structure with 20 +- * stereo bands. */ +- /* If ICC/IID parameters for 34 stereo bands are decoded they have to be +- * mapped to 20 */ +- /* stereo bands. */ +- /* Additionaly the IPD/OPD parameters won't be used. */ +- +- for (env = 0; env < pBsData->noEnv; env++) { +- if (pBsData->freqResIid == 2) +- map34IndexTo20(h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env], +- NO_HI_RES_IID_BINS); +- if (pBsData->freqResIcc == 2) +- map34IndexTo20(h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env], +- NO_HI_RES_ICC_BINS); +- +- /* IPD/OPD is disabled in baseline version and thus was removed here */ +- } +- +- return (1); +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Reads parametric stereo data from bitstream +- +- \return +- +-****************************************************************************/ +-unsigned int ReadPsData( +- HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ +- HANDLE_FDK_BITSTREAM hBitBuf, /*!< handle to struct BIT_BUF */ +- int nBitsLeft /*!< max number of bits available */ +-) { +- MPEG_PS_BS_DATA *pBsData; +- +- UCHAR gr, env; +- SCHAR dtFlag; +- INT startbits; +- Huffman CurrentTable; +- SCHAR bEnableHeader; +- +- if (!h_ps_d) return 0; +- +- pBsData = &h_ps_d->bsData[h_ps_d->bsReadSlot].mpeg; +- +- if (h_ps_d->bsReadSlot != h_ps_d->bsLastSlot) { +- /* Copy last header data */ +- FDKmemcpy(pBsData, &h_ps_d->bsData[h_ps_d->bsLastSlot].mpeg, +- sizeof(MPEG_PS_BS_DATA)); +- } +- +- startbits = (INT)FDKgetValidBits(hBitBuf); +- +- bEnableHeader = (SCHAR)FDKreadBits(hBitBuf, 1); +- +- /* Read header */ +- if (bEnableHeader) { +- pBsData->bPsHeaderValid = 1; +- pBsData->bEnableIid = (UCHAR)FDKreadBits(hBitBuf, 1); +- if (pBsData->bEnableIid) { +- pBsData->modeIid = (UCHAR)FDKreadBits(hBitBuf, 3); +- } +- +- pBsData->bEnableIcc = (UCHAR)FDKreadBits(hBitBuf, 1); +- if (pBsData->bEnableIcc) { +- pBsData->modeIcc = (UCHAR)FDKreadBits(hBitBuf, 3); +- } +- +- pBsData->bEnableExt = (UCHAR)FDKreadBits(hBitBuf, 1); +- } +- +- pBsData->bFrameClass = (UCHAR)FDKreadBits(hBitBuf, 1); +- if (pBsData->bFrameClass == 0) { +- /* FIX_BORDERS NoEnv=0,1,2,4 */ +- pBsData->noEnv = +- FDK_sbrDecoder_aFixNoEnvDecode[(UCHAR)FDKreadBits(hBitBuf, 2)]; +- /* all additional handling of env borders is now in DecodePs() */ +- } else { +- /* VAR_BORDERS NoEnv=1,2,3,4 */ +- pBsData->noEnv = 1 + (UCHAR)FDKreadBits(hBitBuf, 2); +- for (env = 1; env < pBsData->noEnv + 1; env++) +- pBsData->aEnvStartStop[env] = ((UCHAR)FDKreadBits(hBitBuf, 5)) + 1; +- /* all additional handling of env borders is now in DecodePs() */ +- } +- +- /* verify that IID & ICC modes (quant grid, freq res) are supported */ +- if ((pBsData->modeIid > 5) || (pBsData->modeIcc > 5)) { +- /* no useful PS data could be read from bitstream */ +- h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_none; +- /* discard all remaining bits */ +- nBitsLeft -= startbits - (INT)FDKgetValidBits(hBitBuf); +- while (nBitsLeft > 0) { +- int i = nBitsLeft; +- if (i > 8) { +- i = 8; +- } +- FDKreadBits(hBitBuf, i); +- nBitsLeft -= i; +- } +- return (UINT)(startbits - (INT)FDKgetValidBits(hBitBuf)); +- } +- +- if (pBsData->modeIid > 2) { +- pBsData->freqResIid = pBsData->modeIid - 3; +- pBsData->bFineIidQ = 1; +- } else { +- pBsData->freqResIid = pBsData->modeIid; +- pBsData->bFineIidQ = 0; +- } +- +- if (pBsData->modeIcc > 2) { +- pBsData->freqResIcc = pBsData->modeIcc - 3; +- } else { +- pBsData->freqResIcc = pBsData->modeIcc; +- } +- +- /* Extract IID data */ +- if (pBsData->bEnableIid) { +- for (env = 0; env < pBsData->noEnv; env++) { +- dtFlag = (SCHAR)FDKreadBits(hBitBuf, 1); +- if (!dtFlag) { +- if (pBsData->bFineIidQ) +- CurrentTable = (Huffman)&aBookPsIidFineFreqDecode; +- else +- CurrentTable = (Huffman)&aBookPsIidFreqDecode; +- } else { +- if (pBsData->bFineIidQ) +- CurrentTable = (Huffman)&aBookPsIidFineTimeDecode; +- else +- CurrentTable = (Huffman)&aBookPsIidTimeDecode; +- } +- +- for (gr = 0; gr < FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid]; gr++) +- pBsData->aaIidIndex[env][gr] = +- decode_huff_cw(CurrentTable, hBitBuf, NULL); +- pBsData->abIidDtFlag[env] = dtFlag; +- } +- } +- +- /* Extract ICC data */ +- if (pBsData->bEnableIcc) { +- for (env = 0; env < pBsData->noEnv; env++) { +- dtFlag = (SCHAR)FDKreadBits(hBitBuf, 1); +- if (!dtFlag) +- CurrentTable = (Huffman)&aBookPsIccFreqDecode; +- else +- CurrentTable = (Huffman)&aBookPsIccTimeDecode; +- +- for (gr = 0; gr < FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc]; gr++) +- pBsData->aaIccIndex[env][gr] = +- decode_huff_cw(CurrentTable, hBitBuf, NULL); +- pBsData->abIccDtFlag[env] = dtFlag; +- } +- } +- +- if (pBsData->bEnableExt) { +- /*! +- Decoders that support only the baseline version of the PS tool are allowed +- to ignore the IPD/OPD data, but according header data has to be parsed. +- ISO/IEC 14496-3 Subpart 8 Annex 4 +- */ +- +- int cnt = FDKreadBits(hBitBuf, PS_EXTENSION_SIZE_BITS); +- if (cnt == (1 << PS_EXTENSION_SIZE_BITS) - 1) { +- cnt += FDKreadBits(hBitBuf, PS_EXTENSION_ESC_COUNT_BITS); +- } +- while (cnt--) FDKreadBits(hBitBuf, 8); +- } +- +- /* new PS data was read from bitstream */ +- h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_mpeg; +- +- return (startbits - (INT)FDKgetValidBits(hBitBuf)); +-} +diff --git a/libSBRdec/src/psbitdec.h b/libSBRdec/src/psbitdec.h +deleted file mode 100644 +index f0fc43a..0000000 +--- a/libSBRdec/src/psbitdec.h ++++ /dev/null +@@ -1,116 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#ifndef PSBITDEC_H +-#define PSBITDEC_H +- +-#include "sbrdecoder.h" +- +-#include "psdec.h" +- +-unsigned int ReadPsData(struct PS_DEC *h_ps_d, HANDLE_FDK_BITSTREAM hBs, +- int nBitsLeft); +- +-int DecodePs(struct PS_DEC *h_ps_d, const UCHAR frameError, +- PS_DEC_COEFFICIENTS *pCoef); +- +-#endif /* PSBITDEC_H */ +diff --git a/libSBRdec/src/psdec.cpp b/libSBRdec/src/psdec.cpp +deleted file mode 100644 +index b31b310..0000000 +--- a/libSBRdec/src/psdec.cpp ++++ /dev/null +@@ -1,722 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief parametric stereo decoder +-*/ +- +-#include "psdec.h" +- +-#include "FDK_bitbuffer.h" +- +-#include "sbr_rom.h" +-#include "sbr_ram.h" +- +-#include "FDK_tools_rom.h" +- +-#include "genericStds.h" +- +-#include "FDK_trigFcts.h" +- +-/********************************************************************/ +-/* MLQUAL DEFINES */ +-/********************************************************************/ +- +-#define FRACT_ZERO FRACT_BITS - 1 +-/********************************************************************/ +- +-SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d); +- +-/***** HELPERS *****/ +- +-/***************************************************************************/ +-/*! +- \brief Creates one instance of the PS_DEC struct +- +- \return Error info +- +-****************************************************************************/ +-int CreatePsDec(HANDLE_PS_DEC *h_PS_DEC, /*!< pointer to the module state */ +- int aacSamplesPerFrame) { +- SBR_ERROR errorInfo = SBRDEC_OK; +- HANDLE_PS_DEC h_ps_d; +- int i; +- +- if (*h_PS_DEC == NULL) { +- /* Get ps dec ram */ +- h_ps_d = GetRam_ps_dec(); +- if (h_ps_d == NULL) { +- goto bail; +- } +- } else { +- /* Reset an open instance */ +- h_ps_d = *h_PS_DEC; +- } +- +- /* +- * Create Analysis Hybrid filterbank. +- */ +- FDKhybridAnalysisOpen(&h_ps_d->specificTo.mpeg.hybridAnalysis, +- h_ps_d->specificTo.mpeg.pHybridAnaStatesLFdmx, +- sizeof(h_ps_d->specificTo.mpeg.pHybridAnaStatesLFdmx), +- NULL, 0); +- +- /* initialisation */ +- switch (aacSamplesPerFrame) { +- case 960: +- h_ps_d->noSubSamples = 30; /* col */ +- break; +- case 1024: +- h_ps_d->noSubSamples = 32; /* col */ +- break; +- default: +- h_ps_d->noSubSamples = -1; +- break; +- } +- +- if (h_ps_d->noSubSamples > MAX_NUM_COL || h_ps_d->noSubSamples <= 0) { +- goto bail; +- } +- h_ps_d->noChannels = NO_QMF_CHANNELS; /* row */ +- +- h_ps_d->psDecodedPrv = 0; +- h_ps_d->procFrameBased = -1; +- for (i = 0; i < (1) + 1; i++) { +- h_ps_d->bPsDataAvail[i] = ppt_none; +- } +- { +- int error; +- error = FDKdecorrelateOpen(&(h_ps_d->specificTo.mpeg.apDecor), +- h_ps_d->specificTo.mpeg.decorrBufferCplx, +- (2 * ((825) + (373)))); +- if (error) goto bail; +- } +- +- for (i = 0; i < (1) + 1; i++) { +- FDKmemclear(&h_ps_d->bsData[i].mpeg, sizeof(MPEG_PS_BS_DATA)); +- } +- +- errorInfo = ResetPsDec(h_ps_d); +- +- if (errorInfo != SBRDEC_OK) goto bail; +- +- *h_PS_DEC = h_ps_d; +- +- return 0; +- +-bail: +- if (h_ps_d != NULL) { +- DeletePsDec(&h_ps_d); +- } +- +- return -1; +-} /*END CreatePsDec */ +- +-/***************************************************************************/ +-/*! +- \brief Delete one instance of the PS_DEC struct +- +- \return Error info +- +-****************************************************************************/ +-int DeletePsDec(HANDLE_PS_DEC *h_PS_DEC) /*!< pointer to the module state */ +-{ +- if (*h_PS_DEC == NULL) { +- return -1; +- } +- +- { +- HANDLE_PS_DEC h_ps_d = *h_PS_DEC; +- FDKdecorrelateClose(&(h_ps_d->specificTo.mpeg.apDecor)); +- } +- +- FreeRam_ps_dec(h_PS_DEC); +- +- return 0; +-} /*END DeletePsDec */ +- +-/***************************************************************************/ +-/*! +- \brief resets some values of the PS handle to default states +- +- \return +- +-****************************************************************************/ +-SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d) /*!< pointer to the module state */ +-{ +- SBR_ERROR errorInfo = SBRDEC_OK; +- INT i; +- +- /* explicitly init state variables to safe values (until first ps header +- * arrives) */ +- +- h_ps_d->specificTo.mpeg.lastUsb = 0; +- +- /* +- * Initialize Analysis Hybrid filterbank. +- */ +- FDKhybridAnalysisInit(&h_ps_d->specificTo.mpeg.hybridAnalysis, THREE_TO_TEN, +- NO_QMF_BANDS_HYBRID20, NO_QMF_BANDS_HYBRID20, 1); +- +- /* +- * Initialize Synthesis Hybrid filterbank. +- */ +- for (i = 0; i < 2; i++) { +- FDKhybridSynthesisInit(&h_ps_d->specificTo.mpeg.hybridSynthesis[i], +- THREE_TO_TEN, NO_QMF_CHANNELS, NO_QMF_CHANNELS); +- } +- { +- INT error; +- error = FDKdecorrelateInit(&h_ps_d->specificTo.mpeg.apDecor, 71, DECORR_PS, +- DUCKER_AUTOMATIC, 0, 0, 0, 0, 1, /* isLegacyPS */ +- 1); +- if (error) return SBRDEC_NOT_INITIALIZED; +- } +- +- for (i = 0; i < NO_IID_GROUPS; i++) { +- h_ps_d->specificTo.mpeg.h11rPrev[i] = FL2FXCONST_DBL(0.5f); +- h_ps_d->specificTo.mpeg.h12rPrev[i] = FL2FXCONST_DBL(0.5f); +- } +- +- FDKmemclear(h_ps_d->specificTo.mpeg.h21rPrev, +- sizeof(h_ps_d->specificTo.mpeg.h21rPrev)); +- FDKmemclear(h_ps_d->specificTo.mpeg.h22rPrev, +- sizeof(h_ps_d->specificTo.mpeg.h22rPrev)); +- +- return errorInfo; +-} +- +-/***************************************************************************/ +-/*! +- \brief Feed delaylines when parametric stereo is switched on. +- \return +-****************************************************************************/ +-void PreparePsProcessing(HANDLE_PS_DEC h_ps_d, +- const FIXP_DBL *const *const rIntBufferLeft, +- const FIXP_DBL *const *const iIntBufferLeft, +- const int scaleFactorLowBand) { +- if (h_ps_d->procFrameBased == +- 1) /* If we have switched from frame to slot based processing */ +- { /* fill hybrid delay buffer. */ +- int i, j; +- +- for (i = 0; i < HYBRID_FILTER_DELAY; i++) { +- FIXP_DBL qmfInputData[2][NO_QMF_BANDS_HYBRID20]; +- FIXP_DBL hybridOutputData[2][NO_SUB_QMF_CHANNELS]; +- +- for (j = 0; j < NO_QMF_BANDS_HYBRID20; j++) { +- qmfInputData[0][j] = +- scaleValue(rIntBufferLeft[i][j], scaleFactorLowBand); +- qmfInputData[1][j] = +- scaleValue(iIntBufferLeft[i][j], scaleFactorLowBand); +- } +- +- FDKhybridAnalysisApply(&h_ps_d->specificTo.mpeg.hybridAnalysis, +- qmfInputData[0], qmfInputData[1], +- hybridOutputData[0], hybridOutputData[1]); +- } +- h_ps_d->procFrameBased = 0; /* switch to slot based processing. */ +- +- } /* procFrameBased==1 */ +-} +- +-void initSlotBasedRotation( +- HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */ +- int env, int usb) { +- INT group = 0; +- INT bin = 0; +- INT noIidSteps, noFactors; +- +- FIXP_SGL invL; +- FIXP_DBL ScaleL, ScaleR; +- FIXP_DBL Alpha, Beta, AlphasValue; +- FIXP_DBL h11r, h12r, h21r, h22r; +- +- const FIXP_DBL *PScaleFactors; +- +- if (h_ps_d->bsData[h_ps_d->processSlot].mpeg.bFineIidQ) { +- PScaleFactors = ScaleFactorsFine; /* values are shiftet right by one */ +- noIidSteps = NO_IID_STEPS_FINE; +- noFactors = NO_IID_LEVELS_FINE; +- } else { +- PScaleFactors = ScaleFactors; /* values are shiftet right by one */ +- noIidSteps = NO_IID_STEPS; +- noFactors = NO_IID_LEVELS; +- } +- +- /* dequantize and decode */ +- for (group = 0; group < NO_IID_GROUPS; group++) { +- bin = bins2groupMap20[group]; +- +- /*! +-

type 'A' rotation

+- mixing procedure R_a, used in baseline version
+- +- Scale-factor vectors c1 and c2 are precalculated in initPsTables () and +- stored in scaleFactors[] and scaleFactorsFine[] = pScaleFactors []. From the +- linearized IID parameters (intensity differences), two scale factors are +- calculated. They are used to obtain the coefficients h11... h22. +- */ +- +- /* ScaleR and ScaleL are scaled by 1 shift right */ +- +- ScaleL = ScaleR = 0; +- if (noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors) +- ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.pCoef +- ->aaIidIndexMapped[env][bin]]; +- if (noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors) +- ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.pCoef +- ->aaIidIndexMapped[env][bin]]; +- +- AlphasValue = 0; +- if (h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin] >= 0) +- AlphasValue = Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]]; +- Beta = fMult( +- fMult(AlphasValue, +- (ScaleR - ScaleL)), +- FIXP_SQRT05); +- Alpha = +- AlphasValue >> 1; +- +- /* Alpha and Beta are now both scaled by 2 shifts right */ +- +- /* calculate the coefficients h11... h22 from scale-factors and ICC +- * parameters */ +- +- /* h values are scaled by 1 shift right */ +- { +- FIXP_DBL trigData[4]; +- +- inline_fixp_cos_sin(Beta + Alpha, Beta - Alpha, 2, trigData); +- h11r = fMult(ScaleL, trigData[0]); +- h12r = fMult(ScaleR, trigData[2]); +- h21r = fMult(ScaleL, trigData[1]); +- h22r = fMult(ScaleR, trigData[3]); +- } +- /*****************************************************************************************/ +- /* Interpolation of the matrices H11... H22: */ +- /* */ +- /* H11(k,n) = H11(k,n[e]) + (n-n[e]) * (H11(k,n[e+1] - H11(k,n[e])) / +- * (n[e+1] - n[e]) */ +- /* ... */ +- /*****************************************************************************************/ +- +- /* invL = 1/(length of envelope) */ +- invL = FX_DBL2FX_SGL(GetInvInt( +- h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env + 1] - +- h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env])); +- +- h_ps_d->specificTo.mpeg.pCoef->H11r[group] = +- h_ps_d->specificTo.mpeg.h11rPrev[group]; +- h_ps_d->specificTo.mpeg.pCoef->H12r[group] = +- h_ps_d->specificTo.mpeg.h12rPrev[group]; +- h_ps_d->specificTo.mpeg.pCoef->H21r[group] = +- h_ps_d->specificTo.mpeg.h21rPrev[group]; +- h_ps_d->specificTo.mpeg.pCoef->H22r[group] = +- h_ps_d->specificTo.mpeg.h22rPrev[group]; +- +- h_ps_d->specificTo.mpeg.pCoef->DeltaH11r[group] = +- fMult(h11r - h_ps_d->specificTo.mpeg.pCoef->H11r[group], invL); +- h_ps_d->specificTo.mpeg.pCoef->DeltaH12r[group] = +- fMult(h12r - h_ps_d->specificTo.mpeg.pCoef->H12r[group], invL); +- h_ps_d->specificTo.mpeg.pCoef->DeltaH21r[group] = +- fMult(h21r - h_ps_d->specificTo.mpeg.pCoef->H21r[group], invL); +- h_ps_d->specificTo.mpeg.pCoef->DeltaH22r[group] = +- fMult(h22r - h_ps_d->specificTo.mpeg.pCoef->H22r[group], invL); +- +- /* update prev coefficients for interpolation in next envelope */ +- +- h_ps_d->specificTo.mpeg.h11rPrev[group] = h11r; +- h_ps_d->specificTo.mpeg.h12rPrev[group] = h12r; +- h_ps_d->specificTo.mpeg.h21rPrev[group] = h21r; +- h_ps_d->specificTo.mpeg.h22rPrev[group] = h22r; +- +- } /* group loop */ +-} +- +-static const UCHAR groupTable[NO_IID_GROUPS + 1] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, +- 12, 13, 14, 15, 16, 18, 21, 25, 30, 42, 71}; +- +-static void applySlotBasedRotation( +- HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */ +- +- FIXP_DBL *mHybridRealLeft, /*!< hybrid values real left */ +- FIXP_DBL *mHybridImagLeft, /*!< hybrid values imag left */ +- +- FIXP_DBL *mHybridRealRight, /*!< hybrid values real right */ +- FIXP_DBL *mHybridImagRight /*!< hybrid values imag right */ +-) { +- INT group; +- INT subband; +- +- /**********************************************************************************************/ +- /*! +-

Mapping

+- +- The number of stereo bands that is actually used depends on the number of +- availble parameters for IID and ICC:
 nr. of IID para.| nr. of ICC para.
+-  | nr. of Stereo bands
+-   ----------------|------------------|-------------------
+-     10,20         |     10,20        |        20
+-     10,20         |     34           |        34
+-     34            |     10,20        |        34
+-     34            |     34           |        34
+-  
+- In the case the number of parameters for IIS and ICC differs from the number +- of stereo bands, a mapping from the lower number to the higher number of +- parameters is applied. Index mapping of IID and ICC parameters is already done +- in psbitdec.cpp. Further mapping is not needed here in baseline version. +- **********************************************************************************************/ +- +- /************************************************************************************************/ +- /*! +-

Mixing

+- +- To generate the QMF subband signals for the subband samples n = n[e]+1 ,,, +- n_[e+1] the parameters at position n[e] and n[e+1] are required as well as the +- subband domain signals s_k(n) and d_k(n) for n = n[e]+1... n_[e+1]. n[e] +- represents the start position for envelope e. The border positions n[e] are +- handled in DecodePS(). +- +- The stereo sub subband signals are constructed as: +-
+-  l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n)
+-  r_k(n) = H21(k,n) s_k(n) + H22(k,n) d_k(n)
+-  
+- In order to obtain the matrices H11(k,n)... H22 (k,n), the vectors h11(b)... +- h22(b) need to be calculated first (b: parameter index). Depending on ICC mode +- either mixing procedure R_a or R_b is used for that. For both procedures, the +- parameters for parameter position n[e+1] is used. +- ************************************************************************************************/ +- +- /************************************************************************************************/ +- /*! +-

Phase parameters

+- With disabled phase parameters (which is the case in baseline version), the +- H-matrices are just calculated by: +- +-
+-  H11(k,n[e+1] = h11(b(k))
+-  (...)
+-  b(k): parameter index according to mapping table
+-  
+- +-

Processing of the samples in the sub subbands

+- this loop includes the interpolation of the coefficients Hxx +- ************************************************************************************************/ +- +- /******************************************************/ +- /* construct stereo sub subband signals according to: */ +- /* */ +- /* l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n) */ +- /* r_k(n) = H12(k,n) s_k(n) + H22(k,n) d_k(n) */ +- /******************************************************/ +- PS_DEC_COEFFICIENTS *pCoef = h_ps_d->specificTo.mpeg.pCoef; +- +- for (group = 0; group < NO_IID_GROUPS; group++) { +- pCoef->H11r[group] += pCoef->DeltaH11r[group]; +- pCoef->H12r[group] += pCoef->DeltaH12r[group]; +- pCoef->H21r[group] += pCoef->DeltaH21r[group]; +- pCoef->H22r[group] += pCoef->DeltaH22r[group]; +- +- const int start = groupTable[group]; +- const int stop = groupTable[group + 1]; +- for (subband = start; subband < stop; subband++) { +- FIXP_DBL tmpLeft = +- fMultAdd(fMultDiv2(pCoef->H11r[group], mHybridRealLeft[subband]), +- pCoef->H21r[group], mHybridRealRight[subband]); +- FIXP_DBL tmpRight = +- fMultAdd(fMultDiv2(pCoef->H12r[group], mHybridRealLeft[subband]), +- pCoef->H22r[group], mHybridRealRight[subband]); +- mHybridRealLeft[subband] = tmpLeft; +- mHybridRealRight[subband] = tmpRight; +- +- tmpLeft = +- fMultAdd(fMultDiv2(pCoef->H11r[group], mHybridImagLeft[subband]), +- pCoef->H21r[group], mHybridImagRight[subband]); +- tmpRight = +- fMultAdd(fMultDiv2(pCoef->H12r[group], mHybridImagLeft[subband]), +- pCoef->H22r[group], mHybridImagRight[subband]); +- mHybridImagLeft[subband] = tmpLeft; +- mHybridImagRight[subband] = tmpRight; +- } /* subband */ +- } +-} +- +-/***************************************************************************/ +-/*! +- \brief Applies IID, ICC, IPD and OPD parameters to the current frame. +- +- \return none +- +-****************************************************************************/ +-void ApplyPsSlot( +- HANDLE_PS_DEC h_ps_d, /*!< handle PS_DEC*/ +- FIXP_DBL **rIntBufferLeft, /*!< real bands left qmf channel (38x64) */ +- FIXP_DBL **iIntBufferLeft, /*!< imag bands left qmf channel (38x64) */ +- FIXP_DBL *rIntBufferRight, /*!< real bands right qmf channel (38x64) */ +- FIXP_DBL *iIntBufferRight, /*!< imag bands right qmf channel (38x64) */ +- const int scaleFactorLowBand_no_ov, const int scaleFactorLowBand, +- const int scaleFactorHighBand, const int lsb, const int usb) { +-/*! +-The 64-band QMF representation of the monaural signal generated by the SBR tool +-is used as input of the PS tool. After the PS processing, the outputs of the +-left and right hybrid synthesis filterbanks are used to generate the stereo +-output signal. +- +-
+-
+-           -------------            ----------            -------------
+-          | Hybrid      | M_n[k,m] |          | L_n[k,m] | Hybrid      | l[n]
+- m[n] --->| analysis    |--------->|          |--------->| synthesis   |----->
+-           -------------           | Stereo   |           -------------
+-                 |                 | recon-   |
+-                 |                 | stuction |
+-                \|/                |          |
+-           -------------           |          |
+-          | De-         | D_n[k,m] |          |
+-          | correlation |--------->|          |
+-           -------------           |          |           -------------
+-                                   |          | R_n[k,m] | Hybrid      | r[n]
+-                                   |          |--------->| synthesis   |----->
+- IID, ICC ------------------------>|          |          | filter bank |
+-(IPD, OPD)                          ----------            -------------
+-
+-m[n]:      QMF represantation of the mono input
+-M_n[k,m]:  (sub-)sub-band domain signals of the mono input
+-D_n[k,m]:  decorrelated (sub-)sub-band domain signals
+-L_n[k,m]:  (sub-)sub-band domain signals of the left output
+-R_n[k,m]:  (sub-)sub-band domain signals of the right output
+-l[n],r[n]: left/right output signals
+-
+-
+-*/ +-#define NO_HYBRID_DATA_BANDS (71) +- +- int i; +- FIXP_DBL qmfInputData[2][NO_QMF_BANDS_HYBRID20]; +- FIXP_DBL *hybridData[2][2]; +- C_ALLOC_SCRATCH_START(pHybridData, FIXP_DBL, 4 * NO_HYBRID_DATA_BANDS); +- +- hybridData[0][0] = +- pHybridData + 0 * NO_HYBRID_DATA_BANDS; /* left real hybrid data */ +- hybridData[0][1] = +- pHybridData + 1 * NO_HYBRID_DATA_BANDS; /* left imag hybrid data */ +- hybridData[1][0] = +- pHybridData + 2 * NO_HYBRID_DATA_BANDS; /* right real hybrid data */ +- hybridData[1][1] = +- pHybridData + 3 * NO_HYBRID_DATA_BANDS; /* right imag hybrid data */ +- +- /*! +- Hybrid analysis filterbank: +- The lower 3 (5) of the 64 QMF subbands are further split to provide better +- frequency resolution. for PS processing. For the 10 and 20 stereo bands +- configuration, the QMF band H_0(w) is split up into 8 (sub-) sub-bands and the +- QMF bands H_1(w) and H_2(w) are spit into 2 (sub-) 4th. (See figures 8.20 +- and 8.22 of ISO/IEC 14496-3:2001/FDAM 2:2004(E) ) +- */ +- +- /* +- * Hybrid analysis. +- */ +- +- /* Get qmf input data and apply descaling */ +- for (i = 0; i < NO_QMF_BANDS_HYBRID20; i++) { +- qmfInputData[0][i] = scaleValue(rIntBufferLeft[HYBRID_FILTER_DELAY][i], +- scaleFactorLowBand_no_ov); +- qmfInputData[1][i] = scaleValue(iIntBufferLeft[HYBRID_FILTER_DELAY][i], +- scaleFactorLowBand_no_ov); +- } +- +- /* LF - part */ +- FDKhybridAnalysisApply(&h_ps_d->specificTo.mpeg.hybridAnalysis, +- qmfInputData[0], qmfInputData[1], hybridData[0][0], +- hybridData[0][1]); +- +- /* HF - part */ +- /* bands up to lsb */ +- scaleValues(&hybridData[0][0][NO_SUB_QMF_CHANNELS - 2], +- &rIntBufferLeft[0][NO_QMF_BANDS_HYBRID20], +- lsb - NO_QMF_BANDS_HYBRID20, scaleFactorLowBand); +- scaleValues(&hybridData[0][1][NO_SUB_QMF_CHANNELS - 2], +- &iIntBufferLeft[0][NO_QMF_BANDS_HYBRID20], +- lsb - NO_QMF_BANDS_HYBRID20, scaleFactorLowBand); +- +- /* bands from lsb to usb */ +- scaleValues(&hybridData[0][0][lsb + (NO_SUB_QMF_CHANNELS - 2 - +- NO_QMF_BANDS_HYBRID20)], +- &rIntBufferLeft[0][lsb], usb - lsb, scaleFactorHighBand); +- scaleValues(&hybridData[0][1][lsb + (NO_SUB_QMF_CHANNELS - 2 - +- NO_QMF_BANDS_HYBRID20)], +- &iIntBufferLeft[0][lsb], usb - lsb, scaleFactorHighBand); +- +- /* bands from usb to NO_SUB_QMF_CHANNELS which should be zero for non-overlap +- slots but can be non-zero for overlap slots */ +- FDKmemcpy( +- &hybridData[0][0] +- [usb + (NO_SUB_QMF_CHANNELS - 2 - NO_QMF_BANDS_HYBRID20)], +- &rIntBufferLeft[0][usb], sizeof(FIXP_DBL) * (NO_QMF_CHANNELS - usb)); +- FDKmemcpy( +- &hybridData[0][1] +- [usb + (NO_SUB_QMF_CHANNELS - 2 - NO_QMF_BANDS_HYBRID20)], +- &iIntBufferLeft[0][usb], sizeof(FIXP_DBL) * (NO_QMF_CHANNELS - usb)); +- +- /*! +- Decorrelation: +- By means of all-pass filtering and delaying, the (sub-)sub-band samples s_k(n) +- are converted into de-correlated (sub-)sub-band samples d_k(n). +- - k: frequency in hybrid spectrum +- - n: time index +- */ +- +- FDKdecorrelateApply(&h_ps_d->specificTo.mpeg.apDecor, +- &hybridData[0][0][0], /* left real hybrid data */ +- &hybridData[0][1][0], /* left imag hybrid data */ +- &hybridData[1][0][0], /* right real hybrid data */ +- &hybridData[1][1][0], /* right imag hybrid data */ +- 0 /* startHybBand */ +- ); +- +- /*! +- Stereo Processing: +- The sets of (sub-)sub-band samples s_k(n) and d_k(n) are processed according +- to the stereo cues which are defined per stereo band. +- */ +- +- applySlotBasedRotation(h_ps_d, +- &hybridData[0][0][0], /* left real hybrid data */ +- &hybridData[0][1][0], /* left imag hybrid data */ +- &hybridData[1][0][0], /* right real hybrid data */ +- &hybridData[1][1][0] /* right imag hybrid data */ +- ); +- +- /*! +- Hybrid synthesis filterbank: +- The stereo processed hybrid subband signals l_k(n) and r_k(n) are fed into the +- hybrid synthesis filterbanks which are identical to the 64 complex synthesis +- filterbank of the SBR tool. The input to the filterbank are slots of 64 QMF +- samples. For each slot the filterbank outputs one block of 64 samples of one +- reconstructed stereo channel. The hybrid synthesis filterbank is computed +- seperatly for the left and right channel. +- */ +- +- /* +- * Hybrid synthesis. +- */ +- for (i = 0; i < 2; i++) { +- FDKhybridSynthesisApply( +- &h_ps_d->specificTo.mpeg.hybridSynthesis[i], +- hybridData[i][0], /* real hybrid data */ +- hybridData[i][1], /* imag hybrid data */ +- (i == 0) ? rIntBufferLeft[0] +- : rIntBufferRight, /* output real qmf buffer */ +- (i == 0) ? iIntBufferLeft[0] +- : iIntBufferRight /* output imag qmf buffer */ +- ); +- } +- +- /* free temporary hybrid qmf values of one timeslot */ +- C_ALLOC_SCRATCH_END(pHybridData, FIXP_DBL, 4 * NO_HYBRID_DATA_BANDS); +- +-} /* END ApplyPsSlot */ +diff --git a/libSBRdec/src/psdec.h b/libSBRdec/src/psdec.h +deleted file mode 100644 +index 029eac4..0000000 +--- a/libSBRdec/src/psdec.h ++++ /dev/null +@@ -1,333 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Sbr decoder +-*/ +-#ifndef PSDEC_H +-#define PSDEC_H +- +-#include "sbrdecoder.h" +-#include "FDK_hybrid.h" +- +-#include "FDK_decorrelate.h" +- +-/* This PS decoder implements the baseline version. So it always uses the */ +-/* hybrid filter structure for 20 stereo bands and does not implemet IPD/OPD */ +-/* synthesis. The baseline version has to support the complete PS bitstream */ +-/* syntax. But IPD/OPD data is ignored and set to 0. If 34 stereo band config */ +-/* is used in the bitstream for IIS/ICC the decoded parameters are mapped to */ +-/* 20 stereo bands. */ +- +-#include "FDK_bitstream.h" +- +-#define SCAL_HEADROOM (2) +- +-#define PS_EXTENSION_SIZE_BITS (4) +-#define PS_EXTENSION_ESC_COUNT_BITS (8) +- +-#define NO_QMF_CHANNELS (64) +-#define MAX_NUM_COL (32) +- +-#define NO_QMF_BANDS_HYBRID20 (3) +-#define NO_SUB_QMF_CHANNELS (12) +-#define HYBRID_FILTER_DELAY (6) +- +-#define MAX_NO_PS_ENV (4 + 1) /* +1 needed for VAR_BORDER */ +- +-#define NO_HI_RES_BINS (34) +-#define NO_MID_RES_BINS (20) +-#define NO_LOW_RES_BINS (10) +- +-#define NO_HI_RES_IID_BINS (NO_HI_RES_BINS) +-#define NO_HI_RES_ICC_BINS (NO_HI_RES_BINS) +- +-#define NO_MID_RES_IID_BINS (NO_MID_RES_BINS) +-#define NO_MID_RES_ICC_BINS (NO_MID_RES_BINS) +- +-#define NO_LOW_RES_IID_BINS (NO_LOW_RES_BINS) +-#define NO_LOW_RES_ICC_BINS (NO_LOW_RES_BINS) +- +-#define SUBQMF_GROUPS (10) +-#define QMF_GROUPS (12) +- +-//#define SUBQMF_GROUPS_HI_RES ( 32 ) +-//#define QMF_GROUPS_HI_RES ( 18 ) +- +-#define NO_IID_GROUPS (SUBQMF_GROUPS + QMF_GROUPS) +-//#define NO_IID_GROUPS_HI_RES ( SUBQMF_GROUPS_HI_RES + +-// QMF_GROUPS_HI_RES ) +- +-#define NO_IID_STEPS (7) /* 1 .. + 7 */ +-#define NO_IID_STEPS_FINE (15) /* 1 .. +15 */ +-#define NO_ICC_STEPS (8) /* 0 .. + 7 */ +- +-#define NO_IID_LEVELS (2 * NO_IID_STEPS + 1) /* - 7 .. + 7 */ +-#define NO_IID_LEVELS_FINE (2 * NO_IID_STEPS_FINE + 1) /* -15 .. +15 */ +-#define NO_ICC_LEVELS (NO_ICC_STEPS) /* 0 .. + 7 */ +- +-#define FIXP_SQRT05 ((FIXP_DBL)0x5a827980) /* 1/SQRT2 */ +- +-struct PS_DEC_COEFFICIENTS { +- FIXP_DBL H11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL H12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL H21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL H22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- +- FIXP_DBL +- DeltaH11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL +- DeltaH12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL +- DeltaH21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- FIXP_DBL +- DeltaH22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ +- +- SCHAR +- aaIidIndexMapped[MAX_NO_PS_ENV] +- [NO_HI_RES_IID_BINS]; /*!< The mapped IID index for all +- envelopes and all IID bins */ +- SCHAR +- aaIccIndexMapped[MAX_NO_PS_ENV] +- [NO_HI_RES_ICC_BINS]; /*!< The mapped ICC index for all +- envelopes and all ICC bins */ +-}; +- +-typedef enum { ppt_none = 0, ppt_mpeg = 1, ppt_drm = 2 } PS_PAYLOAD_TYPE; +- +-typedef struct { +- UCHAR bPsHeaderValid; /*!< set if new header is available from bitstream */ +- +- UCHAR bEnableIid; /*!< One bit denoting the presence of IID parameters */ +- UCHAR bEnableIcc; /*!< One bit denoting the presence of ICC parameters */ +- UCHAR bEnableExt; /*!< The PS extension layer is enabled using the enable_ext +- bit. If it is set to %1 the IPD and OPD parameters are +- sent. If it is disabled, i.e. %0, the extension layer is +- skipped. */ +- +- UCHAR +- modeIid; /*!< The configuration of IID parameters (number of bands and +- quantisation grid, iid_quant) is determined by iid_mode. */ +- UCHAR modeIcc; /*!< The configuration of Inter-channel Coherence parameters +- (number of bands and quantisation grid) is determined by +- icc_mode. */ +- +- UCHAR freqResIid; /*!< 0=low, 1=mid or 2=high frequency resolution for iid */ +- UCHAR freqResIcc; /*!< 0=low, 1=mid or 2=high frequency resolution for icc */ +- +- UCHAR bFineIidQ; /*!< Use fine Iid quantisation. */ +- +- UCHAR bFrameClass; /*!< The frame_class bit determines whether the parameter +- positions of the current frame are uniformly spaced +- accross the frame or they are defined using the +- positions described by border_position. +- */ +- +- UCHAR noEnv; /*!< The number of envelopes per frame */ +- UCHAR aEnvStartStop[MAX_NO_PS_ENV + 1]; /*!< In case of variable parameter +- spacing the parameter positions are +- determined by border_position */ +- +- SCHAR abIidDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for IID, 0 +- => freq */ +- SCHAR abIccDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for ICC, 0 +- => freq */ +- +- SCHAR +- aaIidIndex[MAX_NO_PS_ENV] +- [NO_HI_RES_IID_BINS]; /*!< The IID index for all envelopes and +- all IID bins */ +- SCHAR +- aaIccIndex[MAX_NO_PS_ENV] +- [NO_HI_RES_ICC_BINS]; /*!< The ICC index for all envelopes and +- all ICC bins */ +- +-} MPEG_PS_BS_DATA; +- +-struct PS_DEC { +- SCHAR noSubSamples; +- SCHAR noChannels; +- +- SCHAR procFrameBased; /*!< Helper to detected switching from frame based to +- slot based processing +- */ +- +- PS_PAYLOAD_TYPE +- bPsDataAvail[(1) + 1]; /*!< set if new data available from bitstream */ +- UCHAR psDecodedPrv; /*!< set if PS has been processed in the last frame */ +- +- /* helpers for frame delay line */ +- UCHAR bsLastSlot; /*!< Index of last read slot. */ +- UCHAR bsReadSlot; /*!< Index of current read slot for additional delay. */ +- UCHAR processSlot; /*!< Index of current slot for processing (need for add. +- delay). */ +- +- union { /* Bitstream data */ +- MPEG_PS_BS_DATA +- mpeg; /*!< Struct containing all MPEG specific PS data from bitstream. +- */ +- } bsData[(1) + 1]; +- +- shouldBeUnion { /* Static data */ +- struct { +- SCHAR aIidPrevFrameIndex[NO_HI_RES_IID_BINS]; /*!< The IID index for +- previous frame */ +- SCHAR aIccPrevFrameIndex[NO_HI_RES_ICC_BINS]; /*!< The ICC index for +- previous frame */ +- UCHAR +- bPrevFrameFineIidQ; /*!< The IID quantization of the previous frame */ +- UCHAR prevFreqResIid; /*!< Frequency resolution for IID of the previous +- frame */ +- UCHAR prevFreqResIcc; /*!< Frequency resolution for ICC of the previous +- frame */ +- UCHAR lastUsb; /*!< uppermost WMF delay band of last frame */ +- +- FIXP_DBL pHybridAnaStatesLFdmx +- [2 * 13 * NO_QMF_BANDS_HYBRID20]; /*!< Memory used in hybrid analysis +- for filter states. */ +- FDK_ANA_HYB_FILTER hybridAnalysis; +- FDK_SYN_HYB_FILTER hybridSynthesis[2]; +- +- DECORR_DEC apDecor; /*!< Decorrelator instance. */ +- FIXP_DBL decorrBufferCplx[(2 * ((825) + (373)))]; +- +- FIXP_DBL h11rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) +- coefficients */ +- FIXP_DBL h12rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) +- coefficients */ +- FIXP_DBL h21rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) +- coefficients */ +- FIXP_DBL h22rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) +- coefficients */ +- +- PS_DEC_COEFFICIENTS +- *pCoef; /*!< temporal coefficients are on reusable scratch memory */ +- +- } mpeg; +- } +- specificTo; +-}; +- +-typedef struct PS_DEC *HANDLE_PS_DEC; +- +-int CreatePsDec(HANDLE_PS_DEC *h_PS_DEC, int aacSamplesPerFrame); +- +-int DeletePsDec(HANDLE_PS_DEC *h_PS_DEC); +- +-void PreparePsProcessing(HANDLE_PS_DEC h_ps_d, +- const FIXP_DBL *const *const rIntBufferLeft, +- const FIXP_DBL *const *const iIntBufferLeft, +- const int scaleFactorLowBand); +- +-void initSlotBasedRotation(HANDLE_PS_DEC h_ps_d, int env, int usb); +- +-void ApplyPsSlot( +- HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ +- FIXP_DBL **rIntBufferLeft, /* real values of left qmf timeslot */ +- FIXP_DBL **iIntBufferLeft, /* imag values of left qmf timeslot */ +- FIXP_DBL *rIntBufferRight, /* real values of right qmf timeslot */ +- FIXP_DBL *iIntBufferRight, /* imag values of right qmf timeslot */ +- const int scaleFactorLowBand_no_ov, const int scaleFactorLowBand, +- const int scaleFactorHighBand, const int lsb, const int usb); +- +-#endif /* PSDEC_H */ +diff --git a/libSBRdec/src/psdec_drm.cpp b/libSBRdec/src/psdec_drm.cpp +deleted file mode 100644 +index 6971f53..0000000 +--- a/libSBRdec/src/psdec_drm.cpp ++++ /dev/null +@@ -1,108 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief parametric stereo decoder for Digital radio mondial +-*/ +- +-#include "psdec_drm.h" +diff --git a/libSBRdec/src/psdec_drm.h b/libSBRdec/src/psdec_drm.h +deleted file mode 100644 +index 5e2575d..0000000 +--- a/libSBRdec/src/psdec_drm.h ++++ /dev/null +@@ -1,113 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief parametric stereo decoder for digital radio mondial +-*/ +- +-#ifndef PSDEC_DRM_H +-#define PSDEC_DRM_H +- +-#include "sbrdecoder.h" +- +-#endif /* PSDEC_DRM_H */ +diff --git a/libSBRdec/src/psdecrom_drm.cpp b/libSBRdec/src/psdecrom_drm.cpp +deleted file mode 100644 +index 2033a83..0000000 +--- a/libSBRdec/src/psdecrom_drm.cpp ++++ /dev/null +@@ -1,108 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief rom tables for Drm parametric stereo decoder +-*/ +- +-#include "psdec_drm.h" +diff --git a/libSBRdec/src/pvc_dec.cpp b/libSBRdec/src/pvc_dec.cpp +deleted file mode 100644 +index b477122..0000000 +--- a/libSBRdec/src/pvc_dec.cpp ++++ /dev/null +@@ -1,683 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: Decode Predictive Vector Coding Data +- +-*******************************************************************************/ +- +-#include "pvc_dec.h" +- +-/* PVC interal definitions */ +-#define PVC_DIVMODE_BITS 3 +-#define PVC_NSMODE_BITS 1 +-#define PVC_REUSEPVCID_BITS 1 +-#define PVC_PVCID_BITS 7 +-#define PVC_GRIDINFO_BITS 1 +-#define PVC_NQMFBAND 64 +-#define PVC_NBLOW 3 /* max. number of grouped QMF subbands below SBR range */ +- +-#define PVC_NTAB1 3 +-#define PVC_NTAB2 128 +-#define PVC_ID_NBIT 7 +- +-/* Exponent of pPvcStaticData->Esg and predictedEsg in dB domain. +- max(Esg) = 10*log10(2^15*2^15) = 90.30; +- min(Esg) = 10*log10(0.1) = -10 +- max of predicted Esg seems to be higher than 90dB but 7 Bit should be enough. +-*/ +-#define PVC_ESG_EXP 7 +- +-#define LOG10FAC 0.752574989159953f /* == 10/log2(10) * 2^-2 */ +-#define LOG10FAC_INV 0.664385618977472f /* == log2(10)/10 * 2^1 */ +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const FIXP_SGL pvc_SC_16[] = { +- FX_DBL2FXCONST_SGL(0x14413695), FX_DBL2FXCONST_SGL(0x1434b6cb), +- FX_DBL2FXCONST_SGL(0x140f27c7), FX_DBL2FXCONST_SGL(0x13d0591d), +- FX_DBL2FXCONST_SGL(0x1377f502), FX_DBL2FXCONST_SGL(0x130577d6), +- FX_DBL2FXCONST_SGL(0x12782266), FX_DBL2FXCONST_SGL(0x11cee459), +- FX_DBL2FXCONST_SGL(0x11083a2a), FX_DBL2FXCONST_SGL(0x1021f5e9), +- FX_DBL2FXCONST_SGL(0x0f18e17c), FX_DBL2FXCONST_SGL(0x0de814ca), +- FX_DBL2FXCONST_SGL(0x0c87a568), FX_DBL2FXCONST_SGL(0x0ae9b167), +- FX_DBL2FXCONST_SGL(0x08f24226), FX_DBL2FXCONST_SGL(0x06575ed5), +-}; +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const FIXP_SGL pvc_SC_12[] = { +- FX_DBL2FXCONST_SGL(0x1aba6b3e), FX_DBL2FXCONST_SGL(0x1a9d164e), +- FX_DBL2FXCONST_SGL(0x1a44d56d), FX_DBL2FXCONST_SGL(0x19b0d742), +- FX_DBL2FXCONST_SGL(0x18df969a), FX_DBL2FXCONST_SGL(0x17ce91a0), +- FX_DBL2FXCONST_SGL(0x1679c3fa), FX_DBL2FXCONST_SGL(0x14daabfc), +- FX_DBL2FXCONST_SGL(0x12e65221), FX_DBL2FXCONST_SGL(0x1088d125), +- FX_DBL2FXCONST_SGL(0x0d9907b3), FX_DBL2FXCONST_SGL(0x09a80e9d), +-}; +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const FIXP_SGL pvc_SC_4[] = { +- FX_DBL2FXCONST_SGL(0x4ad6ab0f), +- FX_DBL2FXCONST_SGL(0x47ef0dbe), +- FX_DBL2FXCONST_SGL(0x3eee7496), +- FX_DBL2FXCONST_SGL(0x2e4bd29d), +-}; +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const FIXP_SGL pvc_SC_3[] = { +- FX_DBL2FXCONST_SGL(0x610dc761), +- FX_DBL2FXCONST_SGL(0x5a519a3d), +- FX_DBL2FXCONST_SGL(0x44a09e62), +-}; +- +-static const UCHAR g_3a_pvcTab1_mode1[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE1] = +- {{{0x4F, 0x5B, 0x57, 0x52, 0x4D, 0x65, 0x45, 0x57}, +- {0xF3, 0x0F, 0x18, 0x20, 0x19, 0x4F, 0x3D, 0x23}, +- {0x78, 0x57, 0x55, 0x50, 0x50, 0x20, 0x36, 0x37}}, +- {{0x4C, 0x5F, 0x53, 0x37, 0x1E, 0xFD, 0x15, 0x0A}, +- {0x05, 0x0E, 0x28, 0x41, 0x48, 0x6E, 0x54, 0x5B}, +- {0x59, 0x47, 0x40, 0x40, 0x3D, 0x33, 0x3F, 0x39}}, +- {{0x47, 0x5F, 0x57, 0x34, 0x3C, 0x2E, 0x2E, 0x31}, +- {0xFA, 0x13, 0x23, 0x4E, 0x44, 0x7C, 0x34, 0x38}, +- {0x63, 0x43, 0x41, 0x3D, 0x35, 0x19, 0x3D, 0x33}}}; +- +-static const UCHAR g_2a_pvcTab2_mode1[PVC_NTAB2][PVC_NBHIGH_MODE1] = { +- {0xCB, 0xD1, 0xCC, 0xD2, 0xE2, 0xEB, 0xE7, 0xE8}, +- {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, +- {0x84, 0x8C, 0x88, 0x83, 0x90, 0x93, 0x86, 0x80}, +- {0xD7, 0xD8, 0xC0, 0xC7, 0xCF, 0xE5, 0xF1, 0xF6}, +- {0xA5, 0xA6, 0xAA, 0xA8, 0xB0, 0xB1, 0xB8, 0xB8}, +- {0xD7, 0xCB, 0xC1, 0xC3, 0xC5, 0xC9, 0xC9, 0xCE}, +- {0xCA, 0xB5, 0xB8, 0xB3, 0xAC, 0xB6, 0xBB, 0xB8}, +- {0xC1, 0xC4, 0xC3, 0xC5, 0xC6, 0xCA, 0xCA, 0xCB}, +- {0xE0, 0xE1, 0xD8, 0xCD, 0xCB, 0xCB, 0xCE, 0xCC}, +- {0xDB, 0xE1, 0xDF, 0xDB, 0xDC, 0xD9, 0xD9, 0xD6}, +- {0xE0, 0xDE, 0xDD, 0xDD, 0xE0, 0xE3, 0xE5, 0xE6}, +- {0xCA, 0xD2, 0xCD, 0xCE, 0xD5, 0xDB, 0xD9, 0xDB}, +- {0xD2, 0xE0, 0xDB, 0xD5, 0xDB, 0xDE, 0xE3, 0xE1}, +- {0xE5, 0xDB, 0xD0, 0xD2, 0xD8, 0xDD, 0xDB, 0xDD}, +- {0xC0, 0xB5, 0xBF, 0xDD, 0xE3, 0xDC, 0xDC, 0xE4}, +- {0xDB, 0xCE, 0xC6, 0xCF, 0xCF, 0xD1, 0xD3, 0xD4}, +- {0xC9, 0xD7, 0xDA, 0xE2, 0xE9, 0xE7, 0xDF, 0xDC}, +- {0x0A, 0x07, 0x0A, 0x08, 0x19, 0x24, 0x1F, 0x22}, +- {0x1E, 0x1F, 0x11, 0x0E, 0x22, 0x2D, 0x33, 0x32}, +- {0xF0, 0xDA, 0xDC, 0x18, 0x1F, 0x19, 0x0A, 0x1E}, +- {0x09, 0xF8, 0xE6, 0x05, 0x19, 0x11, 0x0E, 0x0B}, +- {0x09, 0x10, 0x0E, 0xE6, 0xF4, 0x20, 0x22, 0xFA}, +- {0xF2, 0xE5, 0xF8, 0x0E, 0x18, 0x15, 0x0D, 0x10}, +- {0x15, 0x13, 0x16, 0x0A, 0x0D, 0x1F, 0x1D, 0x1B}, +- {0xFA, 0xFF, 0xFE, 0xFF, 0x09, 0x11, 0x03, 0x0B}, +- {0xFE, 0xFA, 0xF2, 0xF8, 0x0C, 0x1E, 0x11, 0x12}, +- {0xFA, 0xF8, 0x0B, 0x17, 0x1D, 0x17, 0x0E, 0x16}, +- {0x00, 0xF3, 0xFD, 0x0A, 0x1C, 0x17, 0xFD, 0x08}, +- {0xEA, 0xEA, 0x03, 0x12, 0x1E, 0x14, 0x09, 0x04}, +- {0x02, 0xFE, 0x04, 0xFB, 0x0C, 0x0E, 0x07, 0x02}, +- {0xF6, 0x02, 0x07, 0x0B, 0x17, 0x17, 0x01, 0xFF}, +- {0xF5, 0xFB, 0xFE, 0x04, 0x12, 0x14, 0x0C, 0x0D}, +- {0x10, 0x10, 0x0E, 0x04, 0x07, 0x11, 0x0F, 0x13}, +- {0x0C, 0x0F, 0xFB, 0xF2, 0x0A, 0x12, 0x09, 0x0D}, +- {0x0D, 0x1D, 0xF1, 0xF4, 0x2A, 0x06, 0x3B, 0x32}, +- {0xFC, 0x08, 0x06, 0x02, 0x0E, 0x17, 0x08, 0x0E}, +- {0x07, 0x02, 0xEE, 0xEE, 0x2B, 0xF6, 0x23, 0x13}, +- {0x04, 0x02, 0x05, 0x08, 0x0B, 0x0E, 0xFB, 0xFB}, +- {0x00, 0x04, 0x10, 0x18, 0x22, 0x25, 0x1D, 0x1F}, +- {0xFB, 0x0D, 0x07, 0x00, 0x0C, 0x0F, 0xFC, 0x02}, +- {0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x03, 0x05}, +- {0x04, 0x05, 0x08, 0x13, 0xFF, 0xEB, 0x0C, 0x06}, +- {0x05, 0x13, 0x0E, 0x0B, 0x12, 0x15, 0x09, 0x0A}, +- {0x09, 0x03, 0x09, 0x05, 0x12, 0x16, 0x11, 0x12}, +- {0x14, 0x1A, 0x06, 0x01, 0x10, 0x11, 0xFE, 0x02}, +- {0x01, 0x0B, 0x0B, 0x0C, 0x18, 0x21, 0x10, 0x13}, +- {0x12, 0x0D, 0x0A, 0x10, 0x1C, 0x1D, 0x0D, 0x10}, +- {0x03, 0x09, 0x14, 0x15, 0x1B, 0x1A, 0x01, 0xFF}, +- {0x08, 0x12, 0x13, 0x0E, 0x16, 0x1D, 0x14, 0x1B}, +- {0x07, 0x15, 0x1C, 0x1B, 0x20, 0x21, 0x11, 0x0E}, +- {0x12, 0x18, 0x19, 0x17, 0x20, 0x25, 0x1A, 0x1E}, +- {0x0C, 0x1A, 0x1D, 0x22, 0x2F, 0x33, 0x27, 0x28}, +- {0x0E, 0x1A, 0x17, 0x10, 0x0A, 0x0E, 0xFF, 0x06}, +- {0x1A, 0x1C, 0x18, 0x14, 0x1A, 0x16, 0x0A, 0x0E}, +- {0x1E, 0x27, 0x25, 0x26, 0x27, 0x2A, 0x21, 0x21}, +- {0xF1, 0x0A, 0x16, 0x1C, 0x28, 0x25, 0x15, 0x19}, +- {0x08, 0x12, 0x09, 0x08, 0x16, 0x17, 0xEF, 0xF6}, +- {0x0C, 0x0B, 0x00, 0xFC, 0x04, 0x09, 0xFC, 0x03}, +- {0xFB, 0xF1, 0xF8, 0x26, 0x24, 0x18, 0x1D, 0x20}, +- {0xF9, 0x01, 0x0C, 0x0F, 0x07, 0x08, 0x06, 0x07}, +- {0x07, 0x06, 0x08, 0x04, 0x07, 0x0D, 0x07, 0x09}, +- {0xFE, 0x01, 0x06, 0x05, 0x13, 0x1B, 0x14, 0x19}, +- {0x09, 0x0C, 0x0E, 0x01, 0x08, 0x05, 0xFB, 0xFD}, +- {0x07, 0x06, 0x03, 0x0A, 0x16, 0x12, 0x04, 0x07}, +- {0x04, 0x01, 0x00, 0x04, 0x1F, 0x20, 0x0E, 0x0A}, +- {0x03, 0xFF, 0xF6, 0xFB, 0x15, 0x1A, 0x00, 0x03}, +- {0xFC, 0x18, 0x0B, 0x2D, 0x35, 0x23, 0x12, 0x09}, +- {0x02, 0xFE, 0x01, 0xFF, 0x0C, 0x11, 0x0D, 0x0F}, +- {0xFA, 0xE9, 0xD9, 0xFF, 0x0D, 0x05, 0x0D, 0x10}, +- {0xF1, 0xE0, 0xF0, 0x01, 0x06, 0x06, 0x06, 0x10}, +- {0xE9, 0xD4, 0xD7, 0x0F, 0x14, 0x0B, 0x0D, 0x16}, +- {0x00, 0xFF, 0xEE, 0xE5, 0xFF, 0x08, 0x02, 0xF9}, +- {0xE0, 0xDA, 0xE5, 0xFE, 0x09, 0x02, 0xF9, 0x04}, +- {0xE0, 0xE2, 0xF4, 0x09, 0x13, 0x0C, 0x0D, 0x09}, +- {0xFC, 0x02, 0x04, 0xFF, 0x00, 0xFF, 0xF8, 0xF7}, +- {0xFE, 0xFB, 0xED, 0xF2, 0xFE, 0xFE, 0x08, 0x0C}, +- {0xF3, 0xEF, 0xD0, 0xE3, 0x05, 0x11, 0xFD, 0xFF}, +- {0xFA, 0xEF, 0xEA, 0xFE, 0x0D, 0x0E, 0xFE, 0x02}, +- {0xF7, 0xFB, 0xDB, 0xDF, 0x14, 0xDD, 0x07, 0xFE}, +- {0xFE, 0x08, 0x00, 0xDB, 0xE5, 0x1A, 0x13, 0xED}, +- {0xF9, 0xFE, 0xFF, 0xF4, 0xF3, 0x00, 0x05, 0x02}, +- {0xEF, 0xDE, 0xD8, 0xEB, 0xEA, 0xF5, 0x0E, 0x19}, +- {0xFB, 0xFC, 0xFA, 0xEC, 0xEB, 0xED, 0xEE, 0xE8}, +- {0xEE, 0xFC, 0xFD, 0x00, 0x04, 0xFC, 0xF0, 0xF5}, +- {0x00, 0xFA, 0xF4, 0xF1, 0xF5, 0xFA, 0xFB, 0xF9}, +- {0xEB, 0xF0, 0xDF, 0xE3, 0xEF, 0x07, 0x02, 0x05}, +- {0xF7, 0xF0, 0xE6, 0xE7, 0x06, 0x15, 0x06, 0x0C}, +- {0xF1, 0xE4, 0xD8, 0xEA, 0x06, 0xF2, 0x07, 0x09}, +- {0xFF, 0xFE, 0xFE, 0xF9, 0xFF, 0xFF, 0x02, 0xF9}, +- {0xDD, 0xF4, 0xF0, 0xF1, 0xFF, 0xFF, 0xEA, 0xF1}, +- {0xF0, 0xF1, 0xFD, 0x03, 0x03, 0xFE, 0x00, 0x05}, +- {0xF1, 0xF6, 0xE0, 0xDF, 0xF5, 0x01, 0xF4, 0xF8}, +- {0x02, 0x03, 0xE5, 0xDC, 0xE7, 0xFD, 0x02, 0x08}, +- {0xEC, 0xF1, 0xF5, 0xEC, 0xF2, 0xF8, 0xF6, 0xEE}, +- {0xF3, 0xF4, 0xF6, 0xF4, 0xF5, 0xF1, 0xE7, 0xEA}, +- {0xF7, 0xF3, 0xEC, 0xEA, 0xEF, 0xF0, 0xEE, 0xF1}, +- {0xEB, 0xF6, 0xFB, 0xFA, 0xEF, 0xF3, 0xF3, 0xF7}, +- {0x01, 0x03, 0xF1, 0xF6, 0x05, 0xF8, 0xE1, 0xEB}, +- {0xF5, 0xF6, 0xF6, 0xF4, 0xFB, 0xFB, 0xFF, 0x00}, +- {0xF8, 0x01, 0xFB, 0xFA, 0xFF, 0x03, 0xFE, 0x04}, +- {0x04, 0xFB, 0x03, 0xFD, 0xF5, 0xF7, 0xF6, 0xFB}, +- {0x06, 0x09, 0xFB, 0xF4, 0xF9, 0xFA, 0xFC, 0xFF}, +- {0xF5, 0xF6, 0xF1, 0xEE, 0xF5, 0xF8, 0xF5, 0xF9}, +- {0xF5, 0xF9, 0xFA, 0xFC, 0x07, 0x09, 0x01, 0xFB}, +- {0xD7, 0xE9, 0xE8, 0xEC, 0x00, 0x0C, 0xFE, 0xF1}, +- {0xEC, 0x04, 0xE9, 0xDF, 0x03, 0xE8, 0x00, 0xFA}, +- {0xE6, 0xE2, 0xFF, 0x0A, 0x13, 0x01, 0x00, 0xF7}, +- {0xF1, 0xFA, 0xF7, 0xF5, 0x01, 0x06, 0x05, 0x0A}, +- {0xF6, 0xF6, 0xFC, 0xF6, 0xE8, 0x11, 0xF2, 0xFE}, +- {0xFE, 0x08, 0x05, 0x12, 0xFD, 0xD0, 0x0E, 0x07}, +- {0xF1, 0xFE, 0xF7, 0xF2, 0xFB, 0x02, 0xFA, 0xF8}, +- {0xF4, 0xEA, 0xEC, 0xF3, 0xFE, 0x01, 0xF7, 0xF6}, +- {0xFF, 0xFA, 0xFB, 0xF9, 0xFF, 0x01, 0x04, 0x03}, +- {0x00, 0xF9, 0xF4, 0xFC, 0x05, 0xFC, 0xF7, 0xFB}, +- {0xF8, 0xFF, 0xEF, 0xEC, 0xFB, 0x04, 0xF8, 0x03}, +- {0xEB, 0xF1, 0xED, 0xF4, 0x02, 0x0E, 0x0B, 0x04}, +- {0xF7, 0x01, 0xF8, 0xF4, 0xF8, 0xEF, 0xF8, 0x04}, +- {0xEB, 0xF0, 0xF7, 0xFC, 0x10, 0x0D, 0xF8, 0xF8}, +- {0xE8, 0xFE, 0xEE, 0xE8, 0xED, 0xF7, 0xF5, 0xF8}, +- {0xED, 0xEB, 0xE9, 0xEA, 0xF2, 0xF5, 0xF4, 0xF9}, +- {0xEA, 0xF2, 0xEF, 0xEE, 0xF9, 0xFE, 0xFD, 0x02}, +- {0xFA, 0xFD, 0x02, 0x0D, 0xFA, 0xE4, 0x0F, 0x01}, +- {0xFF, 0x08, 0x05, 0xF6, 0xF7, 0xFB, 0xF1, 0xF1}, +- {0xF4, 0xEC, 0xEE, 0xF6, 0xEE, 0xEE, 0xF8, 0x06}, +- {0xE8, 0xFA, 0xF8, 0xE8, 0xF8, 0xE9, 0xEE, 0xF9}, +- {0xE5, 0xE9, 0xF0, 0x00, 0x00, 0xEF, 0xF3, 0xF8}, +- {0xF7, 0xFB, 0xFB, 0xF7, 0xF9, 0xF9, 0xF5, 0xF0}, +- {0xFD, 0xFF, 0xF2, 0xEE, 0xF2, 0xF5, 0xF1, 0xF3}}; +- +-static const UCHAR g_3a_pvcTab1_mode2[PVC_NTAB1][PVC_NBLOW][PVC_NBHIGH_MODE2] = +- {{{0x11, 0x27, 0x0F, 0xFD, 0x04, 0xFC}, +- {0x00, 0xBE, 0xE3, 0xF4, 0xDB, 0xF0}, +- {0x09, 0x1E, 0x18, 0x1A, 0x21, 0x1B}}, +- {{0x16, 0x28, 0x2B, 0x29, 0x25, 0x32}, +- {0xF2, 0xE9, 0xE4, 0xE5, 0xE2, 0xD4}, +- {0x0E, 0x0B, 0x0C, 0x0D, 0x0D, 0x0E}}, +- {{0x2E, 0x3C, 0x20, 0x16, 0x1B, 0x1A}, +- {0xE4, 0xC6, 0xE5, 0xF4, 0xDC, 0xDC}, +- {0x0F, 0x1B, 0x18, 0x14, 0x1E, 0x1A}}}; +- +-static const UCHAR g_2a_pvcTab2_mode2[PVC_NTAB2][PVC_NBHIGH_MODE2] = { +- {0x26, 0x25, 0x11, 0x0C, 0xFA, 0x15}, {0x1B, 0x18, 0x11, 0x0E, 0x0E, 0x0E}, +- {0x12, 0x10, 0x10, 0x10, 0x11, 0x10}, {0x1E, 0x24, 0x19, 0x15, 0x14, 0x12}, +- {0x24, 0x16, 0x12, 0x13, 0x15, 0x1C}, {0xEA, 0xED, 0xEB, 0xEA, 0xEC, 0xEB}, +- {0xFC, 0xFD, 0xFD, 0xFC, 0xFE, 0xFE}, {0x0F, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B}, +- {0x22, 0x0B, 0x16, 0x18, 0x13, 0x19}, {0x1C, 0x14, 0x1D, 0x20, 0x19, 0x1A}, +- {0x10, 0x08, 0x00, 0xFF, 0x02, 0x05}, {0x06, 0x07, 0x05, 0x03, 0x05, 0x04}, +- {0x2A, 0x1F, 0x12, 0x12, 0x11, 0x18}, {0x19, 0x19, 0x02, 0x04, 0x00, 0x04}, +- {0x18, 0x17, 0x17, 0x15, 0x16, 0x15}, {0x21, 0x1E, 0x1B, 0x19, 0x1C, 0x1B}, +- {0x3C, 0x35, 0x20, 0x1D, 0x30, 0x34}, {0x3A, 0x1F, 0x37, 0x38, 0x33, 0x31}, +- {0x37, 0x34, 0x25, 0x27, 0x35, 0x34}, {0x34, 0x2E, 0x32, 0x31, 0x34, 0x31}, +- {0x36, 0x33, 0x2F, 0x2F, 0x32, 0x2F}, {0x35, 0x20, 0x2F, 0x32, 0x2F, 0x2C}, +- {0x2E, 0x2B, 0x2F, 0x34, 0x36, 0x30}, {0x3F, 0x39, 0x30, 0x28, 0x29, 0x29}, +- {0x3C, 0x30, 0x32, 0x37, 0x39, 0x36}, {0x37, 0x36, 0x30, 0x2B, 0x26, 0x24}, +- {0x44, 0x38, 0x2F, 0x2D, 0x2D, 0x2D}, {0x38, 0x2B, 0x2C, 0x2C, 0x30, 0x2D}, +- {0x37, 0x36, 0x2F, 0x23, 0x2D, 0x32}, {0x3C, 0x39, 0x29, 0x2E, 0x38, 0x37}, +- {0x3B, 0x3A, 0x35, 0x32, 0x31, 0x2D}, {0x32, 0x31, 0x2F, 0x2C, 0x2D, 0x28}, +- {0x2C, 0x31, 0x32, 0x30, 0x32, 0x2D}, {0x35, 0x34, 0x34, 0x34, 0x35, 0x33}, +- {0x34, 0x38, 0x3B, 0x3C, 0x3E, 0x3A}, {0x3E, 0x3C, 0x3B, 0x3A, 0x3C, 0x39}, +- {0x3D, 0x41, 0x46, 0x41, 0x3D, 0x38}, {0x44, 0x41, 0x40, 0x3E, 0x3F, 0x3A}, +- {0x47, 0x47, 0x47, 0x42, 0x44, 0x40}, {0x4C, 0x4A, 0x4A, 0x46, 0x49, 0x45}, +- {0x53, 0x52, 0x52, 0x4C, 0x4E, 0x49}, {0x41, 0x3D, 0x39, 0x2C, 0x2E, 0x2E}, +- {0x2D, 0x37, 0x36, 0x30, 0x28, 0x36}, {0x3B, 0x32, 0x2E, 0x2D, 0x2D, 0x29}, +- {0x40, 0x39, 0x36, 0x35, 0x36, 0x32}, {0x30, 0x2D, 0x2D, 0x2E, 0x31, 0x30}, +- {0x38, 0x3D, 0x3B, 0x37, 0x35, 0x34}, {0x44, 0x3D, 0x3C, 0x38, 0x37, 0x33}, +- {0x3A, 0x36, 0x37, 0x37, 0x39, 0x36}, {0x32, 0x36, 0x37, 0x30, 0x2E, 0x2A}, +- {0x3C, 0x33, 0x33, 0x31, 0x33, 0x30}, {0x30, 0x31, 0x36, 0x37, 0x38, 0x34}, +- {0x26, 0x27, 0x2E, 0x29, 0x1C, 0x16}, {0x14, 0x15, 0x1F, 0x17, 0x15, 0x1C}, +- {0x38, 0x2D, 0x18, 0x13, 0x1E, 0x2B}, {0x30, 0x22, 0x17, 0x1A, 0x26, 0x2B}, +- {0x24, 0x20, 0x1F, 0x10, 0x0C, 0x11}, {0x27, 0x1F, 0x13, 0x17, 0x24, 0x2A}, +- {0x2F, 0x13, 0x18, 0x13, 0x2A, 0x32}, {0x31, 0x1E, 0x1E, 0x1E, 0x21, 0x28}, +- {0x2A, 0x12, 0x19, 0x17, 0x16, 0x24}, {0x27, 0x0F, 0x16, 0x1D, 0x17, 0x1C}, +- {0x2F, 0x26, 0x25, 0x22, 0x20, 0x22}, {0x1E, 0x1B, 0x1E, 0x18, 0x1E, 0x24}, +- {0x31, 0x26, 0x0E, 0x15, 0x15, 0x25}, {0x2D, 0x22, 0x1E, 0x14, 0x10, 0x22}, +- {0x25, 0x1B, 0x18, 0x11, 0x13, 0x1F}, {0x2F, 0x1B, 0x13, 0x1B, 0x18, 0x22}, +- {0x21, 0x24, 0x1D, 0x1C, 0x1D, 0x1B}, {0x23, 0x1E, 0x28, 0x29, 0x27, 0x25}, +- {0x2E, 0x2A, 0x1D, 0x17, 0x26, 0x2D}, {0x31, 0x2C, 0x1A, 0x0E, 0x1A, 0x24}, +- {0x26, 0x16, 0x20, 0x1D, 0x14, 0x1E}, {0x29, 0x20, 0x1B, 0x1B, 0x17, 0x17}, +- {0x1D, 0x06, 0x1A, 0x1E, 0x1B, 0x1D}, {0x2B, 0x23, 0x1F, 0x1F, 0x1D, 0x1C}, +- {0x27, 0x1A, 0x0C, 0x0E, 0x0F, 0x1A}, {0x29, 0x1D, 0x1E, 0x22, 0x22, 0x24}, +- {0x20, 0x21, 0x1B, 0x18, 0x13, 0x21}, {0x27, 0x0E, 0x10, 0x14, 0x10, 0x1A}, +- {0x26, 0x24, 0x25, 0x25, 0x26, 0x28}, {0x1A, 0x24, 0x25, 0x29, 0x26, 0x24}, +- {0x1D, 0x1D, 0x15, 0x12, 0x0F, 0x18}, {0x1E, 0x14, 0x13, 0x12, 0x14, 0x18}, +- {0x16, 0x13, 0x13, 0x1A, 0x1B, 0x1D}, {0x20, 0x27, 0x22, 0x24, 0x1A, 0x19}, +- {0x1F, 0x17, 0x19, 0x18, 0x17, 0x18}, {0x20, 0x1B, 0x1C, 0x1C, 0x1B, 0x1A}, +- {0x23, 0x19, 0x1D, 0x1F, 0x1E, 0x21}, {0x26, 0x1F, 0x1D, 0x1B, 0x19, 0x1A}, +- {0x23, 0x1E, 0x1F, 0x20, 0x1F, 0x1E}, {0x29, 0x20, 0x22, 0x20, 0x20, 0x1F}, +- {0x26, 0x23, 0x21, 0x22, 0x23, 0x23}, {0x29, 0x1F, 0x24, 0x25, 0x26, 0x29}, +- {0x2B, 0x22, 0x25, 0x27, 0x23, 0x21}, {0x29, 0x21, 0x19, 0x0E, 0x22, 0x2D}, +- {0x32, 0x29, 0x1F, 0x1C, 0x1B, 0x21}, {0x1E, 0x1A, 0x1E, 0x24, 0x25, 0x25}, +- {0x24, 0x1D, 0x21, 0x22, 0x22, 0x25}, {0x2C, 0x25, 0x21, 0x22, 0x23, 0x25}, +- {0x24, 0x1E, 0x21, 0x26, 0x2B, 0x2C}, {0x28, 0x24, 0x1B, 0x1F, 0x28, 0x2D}, +- {0x23, 0x13, 0x16, 0x22, 0x22, 0x29}, {0x1B, 0x23, 0x1C, 0x20, 0x14, 0x0D}, +- {0x1E, 0x16, 0x1A, 0x1E, 0x1C, 0x1D}, {0x2B, 0x1C, 0x1D, 0x20, 0x1B, 0x1C}, +- {0x1C, 0x1B, 0x23, 0x1F, 0x19, 0x1E}, {0x21, 0x23, 0x26, 0x20, 0x20, 0x22}, +- {0x1D, 0x0B, 0x19, 0x1E, 0x11, 0x19}, {0x18, 0x17, 0x16, 0x17, 0x14, 0x16}, +- {0x16, 0x19, 0x1C, 0x20, 0x21, 0x22}, {0x30, 0x1E, 0x22, 0x24, 0x25, 0x26}, +- {0x1B, 0x1F, 0x17, 0x1D, 0x1E, 0x21}, {0x32, 0x2B, 0x27, 0x1F, 0x1B, 0x1A}, +- {0x28, 0x20, 0x1A, 0x1B, 0x1F, 0x23}, {0x32, 0x21, 0x20, 0x21, 0x1D, 0x1F}, +- {0x22, 0x18, 0x12, 0x15, 0x1B, 0x20}, {0x27, 0x27, 0x2A, 0x24, 0x21, 0x21}, +- {0x1E, 0x0F, 0x0D, 0x1A, 0x1D, 0x23}, {0x28, 0x25, 0x27, 0x21, 0x17, 0x25}, +- {0x2B, 0x27, 0x23, 0x19, 0x13, 0x14}, {0x25, 0x2B, 0x22, 0x22, 0x20, 0x21}, +- {0x27, 0x1B, 0x16, 0x17, 0x0F, 0x15}, {0x29, 0x26, 0x23, 0x15, 0x1E, 0x28}, +- {0x24, 0x1C, 0x19, 0x1A, 0x18, 0x19}, {0x2D, 0x15, 0x27, 0x2B, 0x24, 0x23}, +- {0x2C, 0x12, 0x1F, 0x23, 0x1F, 0x20}, {0x25, 0x0F, 0x22, 0x27, 0x1F, 0x21}}; +- +-static const UCHAR g_a_pvcTab1_dp_mode1[PVC_NTAB1 - 1] = {17, 68}; +-static const UCHAR g_a_pvcTab1_dp_mode2[PVC_NTAB1 - 1] = {16, 52}; +-/* fractional exponent which corresponds to Q representation value */ +-static const SCHAR g_a_scalingCoef_mode1[PVC_NBLOW + 1] = { +- -1, -1, 0, 6}; /* { 8, 8, 7, 1 }; Q scaling */ +-static const SCHAR g_a_scalingCoef_mode2[PVC_NBLOW + 1] = { +- 0, 0, 1, 7}; /* { 7, 7, 6, 0 }; Q scaling */ +- +-int pvcInitFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, const UCHAR pvcMode, +- const UCHAR ns, const int RATE, const int kx, +- const int pvcBorder0, const UCHAR *pPvcID) { +- int lbw, hbw, i, temp; +- pPvcDynamicData->pvc_mode = pvcMode; +- pPvcDynamicData->kx = kx; +- pPvcDynamicData->RATE = RATE; +- +- switch (pvcMode) { +- case 0: +- /* legacy SBR, nothing to do */ +- return 0; +- case 1: +- pPvcDynamicData->nbHigh = 8; +- pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode1; +- pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode1; +- pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode1; +- pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode1; +- hbw = 8 / RATE; +- break; +- case 2: +- pPvcDynamicData->nbHigh = 6; +- pPvcDynamicData->pPVCTab1 = (const UCHAR *)g_3a_pvcTab1_mode2; +- pPvcDynamicData->pPVCTab2 = (const UCHAR *)g_2a_pvcTab2_mode2; +- pPvcDynamicData->pPVCTab1_dp = g_a_pvcTab1_dp_mode2; +- pPvcDynamicData->pScalingCoef = g_a_scalingCoef_mode2; +- hbw = 12 / RATE; +- break; +- default: +- /* invalid pvcMode */ +- return 1; +- } +- +- pPvcDynamicData->pvcBorder0 = pvcBorder0; +- UCHAR pvcBorder0_last = pPvcStaticData->pvcBorder0; +- pPvcStaticData->pvcBorder0 = pvcBorder0; +- pPvcDynamicData->pPvcID = pPvcID; +- +- pPvcDynamicData->ns = ns; +- switch (ns) { +- case 16: +- pPvcDynamicData->pSCcoeffs = pvc_SC_16; +- break; +- case 12: +- pPvcDynamicData->pSCcoeffs = pvc_SC_12; +- break; +- case 4: +- pPvcDynamicData->pSCcoeffs = pvc_SC_4; +- break; +- case 3: +- pPvcDynamicData->pSCcoeffs = pvc_SC_3; +- break; +- default: +- return 1; +- } +- +- /* in the lower part of Esg-array there are previous values of Esg (from last +- call to this function In case of an previous legay-SBR frame, or if there +- was a change in cross-over FQ the value of first PVC SBR timeslot is +- propagated to prev-values in order to have reasonable values for +- smooth-filtering +- */ +- if ((pPvcStaticData->pvc_mode_last == 0) || (pPvcStaticData->kx_last != kx)) { +- pPvcDynamicData->pastEsgSlotsAvail = 0; +- } else { +- pPvcDynamicData->pastEsgSlotsAvail = PVC_NS_MAX - pvcBorder0_last; +- } +- +- lbw = 8 / RATE; +- +- temp = kx; +- for (i = PVC_NBLOW; i >= 0; i--) { +- pPvcDynamicData->sg_offset_low[i] = temp; +- temp -= lbw; +- } +- +- temp = 0; +- for (i = 0; i <= pPvcDynamicData->nbHigh; i++) { +- pPvcDynamicData->sg_offset_high_kx[i] = temp; +- temp += hbw; +- } +- +- return 0; +-} +- +-/* call if pvcMode = 1,2 */ +-void pvcDecodeFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **qmfBufferReal, +- FIXP_DBL **qmfBufferImag, const int overlap, +- const int qmfExponentOverlap, +- const int qmfExponentCurrent) { +- int t; +- FIXP_DBL *predictedEsgSlot; +- int RATE = pPvcDynamicData->RATE; +- int pvcBorder0 = pPvcDynamicData->pvcBorder0; +- +- for (t = pvcBorder0; t < PVC_NTIMESLOT; t++) { +- int *pPredEsg_exp = &pPvcDynamicData->predEsg_exp[t]; +- predictedEsgSlot = pPvcDynamicData->predEsg[t]; +- +- pvcDecodeTimeSlot( +- pPvcStaticData, pPvcDynamicData, &qmfBufferReal[t * RATE], +- &qmfBufferImag[t * RATE], +- (t * RATE < overlap) ? qmfExponentOverlap : qmfExponentCurrent, +- pvcBorder0, t, predictedEsgSlot, pPredEsg_exp); +- } +- +- return; +-} +- +-void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, +- FIXP_DBL **qmfSlotReal, FIXP_DBL **qmfSlotImag, +- const int qmfExponent, const int pvcBorder0, +- const int timeSlotNumber, FIXP_DBL predictedEsgSlot[], +- int *predictedEsg_exp) { +- int i, band, ksg, ksg_start = 0; +- int RATE = pPvcDynamicData->RATE; +- int Esg_index = pPvcStaticData->Esg_slot_index; +- const SCHAR *sg_borders = pPvcDynamicData->sg_offset_low; +- FIXP_DBL *pEsg = pPvcStaticData->Esg[Esg_index]; +- FIXP_DBL E[PVC_NBLOW] = {0}; +- +- /* Subband grouping in QMF subbands below SBR range */ +- /* Within one timeslot ( i = [0...(RATE-1)] QMF subsamples) calculate energy +- E(ib,t) and group them to Esg(ksg,t). Then transfer values to logarithmical +- domain and store them for time domain smoothing. (7.5.6.3 Subband grouping +- in QMF subbands below SBR range) +- */ +- for (ksg = 0; sg_borders[ksg] < 0; ksg++) { +- pEsg[ksg] = FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */ +- ksg_start++; +- } +- +- for (i = 0; i < RATE; i++) { +- FIXP_DBL *qmfR, *qmfI; +- qmfR = qmfSlotReal[i]; +- qmfI = qmfSlotImag[i]; +- for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) { +- for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) { +- /* The division by 8 == (RATE*lbw) is required algorithmically */ +- E[ksg] += (fPow2Div2(qmfR[band]) + fPow2Div2(qmfI[band])) >> 2; +- } +- } +- } +- for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) { +- if (E[ksg] > (FIXP_DBL)0) { +- /* 10/log2(10) = 0.752574989159953 * 2^2 */ +- int exp_log; +- FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent, &exp_log); +- nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC)); +- nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2); +- pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP))); +- } else { +- pEsg[ksg] = +- FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP)); /* 10*log10(0.1) */ +- } +- } +- +- /* Time domain smoothing of subband-grouped energy */ +- { +- int idx = pPvcStaticData->Esg_slot_index; +- FIXP_DBL *pEsg_filt; +- FIXP_SGL SCcoeff; +- +- E[0] = E[1] = E[2] = (FIXP_DBL)0; +- for (i = 0; i < pPvcDynamicData->ns; i++) { +- SCcoeff = pPvcDynamicData->pSCcoeffs[i]; +- pEsg_filt = pPvcStaticData->Esg[idx]; +- /* Div2 is compensated by scaling of coeff table */ +- E[0] = fMultAddDiv2(E[0], pEsg_filt[0], SCcoeff); +- E[1] = fMultAddDiv2(E[1], pEsg_filt[1], SCcoeff); +- E[2] = fMultAddDiv2(E[2], pEsg_filt[2], SCcoeff); +- if (i >= pPvcDynamicData->pastEsgSlotsAvail) { +- /* if past Esg values are not available use the ones from the last valid +- * slot */ +- continue; +- } +- if (idx > 0) { +- idx--; +- } else { +- idx += PVC_NS_MAX - 1; +- } +- } +- } +- +- /* SBR envelope scalefactor prediction */ +- { +- int E_high_exp[PVC_NBHIGH_MAX]; +- int E_high_exp_max = 0; +- int pvcTab1ID; +- int pvcTab2ID = (int)pPvcDynamicData->pPvcID[timeSlotNumber]; +- const UCHAR *pTab1, *pTab2; +- if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[0]) { +- pvcTab1ID = 0; +- } else if (pvcTab2ID < pPvcDynamicData->pPVCTab1_dp[1]) { +- pvcTab1ID = 1; +- } else { +- pvcTab1ID = 2; +- } +- pTab1 = &(pPvcDynamicData +- ->pPVCTab1[pvcTab1ID * PVC_NBLOW * pPvcDynamicData->nbHigh]); +- pTab2 = &(pPvcDynamicData->pPVCTab2[pvcTab2ID * pPvcDynamicData->nbHigh]); +- for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { +- FIXP_SGL predCoeff; +- FIXP_DBL accu; +- int predCoeff_exp, kb; +- E_high_exp[ksg] = 0; +- +- /* residual part */ +- accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP + +- pPvcDynamicData->pScalingCoef[3]); +- +- /* linear combination of lower grouped energies part */ +- for (kb = 0; kb < PVC_NBLOW; kb++) { +- predCoeff = (FIXP_SGL)( +- (SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8); +- predCoeff_exp = pPvcDynamicData->pScalingCoef[kb] + +- 1; /* +1 to compensate for Div2 */ +- accu += fMultDiv2(E[kb], predCoeff) << predCoeff_exp; +- } +- /* convert back to linear domain */ +- accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV)); +- accu = f2Pow( +- accu, PVC_ESG_EXP - 1, +- &predCoeff_exp); /* -1 compensates for exponent of LOG10FAC_INV */ +- predictedEsgSlot[ksg] = accu; +- E_high_exp[ksg] = predCoeff_exp; +- if (predCoeff_exp > E_high_exp_max) { +- E_high_exp_max = predCoeff_exp; +- } +- } +- +- /* rescale output vector according to largest exponent */ +- for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { +- int scale = E_high_exp[ksg] - E_high_exp_max; +- predictedEsgSlot[ksg] = scaleValue(predictedEsgSlot[ksg], scale); +- } +- *predictedEsg_exp = E_high_exp_max; +- } +- +- pPvcStaticData->Esg_slot_index = +- (pPvcStaticData->Esg_slot_index + 1) & (PVC_NS_MAX - 1); +- pPvcDynamicData->pastEsgSlotsAvail = +- fMin(pPvcDynamicData->pastEsgSlotsAvail + 1, PVC_NS_MAX - 1); +- return; +-} +- +-/* call if pvcMode = 0,1,2 */ +-void pvcEndFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData) { +- pPvcStaticData->pvc_mode_last = pPvcDynamicData->pvc_mode; +- pPvcStaticData->kx_last = pPvcDynamicData->kx; +- +- if (pPvcDynamicData->pvc_mode == 0) return; +- +- { +- int t, max = -100; +- for (t = pPvcDynamicData->pvcBorder0; t < PVC_NTIMESLOT; t++) { +- if (pPvcDynamicData->predEsg_exp[t] > max) { +- max = pPvcDynamicData->predEsg_exp[t]; +- } +- } +- pPvcDynamicData->predEsg_expMax = max; +- } +- return; +-} +- +-void expandPredEsg(const PVC_DYNAMIC_DATA *pPvcDynamicData, const int timeSlot, +- const int lengthOutputVector, FIXP_DBL *pOutput, +- SCHAR *pOutput_exp) { +- int k = 0, ksg; +- const FIXP_DBL *predEsg = pPvcDynamicData->predEsg[timeSlot]; +- +- for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { +- for (; k < pPvcDynamicData->sg_offset_high_kx[ksg + 1]; k++) { +- pOutput[k] = predEsg[ksg]; +- pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot]; +- } +- } +- ksg--; +- for (; k < lengthOutputVector; k++) { +- pOutput[k] = predEsg[ksg]; +- pOutput_exp[k] = (SCHAR)pPvcDynamicData->predEsg_exp[timeSlot]; +- } +- +- return; +-} +diff --git a/libSBRdec/src/pvc_dec.h b/libSBRdec/src/pvc_dec.h +deleted file mode 100644 +index f5a467f..0000000 +--- a/libSBRdec/src/pvc_dec.h ++++ /dev/null +@@ -1,238 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: Decode Predictive Vector Coding Data +- +-*******************************************************************************/ +- +-#ifndef PVC_DEC_H +-#define PVC_DEC_H +- +-#include "common_fix.h" +- +-#define PVC_DIVMODE_BITS 3 +-#define PVC_REUSEPVCID_BITS 1 +-#define PVC_PVCID_BITS 7 +-#define PVC_GRIDINFO_BITS 1 +- +-#define MAX_PVC_ENVELOPES 2 +-#define PVC_NTIMESLOT 16 +-#define PVC_NBLOW 3 /* max. number of grouped QMF subbands below SBR range */ +- +-#define PVC_NBHIGH_MODE1 8 +-#define PVC_NBHIGH_MODE2 6 +-#define PVC_NBHIGH_MAX (PVC_NBHIGH_MODE1) +-#define PVC_NS_MAX 16 +- +-/** Data for each PVC instance which needs to be persistent accross SBR frames +- */ +-typedef struct { +- UCHAR kx_last; /**< Xover frequency of last frame */ +- UCHAR pvc_mode_last; /**< PVC mode of last frame */ +- UCHAR Esg_slot_index; /**< Ring buffer index to current Esg time slot */ +- UCHAR pvcBorder0; /**< Start SBR time slot of PVC frame */ +- FIXP_DBL Esg[PVC_NS_MAX][PVC_NBLOW]; /**< Esg(ksg,t) of current and 15 +- previous time slots (ring buffer) in +- logarithmical domain */ +-} PVC_STATIC_DATA; +- +-/** Data for each PVC instance which is valid during one SBR frame */ +-typedef struct { +- UCHAR pvc_mode; /**< PVC mode 1 or 2, 0 means legacy SBR */ +- UCHAR pvcBorder0; /**< Start SBR time slot of PVC frame */ +- UCHAR kx; /**< Index of the first QMF subband in the SBR range */ +- UCHAR RATE; /**< Number of QMF subband samples per time slot (2 or 4) */ +- UCHAR ns; /**< Number of time slots for time-domain smoothing of Esg(ksg,t) */ +- const UCHAR +- *pPvcID; /**< Pointer to prediction coefficient matrix index table */ +- UCHAR pastEsgSlotsAvail; /**< Number of past Esg(ksg,t) which are available +- for smoothing filter */ +- const FIXP_SGL *pSCcoeffs; /**< Pointer to smoothing window table */ +- SCHAR +- sg_offset_low[PVC_NBLOW + 1]; /**< Offset table for PVC grouping of SBR +- subbands below SBR range */ +- SCHAR sg_offset_high_kx[PVC_NBHIGH_MAX + 1]; /**< Offset table for PVC +- grouping of SBR subbands in +- SBR range (relativ to kx) */ +- UCHAR nbHigh; /**< Number of grouped QMF subbands in the SBR range */ +- const SCHAR *pScalingCoef; /**< Pointer to scaling coeff table */ +- const UCHAR *pPVCTab1; /**< PVC mode 1 table */ +- const UCHAR *pPVCTab2; /**< PVC mode 2 table */ +- const UCHAR *pPVCTab1_dp; /**< Mapping of pvcID to PVC mode 1 table */ +- FIXP_DBL predEsg[PVC_NTIMESLOT] +- [PVC_NBHIGH_MAX]; /**< Predicted Energy in linear domain */ +- int predEsg_exp[PVC_NTIMESLOT]; /**< Exponent of predicted Energy in linear +- domain */ +- int predEsg_expMax; /**< Maximum of predEsg_exp[] */ +-} PVC_DYNAMIC_DATA; +- +-/** +- * \brief Initialize PVC data structures for current frame (call if pvcMode = +- * 0,1,2) +- * \param[in] pPvcStaticData Pointer to PVC persistent data +- * \param[out] pPvcDynamicData Pointer to PVC dynamic data +- * \param[in] pvcMode PVC mode 1 or 2, 0 means legacy SBR +- * \param[in] ns Number of time slots for time-domain smoothing of Esg(ksg,t) +- * \param[in] RATE Number of QMF subband samples per time slot (2 or 4) +- * \param[in] kx Index of the first QMF subband in the SBR range +- * \param[in] pvcBorder0 Start SBR time slot of PVC frame +- * \param[in] pPvcID Pointer to array of PvcIDs read from bitstream +- */ +-int pvcInitFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, const UCHAR pvcMode, +- const UCHAR ns, const int RATE, const int kx, +- const int pvcBorder0, const UCHAR *pPvcID); +- +-/** +- * \brief Wrapper function for pvcDecodeTimeSlot() to decode PVC data of one +- * frame (call if pvcMode = 1,2) +- * \param[in,out] pPvcStaticData Pointer to PVC persistent data +- * \param[in,out] pPvcDynamicData Pointer to PVC dynamic data +- * \param[in] qmfBufferReal Pointer to array with real QMF subbands +- * \param[in] qmfBufferImag Pointer to array with imag QMF subbands +- * \param[in] overlap Number of QMF overlap slots +- * \param[in] qmfExponentOverlap Exponent of qmfBuffer (low part) of overlap +- * slots +- * \param[in] qmfExponentCurrent Exponent of qmfBuffer (low part) +- */ +-void pvcDecodeFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **qmfBufferReal, +- FIXP_DBL **qmfBufferImag, const int overlap, +- const int qmfExponentOverlap, const int qmfExponentCurrent); +- +-/** +- * \brief Decode PVC data for one SBR time slot (call if pvcMode = 1,2) +- * \param[in,out] pPvcStaticData Pointer to PVC persistent data +- * \param[in,out] pPvcDynamicData Pointer to PVC dynamic data +- * \param[in] qmfBufferReal Pointer to array with real QMF subbands +- * \param[in] qmfBufferImag Pointer to array with imag QMF subbands +- * \param[in] qmfExponent Exponent of qmfBuffer of current time slot +- * \param[in] pvcBorder0 Start SBR time slot of PVC frame +- * \param[in] timeSlotNumber Number of current SBR time slot (0..15) +- * \param[out] predictedEsgSlot Predicted Energy of current time slot +- * \param[out] predictedEsg_exp Exponent of predicted Energy of current time +- * slot +- */ +-void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData, +- FIXP_DBL **qmfSlotReal, FIXP_DBL **qmfSlotImag, +- const int qmfExponent, const int pvcBorder0, +- const int timeSlotNumber, FIXP_DBL predictedEsgSlot[], +- int *predictedEsg_exp); +- +-/** +- * \brief Finish the current PVC frame (call if pvcMode = 0,1,2) +- * \param[in,out] pPvcStaticData Pointer to PVC persistent data +- * \param[in,out] pPvcDynamicData Pointer to PVC dynamic data +- */ +-void pvcEndFrame(PVC_STATIC_DATA *pPvcStaticData, +- PVC_DYNAMIC_DATA *pPvcDynamicData); +- +-/** +- * \brief Expand predicted PVC grouped energies to full QMF subband resolution +- * \param[in] pPvcDynamicData Pointer to PVC dynamic data +- * \param[in] timeSlot Number of current SBR time slot (0..15) +- * \param[in] lengthOutputVector Lenght of output vector +- * \param[out] pOutput Output array for predicted energies +- * \param[out] pOutput_exp Exponent of predicted energies +- */ +-void expandPredEsg(const PVC_DYNAMIC_DATA *pPvcDynamicData, const int timeSlot, +- const int lengthOutputVector, FIXP_DBL *pOutput, +- SCHAR *pOutput_exp); +- +-#endif /* PVC_DEC_H*/ +diff --git a/libSBRdec/src/sbr_crc.cpp b/libSBRdec/src/sbr_crc.cpp +deleted file mode 100644 +index ba0fd05..0000000 +--- a/libSBRdec/src/sbr_crc.cpp ++++ /dev/null +@@ -1,192 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief CRC check coutines +-*/ +- +-#include "sbr_crc.h" +- +-#include "FDK_bitstream.h" +-#include "transcendent.h" +- +-#define MAXCRCSTEP 16 +-#define MAXCRCSTEP_LD 4 +- +-/*! +- \brief crc calculation +-*/ +-static ULONG calcCRC(HANDLE_CRC hCrcBuf, ULONG bValue, int nBits) { +- int i; +- ULONG bMask = (1UL << (nBits - 1)); +- +- for (i = 0; i < nBits; i++, bMask >>= 1) { +- USHORT flag = (hCrcBuf->crcState & hCrcBuf->crcMask) ? 1 : 0; +- USHORT flag1 = (bMask & bValue) ? 1 : 0; +- +- flag ^= flag1; +- hCrcBuf->crcState <<= 1; +- if (flag) hCrcBuf->crcState ^= hCrcBuf->crcPoly; +- } +- +- return (hCrcBuf->crcState); +-} +- +-/*! +- \brief crc +-*/ +-static int getCrc(HANDLE_FDK_BITSTREAM hBs, ULONG NrBits) { +- int i; +- CRC_BUFFER CrcBuf; +- +- CrcBuf.crcState = SBR_CRC_START; +- CrcBuf.crcPoly = SBR_CRC_POLY; +- CrcBuf.crcMask = SBR_CRC_MASK; +- +- int CrcStep = NrBits >> MAXCRCSTEP_LD; +- +- int CrcNrBitsRest = (NrBits - CrcStep * MAXCRCSTEP); +- ULONG bValue; +- +- for (i = 0; i < CrcStep; i++) { +- bValue = FDKreadBits(hBs, MAXCRCSTEP); +- calcCRC(&CrcBuf, bValue, MAXCRCSTEP); +- } +- +- bValue = FDKreadBits(hBs, CrcNrBitsRest); +- calcCRC(&CrcBuf, bValue, CrcNrBitsRest); +- +- return (CrcBuf.crcState & SBR_CRC_RANGE); +-} +- +-/*! +- \brief crc interface +- \return 1: CRC OK, 0: CRC check failure +-*/ +-int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBs, /*!< handle to bit-buffer */ +- LONG NrBits) /*!< max. CRC length */ +-{ +- int crcResult = 1; +- ULONG NrCrcBits; +- ULONG crcCheckResult; +- LONG NrBitsAvailable; +- ULONG crcCheckSum; +- +- crcCheckSum = FDKreadBits(hBs, 10); +- +- NrBitsAvailable = FDKgetValidBits(hBs); +- if (NrBitsAvailable <= 0) { +- return 0; +- } +- +- NrCrcBits = fixMin((INT)NrBits, (INT)NrBitsAvailable); +- +- crcCheckResult = getCrc(hBs, NrCrcBits); +- FDKpushBack(hBs, (NrBitsAvailable - FDKgetValidBits(hBs))); +- +- if (crcCheckResult != crcCheckSum) { +- crcResult = 0; +- } +- +- return (crcResult); +-} +diff --git a/libSBRdec/src/sbr_crc.h b/libSBRdec/src/sbr_crc.h +deleted file mode 100644 +index 9633717..0000000 +--- a/libSBRdec/src/sbr_crc.h ++++ /dev/null +@@ -1,138 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief CRC checking routines +-*/ +-#ifndef SBR_CRC_H +-#define SBR_CRC_H +- +-#include "sbrdecoder.h" +- +-#include "FDK_bitstream.h" +- +-/* some useful crc polynoms: +- +-crc5: x^5+x^4+x^2+x^1+1 +-crc6: x^6+x^5+x^3+x^2+x+1 +-crc7: x^7+x^6+x^2+1 +-crc8: x^8+x^2+x+x+1 +-*/ +- +-/* default SBR CRC */ /* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ +-#define SBR_CRC_POLY 0x0233 +-#define SBR_CRC_MASK 0x0200 +-#define SBR_CRC_START 0x0000 +-#define SBR_CRC_RANGE 0x03FF +- +-typedef struct { +- USHORT crcState; +- USHORT crcMask; +- USHORT crcPoly; +-} CRC_BUFFER; +- +-typedef CRC_BUFFER *HANDLE_CRC; +- +-int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBitBuf, LONG NrCrcBits); +- +-#endif +diff --git a/libSBRdec/src/sbr_deb.cpp b/libSBRdec/src/sbr_deb.cpp +deleted file mode 100644 +index 13cd211..0000000 +--- a/libSBRdec/src/sbr_deb.cpp ++++ /dev/null +@@ -1,108 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Print selected debug messages +-*/ +- +-#include "sbr_deb.h" +diff --git a/libSBRdec/src/sbr_deb.h b/libSBRdec/src/sbr_deb.h +deleted file mode 100644 +index 97d572a..0000000 +--- a/libSBRdec/src/sbr_deb.h ++++ /dev/null +@@ -1,113 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Debugging aids +-*/ +- +-#ifndef SBR_DEB_H +-#define SBR_DEB_H +- +-#include "sbrdecoder.h" +- +-#endif +diff --git a/libSBRdec/src/sbr_dec.cpp b/libSBRdec/src/sbr_dec.cpp +deleted file mode 100644 +index 30611e7..0000000 +--- a/libSBRdec/src/sbr_dec.cpp ++++ /dev/null +@@ -1,1480 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Sbr decoder +- This module provides the actual decoder implementation. The SBR data (side +- information) is already decoded. Only three functions are provided: +- +- \li 1.) createSbrDec(): One time initialization +- \li 2.) resetSbrDec(): Called by sbr_Apply() when the information contained in +- an SBR_HEADER_ELEMENT requires a reset and recalculation of important SBR +- structures. \li 3.) sbr_dec(): The actual decoder. Calls the different tools +- such as filterbanks, lppTransposer(), and calculateSbrEnvelope() [the envelope +- adjuster]. +- +- \sa sbr_dec(), \ref documentationOverview +-*/ +- +-#include "sbr_dec.h" +- +-#include "sbr_ram.h" +-#include "env_extr.h" +-#include "env_calc.h" +-#include "scale.h" +-#include "FDK_matrixCalloc.h" +-#include "hbe.h" +- +-#include "genericStds.h" +- +-#include "sbrdec_drc.h" +- +-static void copyHarmonicSpectrum(int *xOverQmf, FIXP_DBL **qmfReal, +- FIXP_DBL **qmfImag, int noCols, int overlap, +- KEEP_STATES_SYNCED_MODE keepStatesSynced) { +- int patchBands; +- int patch, band, col, target, sourceBands, i; +- int numPatches = 0; +- int slotOffset = 0; +- +- FIXP_DBL **ppqmfReal = qmfReal + overlap; +- FIXP_DBL **ppqmfImag = qmfImag + overlap; +- +- if (keepStatesSynced == KEEP_STATES_SYNCED_NORMAL) { +- slotOffset = noCols - overlap - LPC_ORDER; +- } +- +- if (keepStatesSynced == KEEP_STATES_SYNCED_OUTDIFF) { +- ppqmfReal = qmfReal; +- ppqmfImag = qmfImag; +- } +- +- for (i = 1; i < MAX_NUM_PATCHES; i++) { +- if (xOverQmf[i] != 0) { +- numPatches++; +- } +- } +- +- for (patch = (MAX_STRETCH_HBE - 1); patch < numPatches; patch++) { +- patchBands = xOverQmf[patch + 1] - xOverQmf[patch]; +- target = xOverQmf[patch]; +- sourceBands = xOverQmf[MAX_STRETCH_HBE - 1] - xOverQmf[MAX_STRETCH_HBE - 2]; +- +- while (patchBands > 0) { +- int numBands = sourceBands; +- int startBand = xOverQmf[MAX_STRETCH_HBE - 1] - 1; +- if (target + numBands >= xOverQmf[patch + 1]) { +- numBands = xOverQmf[patch + 1] - target; +- } +- if ((((target + numBands - 1) % 2) + +- ((xOverQmf[MAX_STRETCH_HBE - 1] - 1) % 2)) % +- 2) { +- if (numBands == sourceBands) { +- numBands--; +- } else { +- startBand--; +- } +- } +- if (keepStatesSynced == KEEP_STATES_SYNCED_OUTDIFF) { +- for (col = slotOffset; col < overlap + LPC_ORDER; col++) { +- i = 0; +- for (band = numBands; band > 0; band--) { +- if ((target + band - 1 < 64) && +- (target + band - 1 < xOverQmf[patch + 1])) { +- ppqmfReal[col][target + band - 1] = ppqmfReal[col][startBand - i]; +- ppqmfImag[col][target + band - 1] = ppqmfImag[col][startBand - i]; +- i++; +- } +- } +- } +- } else { +- for (col = slotOffset; col < noCols; col++) { +- i = 0; +- for (band = numBands; band > 0; band--) { +- if ((target + band - 1 < 64) && +- (target + band - 1 < xOverQmf[patch + 1])) { +- ppqmfReal[col][target + band - 1] = ppqmfReal[col][startBand - i]; +- ppqmfImag[col][target + band - 1] = ppqmfImag[col][startBand - i]; +- i++; +- } +- } +- } +- } +- target += numBands; +- patchBands -= numBands; +- } +- } +-} +- +-/*! +- \brief SBR decoder core function for one channel +- +- \image html BufferMgmtDetailed-1632.png +- +- Besides the filter states of the QMF filter bank and the LPC-states of +- the LPP-Transposer, processing is mainly based on four buffers: +- #timeIn, #timeOut, #WorkBuffer2 and #OverlapBuffer. The #WorkBuffer2 +- is reused for all channels and might be used by the core decoder, a +- static overlap buffer is required for each channel. Due to in-place +- processing, #timeIn and #timeOut point to identical locations. +- +- The spectral data is organized in so-called slots. Each slot +- contains 64 bands of complex data. The number of slots per frame +- depends on the frame size. For mp3PRO, there are 18 slots per frame +- and 6 slots per #OverlapBuffer. It is not necessary to have the slots +- in located consecutive address ranges. +- +- To optimize memory usage and to minimize the number of memory +- accesses, the memory management is organized as follows (slot numbers +- based on mp3PRO): +- +- 1.) Input time domain signal is located in #timeIn. The last slots +- (0..5) of the spectral data of the previous frame are located in the +- #OverlapBuffer. In addition, #frameData of the current frame resides +- in the upper part of #timeIn. +- +- 2.) During the cplxAnalysisQmfFiltering(), 32 samples from #timeIn are +- transformed into a slot of up to 32 complex spectral low band values at a +- time. The first spectral slot -- nr. 6 -- is written at slot number +- zero of #WorkBuffer2. #WorkBuffer2 will be completely filled with +- spectral data. +- +- 3.) LPP-Transposition in lppTransposer() is processed on 24 slots. During the +- transposition, the high band part of the spectral data is replicated +- based on the low band data. +- +- Envelope Adjustment is processed on the high band part of the spectral +- data only by calculateSbrEnvelope(). +- +- 4.) The cplxSynthesisQmfFiltering() creates 64 time domain samples out +- of a slot of 64 complex spectral values at a time. The first 6 slots +- in #timeOut are filled from the results of spectral slots 0..5 in the +- #OverlapBuffer. The consecutive slots in timeOut are now filled with +- the results of spectral slots 6..17. +- +- 5.) The preprocessed slots 18..23 have to be stored in the +- #OverlapBuffer. +- +-*/ +- +-void sbr_dec( +- HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ +- INT_PCM *timeIn, /*!< pointer to input time signal */ +- INT_PCM *timeOut, /*!< pointer to output time signal */ +- HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ +- INT_PCM *timeOutRight, /*!< pointer to output time signal */ +- const int strideOut, /*!< Time data traversal strideOut */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ +- HANDLE_SBR_PREV_FRAME_DATA +- hPrevFrameData, /*!< Some control data of last frame */ +- const int applyProcessing, /*!< Flag for SBR operation */ +- HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize) { +- int i, slot, reserve; +- int saveLbScale; +- int lastSlotOffs; +- FIXP_DBL maxVal; +- +- /* temporary pointer / variable for QMF; +- required as we want to use temporary buffer +- creating one frame delay for HBE in LP mode */ +- INT_PCM *pTimeInQmf = timeIn; +- +- /* Number of QMF timeslots in the overlap buffer: */ +- int ov_len = hSbrDec->LppTrans.pSettings->overlap; +- +- /* Number of QMF slots per frame */ +- int noCols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; +- +- /* create pointer array for data to use for HBE and legacy sbr */ +- FIXP_DBL *pLowBandReal[(3 * 4) + 2 * ((1024) / (32) * (4) / 2)]; +- FIXP_DBL *pLowBandImag[(3 * 4) + 2 * ((1024) / (32) * (4) / 2)]; +- +- /* set pReal to where QMF analysis writes in case of legacy SBR */ +- FIXP_DBL **pReal = pLowBandReal + ov_len; +- FIXP_DBL **pImag = pLowBandImag + ov_len; +- +- /* map QMF buffer to pointer array (Overlap + Frame)*/ +- for (i = 0; i < noCols + ov_len; i++) { +- pLowBandReal[i] = hSbrDec->qmfDomainInCh->hQmfSlotsReal[i]; +- pLowBandImag[i] = hSbrDec->qmfDomainInCh->hQmfSlotsImag[i]; +- } +- +- if ((flags & SBRDEC_USAC_HARMONICSBR)) { +- /* in case of harmonic SBR and no HBE_LP map additional buffer for +- one more frame to pointer arry */ +- for (i = 0; i < noCols; i++) { +- pLowBandReal[i + noCols + ov_len] = hSbrDec->hQmfHBESlotsReal[i]; +- pLowBandImag[i + noCols + ov_len] = hSbrDec->hQmfHBESlotsImag[i]; +- } +- +- /* shift scale values according to buffer */ +- hSbrDec->scale_ov = hSbrDec->scale_lb; +- hSbrDec->scale_lb = hSbrDec->scale_hbe; +- +- /* set pReal to where QMF analysis writes in case of HBE */ +- pReal += noCols; +- pImag += noCols; +- if (flags & SBRDEC_SKIP_QMF_ANA) { +- /* stereoCfgIndex3 with HBE */ +- FDK_QmfDomain_QmfData2HBE(hSbrDec->qmfDomainInCh, +- hSbrDec->hQmfHBESlotsReal, +- hSbrDec->hQmfHBESlotsImag); +- } else { +- /* We have to move old hbe frame data to lb area of buffer */ +- for (i = 0; i < noCols; i++) { +- FDKmemcpy(pLowBandReal[ov_len + i], hSbrDec->hQmfHBESlotsReal[i], +- hHeaderData->numberOfAnalysisBands * sizeof(FIXP_DBL)); +- FDKmemcpy(pLowBandImag[ov_len + i], hSbrDec->hQmfHBESlotsImag[i], +- hHeaderData->numberOfAnalysisBands * sizeof(FIXP_DBL)); +- } +- } +- } +- +- /* +- low band codec signal subband filtering +- */ +- +- if (flags & SBRDEC_SKIP_QMF_ANA) { +- if (!(flags & SBRDEC_USAC_HARMONICSBR)) /* stereoCfgIndex3 w/o HBE */ +- FDK_QmfDomain_WorkBuffer2ProcChannel(hSbrDec->qmfDomainInCh); +- } else { +- C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * (64)); +- qmfAnalysisFiltering(&hSbrDec->qmfDomainInCh->fb, pReal, pImag, +- &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf, 0, 1, +- qmfTemp); +- +- C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * (64)); +- } +- +- /* +- Clear upper half of spectrum +- */ +- if (!((flags & SBRDEC_USAC_HARMONICSBR) && +- (hFrameData->sbrPatchingMode == 0))) { +- int nAnalysisBands = hHeaderData->numberOfAnalysisBands; +- +- if (!(flags & SBRDEC_LOW_POWER)) { +- for (slot = ov_len; slot < noCols + ov_len; slot++) { +- FDKmemclear(&pLowBandReal[slot][nAnalysisBands], +- ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); +- FDKmemclear(&pLowBandImag[slot][nAnalysisBands], +- ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); +- } +- } else { +- for (slot = ov_len; slot < noCols + ov_len; slot++) { +- FDKmemclear(&pLowBandReal[slot][nAnalysisBands], +- ((64) - nAnalysisBands) * sizeof(FIXP_DBL)); +- } +- } +- } +- +- /* +- Shift spectral data left to gain accuracy in transposer and adjustor +- */ +- /* Range was increased from lsb to no_channels because in some cases (e.g. +- USAC conf eSbr_4_Pvc.mp4 and some HBE cases) it could be observed that the +- signal between lsb and no_channels is used for the patching process. +- */ +- maxVal = maxSubbandSample(pReal, (flags & SBRDEC_LOW_POWER) ? NULL : pImag, 0, +- hSbrDec->qmfDomainInCh->fb.no_channels, 0, noCols); +- +- reserve = fixMax(0, CntLeadingZeros(maxVal) - 1); +- reserve = fixMin(reserve, +- DFRACT_BITS - 1 - hSbrDec->qmfDomainInCh->scaling.lb_scale); +- +- /* If all data is zero, lb_scale could become too large */ +- rescaleSubbandSamples(pReal, (flags & SBRDEC_LOW_POWER) ? NULL : pImag, 0, +- hSbrDec->qmfDomainInCh->fb.no_channels, 0, noCols, +- reserve); +- +- hSbrDec->qmfDomainInCh->scaling.lb_scale += reserve; +- +- if ((flags & SBRDEC_USAC_HARMONICSBR)) { +- /* actually this is our hbe_scale */ +- hSbrDec->scale_hbe = hSbrDec->qmfDomainInCh->scaling.lb_scale; +- /* the real lb_scale is stored in scale_lb from sbr */ +- hSbrDec->qmfDomainInCh->scaling.lb_scale = hSbrDec->scale_lb; +- } +- /* +- save low band scale, wavecoding or parametric stereo may modify it +- */ +- saveLbScale = hSbrDec->qmfDomainInCh->scaling.lb_scale; +- +- if (applyProcessing) { +- UCHAR *borders = hFrameData->frameInfo.borders; +- lastSlotOffs = borders[hFrameData->frameInfo.nEnvelopes] - +- hHeaderData->numberTimeSlots; +- +- FIXP_DBL degreeAlias[(64)]; +- PVC_DYNAMIC_DATA pvcDynamicData; +- pvcInitFrame( +- &hSbrDec->PvcStaticData, &pvcDynamicData, +- (hHeaderData->frameErrorFlag ? 0 : hHeaderData->bs_info.pvc_mode), +- hFrameData->ns, hHeaderData->timeStep, +- hHeaderData->freqBandData.lowSubband, +- hFrameData->frameInfo.pvcBorders[0], hFrameData->pvcID); +- +- if (!hHeaderData->frameErrorFlag && (hHeaderData->bs_info.pvc_mode > 0)) { +- pvcDecodeFrame(&hSbrDec->PvcStaticData, &pvcDynamicData, pLowBandReal, +- pLowBandImag, ov_len, +- SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale), +- SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.lb_scale)); +- } +- pvcEndFrame(&hSbrDec->PvcStaticData, &pvcDynamicData); +- +- /* The transposer will override most values in degreeAlias[]. +- The array needs to be cleared at least from lowSubband to highSubband +- before. */ +- if (flags & SBRDEC_LOW_POWER) +- FDKmemclear(°reeAlias[hHeaderData->freqBandData.lowSubband], +- (hHeaderData->freqBandData.highSubband - +- hHeaderData->freqBandData.lowSubband) * +- sizeof(FIXP_DBL)); +- +- /* +- Inverse filtering of lowband and transposition into the SBR-frequency +- range +- */ +- +- { +- KEEP_STATES_SYNCED_MODE keepStatesSyncedMode = +- ((flags & SBRDEC_USAC_HARMONICSBR) && +- (hFrameData->sbrPatchingMode != 0)) +- ? KEEP_STATES_SYNCED_NORMAL +- : KEEP_STATES_SYNCED_OFF; +- +- if (flags & SBRDEC_USAC_HARMONICSBR) { +- if (flags & SBRDEC_QUAD_RATE) { +- pReal -= 32; +- pImag -= 32; +- } +- +- if ((hSbrDec->savedStates == 0) && (hFrameData->sbrPatchingMode == 1)) { +- /* copy saved states from previous frame to legacy SBR lpc filterstate +- * buffer */ +- for (i = 0; i < LPC_ORDER + ov_len; i++) { +- FDKmemcpy( +- hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], +- hSbrDec->codecQMFBufferReal[noCols - LPC_ORDER - ov_len + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- FDKmemcpy( +- hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], +- hSbrDec->codecQMFBufferImag[noCols - LPC_ORDER - ov_len + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- } +- } +- +- /* saving unmodified QMF states in case we are switching from legacy SBR +- * to HBE */ +- for (i = 0; i < hSbrDec->hHBE->noCols; i++) { +- FDKmemcpy(hSbrDec->codecQMFBufferReal[i], pLowBandReal[ov_len + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- FDKmemcpy(hSbrDec->codecQMFBufferImag[i], pLowBandImag[ov_len + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- } +- +- QmfTransposerApply( +- hSbrDec->hHBE, pReal, pImag, noCols, pLowBandReal, pLowBandImag, +- hSbrDec->LppTrans.lpcFilterStatesRealHBE, +- hSbrDec->LppTrans.lpcFilterStatesImagHBE, +- hFrameData->sbrPitchInBins, hSbrDec->scale_lb, hSbrDec->scale_hbe, +- &hSbrDec->qmfDomainInCh->scaling.hb_scale, hHeaderData->timeStep, +- borders[0], ov_len, keepStatesSyncedMode); +- +- if (flags & SBRDEC_QUAD_RATE) { +- int *xOverQmf = GetxOverBandQmfTransposer(hSbrDec->hHBE); +- +- copyHarmonicSpectrum(xOverQmf, pLowBandReal, pLowBandImag, noCols, +- ov_len, keepStatesSyncedMode); +- } +- } +- } +- +- if ((flags & SBRDEC_USAC_HARMONICSBR) && +- (hFrameData->sbrPatchingMode == 0)) { +- hSbrDec->prev_frame_lSbr = 0; +- hSbrDec->prev_frame_hbeSbr = 1; +- +- lppTransposerHBE( +- &hSbrDec->LppTrans, hSbrDec->hHBE, &hSbrDec->qmfDomainInCh->scaling, +- pLowBandReal, pLowBandImag, hHeaderData->timeStep, borders[0], +- lastSlotOffs, hHeaderData->freqBandData.nInvfBands, +- hFrameData->sbr_invf_mode, hPrevFrameData->sbr_invf_mode); +- +- } else { +- if (flags & SBRDEC_USAC_HARMONICSBR) { +- for (i = 0; i < LPC_ORDER + hSbrDec->LppTrans.pSettings->overlap; i++) { +- /* +- Store the unmodified qmf Slots values for upper part of spectrum +- (required for LPC filtering) required if next frame is a HBE frame +- */ +- FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealHBE[i], +- hSbrDec->qmfDomainInCh +- ->hQmfSlotsReal[hSbrDec->hHBE->noCols - LPC_ORDER + i], +- (64) * sizeof(FIXP_DBL)); +- FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesImagHBE[i], +- hSbrDec->qmfDomainInCh +- ->hQmfSlotsImag[hSbrDec->hHBE->noCols - LPC_ORDER + i], +- (64) * sizeof(FIXP_DBL)); +- } +- } +- { +- hSbrDec->prev_frame_lSbr = 1; +- hSbrDec->prev_frame_hbeSbr = 0; +- } +- +- lppTransposer( +- &hSbrDec->LppTrans, &hSbrDec->qmfDomainInCh->scaling, pLowBandReal, +- degreeAlias, // only used if useLP = 1 +- pLowBandImag, flags & SBRDEC_LOW_POWER, +- hHeaderData->bs_info.sbr_preprocessing, +- hHeaderData->freqBandData.v_k_master[0], hHeaderData->timeStep, +- borders[0], lastSlotOffs, hHeaderData->freqBandData.nInvfBands, +- hFrameData->sbr_invf_mode, hPrevFrameData->sbr_invf_mode); +- } +- +- /* +- Adjust envelope of current frame. +- */ +- +- if ((hFrameData->sbrPatchingMode != +- hSbrDec->SbrCalculateEnvelope.sbrPatchingMode)) { +- ResetLimiterBands(hHeaderData->freqBandData.limiterBandTable, +- &hHeaderData->freqBandData.noLimiterBands, +- hHeaderData->freqBandData.freqBandTable[0], +- hHeaderData->freqBandData.nSfb[0], +- hSbrDec->LppTrans.pSettings->patchParam, +- hSbrDec->LppTrans.pSettings->noOfPatches, +- hHeaderData->bs_data.limiterBands, +- hFrameData->sbrPatchingMode, +- (flags & SBRDEC_USAC_HARMONICSBR) && +- (hFrameData->sbrPatchingMode == 0) +- ? GetxOverBandQmfTransposer(hSbrDec->hHBE) +- : NULL, +- Get41SbrQmfTransposer(hSbrDec->hHBE)); +- +- hSbrDec->SbrCalculateEnvelope.sbrPatchingMode = +- hFrameData->sbrPatchingMode; +- } +- +- calculateSbrEnvelope( +- &hSbrDec->qmfDomainInCh->scaling, &hSbrDec->SbrCalculateEnvelope, +- hHeaderData, hFrameData, &pvcDynamicData, pLowBandReal, pLowBandImag, +- flags & SBRDEC_LOW_POWER, +- +- degreeAlias, flags, +- (hHeaderData->frameErrorFlag || hPrevFrameData->frameErrorFlag)); +- +-#if (SBRDEC_MAX_HB_FADE_FRAMES > 0) +- /* Avoid hard onsets of high band */ +- if (hHeaderData->frameErrorFlag) { +- if (hSbrDec->highBandFadeCnt < SBRDEC_MAX_HB_FADE_FRAMES) { +- hSbrDec->highBandFadeCnt += 1; +- } +- } else { +- if (hSbrDec->highBandFadeCnt > +- 0) { /* Manipulate high band scale factor to get a smooth fade-in */ +- hSbrDec->qmfDomainInCh->scaling.hb_scale += hSbrDec->highBandFadeCnt; +- hSbrDec->qmfDomainInCh->scaling.hb_scale = +- fMin(hSbrDec->qmfDomainInCh->scaling.hb_scale, DFRACT_BITS - 1); +- hSbrDec->highBandFadeCnt -= 1; +- } +- } +- +-#endif +- /* +- Update hPrevFrameData (to be used in the next frame) +- */ +- for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) { +- hPrevFrameData->sbr_invf_mode[i] = hFrameData->sbr_invf_mode[i]; +- } +- hPrevFrameData->coupling = hFrameData->coupling; +- hPrevFrameData->stopPos = borders[hFrameData->frameInfo.nEnvelopes]; +- hPrevFrameData->ampRes = hFrameData->ampResolutionCurrentFrame; +- hPrevFrameData->prevSbrPitchInBins = hFrameData->sbrPitchInBins; +- /* could be done in extractFrameInfo_pvc() but hPrevFrameData is not +- * available there */ +- FDKmemcpy(&hPrevFrameData->prevFrameInfo, &hFrameData->frameInfo, +- sizeof(FRAME_INFO)); +- } else { +- /* rescale from lsb to nAnalysisBands in order to compensate scaling with +- * hb_scale in this area, done by synthesisFiltering*/ +- int rescale; +- int lsb; +- int length; +- +- /* Reset hb_scale if no highband is present, because hb_scale is considered +- * in the QMF-synthesis */ +- hSbrDec->qmfDomainInCh->scaling.hb_scale = saveLbScale; +- +- rescale = hSbrDec->qmfDomainInCh->scaling.hb_scale - +- hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; +- lsb = hSbrDec->qmfDomainOutCh->fb.lsb; +- length = (hSbrDec->qmfDomainInCh->fb.no_channels - lsb); +- +- if ((rescale < 0) && (length > 0)) { +- if (!(flags & SBRDEC_LOW_POWER)) { +- for (i = 0; i < ov_len; i++) { +- scaleValues(&pLowBandReal[i][lsb], length, rescale); +- scaleValues(&pLowBandImag[i][lsb], length, rescale); +- } +- } else { +- for (i = 0; i < ov_len; i++) { +- scaleValues(&pLowBandReal[i][lsb], length, rescale); +- } +- } +- } +- } +- +- if (!(flags & SBRDEC_USAC_HARMONICSBR)) { +- int length = hSbrDec->qmfDomainInCh->fb.lsb; +- if (flags & SBRDEC_SYNTAX_USAC) { +- length = hSbrDec->qmfDomainInCh->fb.no_channels; +- } +- +- /* in case of legacy sbr saving of filter states here */ +- for (i = 0; i < LPC_ORDER + ov_len; i++) { +- /* +- Store the unmodified qmf Slots values (required for LPC filtering) +- */ +- if (!(flags & SBRDEC_LOW_POWER)) { +- FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], +- pLowBandReal[noCols - LPC_ORDER + i], +- length * sizeof(FIXP_DBL)); +- FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], +- pLowBandImag[noCols - LPC_ORDER + i], +- length * sizeof(FIXP_DBL)); +- } else +- FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], +- pLowBandReal[noCols - LPC_ORDER + i], +- length * sizeof(FIXP_DBL)); +- } +- } +- +- /* +- Synthesis subband filtering. +- */ +- +- if (!(flags & SBRDEC_PS_DECODED)) { +- if (!(flags & SBRDEC_SKIP_QMF_SYN)) { +- int outScalefactor = 0; +- +- if (h_ps_d != NULL) { +- h_ps_d->procFrameBased = 1; /* we here do frame based processing */ +- } +- +- sbrDecoder_drcApply(&hSbrDec->sbrDrcChannel, pLowBandReal, +- (flags & SBRDEC_LOW_POWER) ? NULL : pLowBandImag, +- hSbrDec->qmfDomainOutCh->fb.no_col, &outScalefactor); +- +- qmfChangeOutScalefactor(&hSbrDec->qmfDomainOutCh->fb, outScalefactor); +- +- { +- HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; +- int save_usb = hSbrDec->qmfDomainOutCh->fb.usb; +- +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#else +- C_AALLOC_STACK_START(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#endif +- if (hSbrDec->qmfDomainOutCh->fb.usb < hFreq->ov_highSubband) { +- /* we need to patch usb for this frame as overlap may contain higher +- frequency range if headerchange occured; fb. usb is always limited +- to maximum fb.no_channels; In case of wrongly decoded headers it +- might be that ov_highSubband is higher than the number of synthesis +- channels (fb.no_channels), which is forbidden, therefore we need to +- limit ov_highSubband with fMin function to avoid not allowed usb in +- synthesis filterbank. */ +- hSbrDec->qmfDomainOutCh->fb.usb = +- fMin((UINT)hFreq->ov_highSubband, +- (UINT)hSbrDec->qmfDomainOutCh->fb.no_channels); +- } +- { +- qmfSynthesisFiltering( +- &hSbrDec->qmfDomainOutCh->fb, pLowBandReal, +- (flags & SBRDEC_LOW_POWER) ? NULL : pLowBandImag, +- &hSbrDec->qmfDomainInCh->scaling, +- hSbrDec->LppTrans.pSettings->overlap, timeOut, strideOut, +- qmfTemp); +- } +- /* restore saved value */ +- hSbrDec->qmfDomainOutCh->fb.usb = save_usb; +- hFreq->ov_highSubband = save_usb; +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#else +- C_AALLOC_STACK_END(qmfTemp, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#endif +- } +- } +- +- } else { /* (flags & SBRDEC_PS_DECODED) */ +- INT sdiff; +- INT scaleFactorHighBand, scaleFactorLowBand_ov, scaleFactorLowBand_no_ov; +- +- HANDLE_QMF_FILTER_BANK synQmf = &hSbrDec->qmfDomainOutCh->fb; +- HANDLE_QMF_FILTER_BANK synQmfRight = &hSbrDecRight->qmfDomainOutCh->fb; +- +- /* adapt scaling */ +- sdiff = hSbrDec->qmfDomainInCh->scaling.lb_scale - +- reserve; /* Scaling difference */ +- scaleFactorHighBand = sdiff - hSbrDec->qmfDomainInCh->scaling.hb_scale; +- scaleFactorLowBand_ov = sdiff - hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; +- scaleFactorLowBand_no_ov = sdiff - hSbrDec->qmfDomainInCh->scaling.lb_scale; +- +- /* Scale of low band overlapping QMF data */ +- scaleFactorLowBand_ov = +- fMin(DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorLowBand_ov)); +- /* Scale of low band current QMF data */ +- scaleFactorLowBand_no_ov = fMin( +- DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorLowBand_no_ov)); +- /* Scale of current high band */ +- scaleFactorHighBand = +- fMin(DFRACT_BITS - 1, fMax(-(DFRACT_BITS - 1), scaleFactorHighBand)); +- +- if (h_ps_d->procFrameBased == 1) /* If we have switched from frame to slot +- based processing copy filter states */ +- { /* procFrameBased will be unset later */ +- /* copy filter states from left to right */ +- /* was ((640)-(64))*sizeof(FIXP_QSS) +- flexible amount of synthesis bands needed for QMF based resampling +- */ +- FDK_ASSERT(hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis <= +- QMF_MAX_SYNTHESIS_BANDS); +- FDKmemcpy(synQmfRight->FilterStates, synQmf->FilterStates, +- 9 * hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis * +- sizeof(FIXP_QSS)); +- } +- +- /* Feed delaylines when parametric stereo is switched on. */ +- PreparePsProcessing(h_ps_d, pLowBandReal, pLowBandImag, +- scaleFactorLowBand_ov); +- +- /* use the same synthese qmf values for left and right channel */ +- synQmfRight->no_col = synQmf->no_col; +- synQmfRight->lsb = synQmf->lsb; +- synQmfRight->usb = synQmf->usb; +- +- int env = 0; +- +- { +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, +- 2 * QMF_MAX_SYNTHESIS_BANDS); +-#else +- C_AALLOC_STACK_START(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#endif +- +- int maxShift = 0; +- +- if (hSbrDec->sbrDrcChannel.enable != 0) { +- if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { +- maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; +- } +- if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { +- maxShift = hSbrDec->sbrDrcChannel.currFact_exp; +- } +- if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { +- maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; +- } +- } +- +- /* copy DRC data to right channel (with PS both channels use the same DRC +- * gains) */ +- FDKmemcpy(&hSbrDecRight->sbrDrcChannel, &hSbrDec->sbrDrcChannel, +- sizeof(SBRDEC_DRC_CHANNEL)); +- +- for (i = 0; i < synQmf->no_col; i++) { /* ----- no_col loop ----- */ +- +- INT outScalefactorR, outScalefactorL; +- +- /* qmf timeslot of right channel */ +- FIXP_DBL *rQmfReal = pWorkBuffer; +- FIXP_DBL *rQmfImag = pWorkBuffer + synQmf->no_channels; +- +- { +- if (i == +- h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env]) { +- initSlotBasedRotation(h_ps_d, env, +- hHeaderData->freqBandData.highSubband); +- env++; +- } +- +- ApplyPsSlot( +- h_ps_d, /* parametric stereo decoder handle */ +- (pLowBandReal + i), /* one timeslot of left/mono channel */ +- (pLowBandImag + i), /* one timeslot of left/mono channel */ +- rQmfReal, /* one timeslot or right channel */ +- rQmfImag, /* one timeslot or right channel */ +- scaleFactorLowBand_no_ov, +- (i < hSbrDec->LppTrans.pSettings->overlap) +- ? scaleFactorLowBand_ov +- : scaleFactorLowBand_no_ov, +- scaleFactorHighBand, synQmf->lsb, synQmf->usb); +- +- outScalefactorL = outScalefactorR = 1; /* psDiffScale! (MPEG-PS) */ +- } +- +- sbrDecoder_drcApplySlot(/* right channel */ +- &hSbrDecRight->sbrDrcChannel, rQmfReal, +- rQmfImag, i, synQmfRight->no_col, maxShift); +- +- outScalefactorR += maxShift; +- +- sbrDecoder_drcApplySlot(/* left channel */ +- &hSbrDec->sbrDrcChannel, *(pLowBandReal + i), +- *(pLowBandImag + i), i, synQmf->no_col, +- maxShift); +- +- outScalefactorL += maxShift; +- +- if (!(flags & SBRDEC_SKIP_QMF_SYN)) { +- qmfSynthesisFilteringSlot( +- synQmfRight, rQmfReal, /* QMF real buffer */ +- rQmfImag, /* QMF imag buffer */ +- outScalefactorL, outScalefactorL, +- timeOutRight + (i * synQmf->no_channels * strideOut), strideOut, +- pWorkBuffer); +- +- qmfSynthesisFilteringSlot( +- synQmf, *(pLowBandReal + i), /* QMF real buffer */ +- *(pLowBandImag + i), /* QMF imag buffer */ +- outScalefactorR, outScalefactorR, +- timeOut + (i * synQmf->no_channels * strideOut), strideOut, +- pWorkBuffer); +- } +- } /* no_col loop i */ +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#else +- C_AALLOC_STACK_END(pWorkBuffer, FIXP_DBL, 2 * QMF_MAX_SYNTHESIS_BANDS); +-#endif +- } +- } +- +- sbrDecoder_drcUpdateChannel(&hSbrDec->sbrDrcChannel); +- +- /* +- Update overlap buffer +- Even bands above usb are copied to avoid outdated spectral data in case +- the stop frequency raises. +- */ +- +- if (!(flags & SBRDEC_SKIP_QMF_SYN)) { +- { +- FDK_QmfDomain_SaveOverlap(hSbrDec->qmfDomainInCh, 0); +- FDK_ASSERT(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale == saveLbScale); +- } +- } +- +- hSbrDec->savedStates = 0; +- +- /* Save current frame status */ +- hPrevFrameData->frameErrorFlag = hHeaderData->frameErrorFlag; +- hSbrDec->applySbrProc_old = applyProcessing; +- +-} /* sbr_dec() */ +- +-/*! +- \brief Creates sbr decoder structure +- \return errorCode, 0 if successful +-*/ +-SBR_ERROR +-createSbrDec(SBR_CHANNEL *hSbrChannel, +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- TRANSPOSER_SETTINGS *pSettings, +- const int downsampleFac, /*!< Downsampling factor */ +- const UINT qmfFlags, /*!< flags -> 1: HQ/LP selector, 2: CLDFB */ +- const UINT flags, const int overlap, +- int chan, /*!< Channel for which to assign buffers etc. */ +- int codecFrameSize) +- +-{ +- SBR_ERROR err = SBRDEC_OK; +- int timeSlots = +- hHeaderData->numberTimeSlots; /* Number of SBR slots per frame */ +- int noCols = +- timeSlots * hHeaderData->timeStep; /* Number of QMF slots per frame */ +- HANDLE_SBR_DEC hs = &(hSbrChannel->SbrDec); +- +-#if (SBRDEC_MAX_HB_FADE_FRAMES > 0) +- hs->highBandFadeCnt = SBRDEC_MAX_HB_FADE_FRAMES; +- +-#endif +- hs->scale_hbe = 15; +- hs->scale_lb = 15; +- hs->scale_ov = 15; +- +- hs->prev_frame_lSbr = 0; +- hs->prev_frame_hbeSbr = 0; +- +- hs->codecFrameSize = codecFrameSize; +- +- /* +- create envelope calculator +- */ +- err = createSbrEnvelopeCalc(&hs->SbrCalculateEnvelope, hHeaderData, chan, +- flags); +- if (err != SBRDEC_OK) { +- return err; +- } +- +- initSbrPrevFrameData(&hSbrChannel->prevFrameData, timeSlots); +- +- /* +- create transposer +- */ +- err = createLppTransposer( +- &hs->LppTrans, pSettings, hHeaderData->freqBandData.lowSubband, +- hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, +- hHeaderData->freqBandData.highSubband, timeSlots, noCols, +- hHeaderData->freqBandData.freqBandTableNoise, +- hHeaderData->freqBandData.nNfb, hHeaderData->sbrProcSmplRate, chan, +- overlap); +- if (err != SBRDEC_OK) { +- return err; +- } +- +- if (flags & SBRDEC_USAC_HARMONICSBR) { +- int noChannels, bSbr41 = flags & SBRDEC_QUAD_RATE ? 1 : 0; +- +- noChannels = +- QMF_SYNTH_CHANNELS / +- ((bSbr41 + 1) * 2); /* 32 for (32:64 and 24:64) and 16 for 16:64 */ +- +- /* shared memory between hbeLightTimeDelayBuffer and hQmfHBESlotsReal if +- * SBRDEC_HBE_ENABLE */ +- hSbrChannel->SbrDec.tmp_memory = (FIXP_DBL **)fdkCallocMatrix2D_aligned( +- noCols, noChannels, sizeof(FIXP_DBL)); +- if (hSbrChannel->SbrDec.tmp_memory == NULL) { +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- hSbrChannel->SbrDec.hQmfHBESlotsReal = hSbrChannel->SbrDec.tmp_memory; +- hSbrChannel->SbrDec.hQmfHBESlotsImag = +- (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, +- sizeof(FIXP_DBL)); +- if (hSbrChannel->SbrDec.hQmfHBESlotsImag == NULL) { +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- /* buffers containing unmodified qmf data; required when switching from +- * legacy SBR to HBE */ +- /* buffer can be used as LPCFilterstates buffer because legacy SBR needs +- * exactly these values for LPC filtering */ +- hSbrChannel->SbrDec.codecQMFBufferReal = +- (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, +- sizeof(FIXP_DBL)); +- if (hSbrChannel->SbrDec.codecQMFBufferReal == NULL) { +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- hSbrChannel->SbrDec.codecQMFBufferImag = +- (FIXP_DBL **)fdkCallocMatrix2D_aligned(noCols, noChannels, +- sizeof(FIXP_DBL)); +- if (hSbrChannel->SbrDec.codecQMFBufferImag == NULL) { +- return SBRDEC_MEM_ALLOC_FAILED; +- } +- +- err = QmfTransposerCreate(&hs->hHBE, codecFrameSize, 0, bSbr41); +- if (err != SBRDEC_OK) { +- return err; +- } +- } +- +- return err; +-} +- +-/*! +- \brief Delete sbr decoder structure +- \return errorCode, 0 if successful +-*/ +-int deleteSbrDec(SBR_CHANNEL *hSbrChannel) { +- HANDLE_SBR_DEC hs = &hSbrChannel->SbrDec; +- +- deleteSbrEnvelopeCalc(&hs->SbrCalculateEnvelope); +- +- if (hs->tmp_memory != NULL) { +- FDK_FREE_MEMORY_2D_ALIGNED(hs->tmp_memory); +- } +- +- /* modify here */ +- FDK_FREE_MEMORY_2D_ALIGNED(hs->hQmfHBESlotsImag); +- +- if (hs->hHBE != NULL) QmfTransposerClose(hs->hHBE); +- +- if (hs->codecQMFBufferReal != NULL) { +- FDK_FREE_MEMORY_2D_ALIGNED(hs->codecQMFBufferReal); +- } +- +- if (hs->codecQMFBufferImag != NULL) { +- FDK_FREE_MEMORY_2D_ALIGNED(hs->codecQMFBufferImag); +- } +- +- return 0; +-} +- +-/*! +- \brief resets sbr decoder structure +- \return errorCode, 0 if successful +-*/ +-SBR_ERROR +-resetSbrDec(HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, const int downsampleFac, +- const UINT flags, HANDLE_SBR_FRAME_DATA hFrameData) { +- SBR_ERROR sbrError = SBRDEC_OK; +- int i; +- FIXP_DBL *pLowBandReal[128]; +- FIXP_DBL *pLowBandImag[128]; +- int useLP = flags & SBRDEC_LOW_POWER; +- +- int old_lsb = hSbrDec->qmfDomainInCh->fb.lsb; +- int old_usb = hSbrDec->qmfDomainInCh->fb.usb; +- int new_lsb = hHeaderData->freqBandData.lowSubband; +- /* int new_usb = hHeaderData->freqBandData.highSubband; */ +- int l, startBand, stopBand, startSlot, size; +- +- FIXP_DBL **OverlapBufferReal = hSbrDec->qmfDomainInCh->hQmfSlotsReal; +- FIXP_DBL **OverlapBufferImag = hSbrDec->qmfDomainInCh->hQmfSlotsImag; +- +- /* in case the previous frame was not active in terms of SBR processing, the +- full band from 0 to no_channels was rescaled and not overwritten. Thats why +- the scaling factor lb_scale can be seen as assigned to all bands from 0 to +- no_channels in the previous frame. The same states for the current frame if +- the current frame is not active in terms of SBR processing +- */ +- int applySbrProc = (hHeaderData->syncState == SBR_ACTIVE || +- (hHeaderData->frameErrorFlag == 0 && +- hHeaderData->syncState == SBR_HEADER)); +- int applySbrProc_old = hSbrDec->applySbrProc_old; +- +- if (!applySbrProc) { +- new_lsb = (hSbrDec->qmfDomainInCh->fb).no_channels; +- } +- if (!applySbrProc_old) { +- old_lsb = (hSbrDec->qmfDomainInCh->fb).no_channels; +- old_usb = old_lsb; +- } +- +- resetSbrEnvelopeCalc(&hSbrDec->SbrCalculateEnvelope); +- +- /* Change lsb and usb */ +- /* Synthesis */ +- FDK_ASSERT(hSbrDec->qmfDomainOutCh != NULL); +- hSbrDec->qmfDomainOutCh->fb.lsb = +- fixMin((INT)hSbrDec->qmfDomainOutCh->fb.no_channels, +- (INT)hHeaderData->freqBandData.lowSubband); +- hSbrDec->qmfDomainOutCh->fb.usb = +- fixMin((INT)hSbrDec->qmfDomainOutCh->fb.no_channels, +- (INT)hHeaderData->freqBandData.highSubband); +- /* Analysis */ +- FDK_ASSERT(hSbrDec->qmfDomainInCh != NULL); +- hSbrDec->qmfDomainInCh->fb.lsb = hSbrDec->qmfDomainOutCh->fb.lsb; +- hSbrDec->qmfDomainInCh->fb.usb = hSbrDec->qmfDomainOutCh->fb.usb; +- +- /* +- The following initialization of spectral data in the overlap buffer +- is required for dynamic x-over or a change of the start-freq for 2 reasons: +- +- 1. If the lowband gets _wider_, unadjusted data would remain +- +- 2. If the lowband becomes _smaller_, the highest bands of the old lowband +- must be cleared because the whitening would be affected +- */ +- startBand = old_lsb; +- stopBand = new_lsb; +- startSlot = fMax(0, hHeaderData->timeStep * (hPrevFrameData->stopPos - +- hHeaderData->numberTimeSlots)); +- size = fMax(0, stopBand - startBand); +- +- /* in case of USAC we don't want to zero out the memory, as this can lead to +- holes in the spectrum; fix shall only be applied for USAC not for MPEG-4 +- SBR, in this case setting zero remains */ +- if (!(flags & SBRDEC_SYNTAX_USAC)) { +- /* keep already adjusted data in the x-over-area */ +- if (!useLP) { +- for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { +- FDKmemclear(&OverlapBufferReal[l][startBand], size * sizeof(FIXP_DBL)); +- FDKmemclear(&OverlapBufferImag[l][startBand], size * sizeof(FIXP_DBL)); +- } +- } else { +- for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { +- FDKmemclear(&OverlapBufferReal[l][startBand], size * sizeof(FIXP_DBL)); +- } +- } +- +- /* +- reset LPC filter states +- */ +- startBand = fixMin(old_lsb, new_lsb); +- stopBand = fixMax(old_lsb, new_lsb); +- size = fixMax(0, stopBand - startBand); +- +- FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[0][startBand], +- size * sizeof(FIXP_DBL)); +- FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[1][startBand], +- size * sizeof(FIXP_DBL)); +- if (!useLP) { +- FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[0][startBand], +- size * sizeof(FIXP_DBL)); +- FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[1][startBand], +- size * sizeof(FIXP_DBL)); +- } +- } +- +- if (startSlot != 0) { +- int source_exp, target_exp, delta_exp, target_lsb, target_usb, reserve; +- FIXP_DBL maxVal; +- +- /* +- Rescale already processed spectral data between old and new x-over +- frequency. This must be done because of the separate scalefactors for +- lowband and highband. +- */ +- +- /* We have four relevant transitions to cover: +- 1. old_usb is lower than new_lsb; old SBR area is completely below new SBR +- area. +- -> entire old area was highband and belongs to lowband now +- and has to be rescaled. +- 2. old_lsb is higher than new_usb; new SBR area is completely below old SBR +- area. +- -> old area between new_lsb and old_lsb was lowband and belongs to +- highband now and has to be rescaled to match new highband scale. +- 3. old_lsb is lower and old_usb is higher than new_lsb; old and new SBR +- areas overlap. +- -> old area between old_lsb and new_lsb was highband and belongs to +- lowband now and has to be rescaled to match new lowband scale. +- 4. new_lsb is lower and new_usb_is higher than old_lsb; old and new SBR +- areas overlap. +- -> old area between new_lsb and old_usb was lowband and belongs to +- highband now and has to be rescaled to match new highband scale. +- */ +- +- if (new_lsb > old_lsb) { +- /* case 1 and 3 */ +- source_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_hb_scale); +- target_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale); +- +- startBand = old_lsb; +- +- if (new_lsb >= old_usb) { +- /* case 1 */ +- stopBand = old_usb; +- } else { +- /* case 3 */ +- stopBand = new_lsb; +- } +- +- target_lsb = 0; +- target_usb = old_lsb; +- } else { +- /* case 2 and 4 */ +- source_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale); +- target_exp = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_hb_scale); +- +- startBand = new_lsb; +- stopBand = old_lsb; +- +- target_lsb = old_lsb; +- target_usb = old_usb; +- } +- +- maxVal = +- maxSubbandSample(OverlapBufferReal, (useLP) ? NULL : OverlapBufferImag, +- startBand, stopBand, 0, startSlot); +- +- reserve = ((LONG)maxVal != 0 ? CntLeadingZeros(maxVal) - 1 : 0); +- reserve = fixMin( +- reserve, +- DFRACT_BITS - 1 - +- EXP2SCALE( +- source_exp)); /* what is this line for, why do we need it? */ +- +- /* process only if x-over-area is not dominant after rescale; +- otherwise I'm not sure if all buffers are scaled correctly; +- */ +- if (target_exp - (source_exp - reserve) >= 0) { +- rescaleSubbandSamples(OverlapBufferReal, +- (useLP) ? NULL : OverlapBufferImag, startBand, +- stopBand, 0, startSlot, reserve); +- source_exp -= reserve; +- } +- +- delta_exp = target_exp - source_exp; +- +- if (delta_exp < 0) { /* x-over-area is dominant */ +- startBand = target_lsb; +- stopBand = target_usb; +- delta_exp = -delta_exp; +- +- if (new_lsb > old_lsb) { +- /* The lowband has to be rescaled */ +- hSbrDec->qmfDomainInCh->scaling.ov_lb_scale = EXP2SCALE(source_exp); +- } else { +- /* The highband has to be rescaled */ +- hSbrDec->qmfDomainInCh->scaling.ov_hb_scale = EXP2SCALE(source_exp); +- } +- } +- +- FDK_ASSERT(startBand <= stopBand); +- +- if (!useLP) { +- for (l = 0; l < startSlot; l++) { +- scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, +- -delta_exp); +- scaleValues(OverlapBufferImag[l] + startBand, stopBand - startBand, +- -delta_exp); +- } +- } else +- for (l = 0; l < startSlot; l++) { +- scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, +- -delta_exp); +- } +- } /* startSlot != 0 */ +- +- /* +- Initialize transposer and limiter +- */ +- sbrError = resetLppTransposer( +- &hSbrDec->LppTrans, hHeaderData->freqBandData.lowSubband, +- hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, +- hHeaderData->freqBandData.freqBandTableNoise, +- hHeaderData->freqBandData.nNfb, hHeaderData->freqBandData.highSubband, +- hHeaderData->sbrProcSmplRate); +- if (sbrError != SBRDEC_OK) return sbrError; +- +- hSbrDec->savedStates = 0; +- +- if ((flags & SBRDEC_USAC_HARMONICSBR) && applySbrProc) { +- sbrError = QmfTransposerReInit(hSbrDec->hHBE, +- hHeaderData->freqBandData.freqBandTable, +- hHeaderData->freqBandData.nSfb); +- if (sbrError != SBRDEC_OK) return sbrError; +- +- /* copy saved states from previous frame to legacy SBR lpc filterstate +- * buffer */ +- for (i = 0; i < LPC_ORDER + hSbrDec->LppTrans.pSettings->overlap; i++) { +- FDKmemcpy( +- hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], +- hSbrDec->codecQMFBufferReal[hSbrDec->hHBE->noCols - LPC_ORDER - +- hSbrDec->LppTrans.pSettings->overlap + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- FDKmemcpy( +- hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], +- hSbrDec->codecQMFBufferImag[hSbrDec->hHBE->noCols - LPC_ORDER - +- hSbrDec->LppTrans.pSettings->overlap + i], +- hSbrDec->hHBE->noChannels * sizeof(FIXP_DBL)); +- } +- hSbrDec->savedStates = 1; +- +- { +- /* map QMF buffer to pointer array (Overlap + Frame)*/ +- for (i = 0; i < hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER; i++) { +- pLowBandReal[i] = hSbrDec->LppTrans.lpcFilterStatesRealHBE[i]; +- pLowBandImag[i] = hSbrDec->LppTrans.lpcFilterStatesImagHBE[i]; +- } +- +- /* map QMF buffer to pointer array (Overlap + Frame)*/ +- for (i = 0; i < hSbrDec->hHBE->noCols; i++) { +- pLowBandReal[i + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->codecQMFBufferReal[i]; +- pLowBandImag[i + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->codecQMFBufferImag[i]; +- } +- +- if (flags & SBRDEC_QUAD_RATE) { +- if (hFrameData->sbrPatchingMode == 0) { +- int *xOverQmf = GetxOverBandQmfTransposer(hSbrDec->hHBE); +- +- /* in case of harmonic SBR and no HBE_LP map additional buffer for +- one more frame to pointer arry */ +- for (i = 0; i < hSbrDec->hHBE->noCols / 2; i++) { +- pLowBandReal[i + hSbrDec->hHBE->noCols + +- hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->hQmfHBESlotsReal[i]; +- pLowBandImag[i + hSbrDec->hHBE->noCols + +- hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->hQmfHBESlotsImag[i]; +- } +- +- QmfTransposerApply( +- hSbrDec->hHBE, +- pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + +- hSbrDec->hHBE->noCols / 2 + LPC_ORDER, +- pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + +- hSbrDec->hHBE->noCols / 2 + LPC_ORDER, +- hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, +- hSbrDec->LppTrans.lpcFilterStatesRealHBE, +- hSbrDec->LppTrans.lpcFilterStatesImagHBE, +- hPrevFrameData->prevSbrPitchInBins, hSbrDec->scale_lb, +- hSbrDec->scale_hbe, &hSbrDec->qmfDomainInCh->scaling.hb_scale, +- hHeaderData->timeStep, hFrameData->frameInfo.borders[0], +- hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); +- +- copyHarmonicSpectrum( +- xOverQmf, pLowBandReal, pLowBandImag, hSbrDec->hHBE->noCols, +- hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); +- } +- } else { +- /* in case of harmonic SBR and no HBE_LP map additional buffer for +- one more frame to pointer arry */ +- for (i = 0; i < hSbrDec->hHBE->noCols; i++) { +- pLowBandReal[i + hSbrDec->hHBE->noCols + +- hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->hQmfHBESlotsReal[i]; +- pLowBandImag[i + hSbrDec->hHBE->noCols + +- hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER] = +- hSbrDec->hQmfHBESlotsImag[i]; +- } +- +- if (hFrameData->sbrPatchingMode == 0) { +- QmfTransposerApply( +- hSbrDec->hHBE, +- pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER, +- pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER, +- hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, +- hSbrDec->LppTrans.lpcFilterStatesRealHBE, +- hSbrDec->LppTrans.lpcFilterStatesImagHBE, +- 0 /* not required for keeping states updated in this frame*/, +- hSbrDec->scale_lb, hSbrDec->scale_lb, +- &hSbrDec->qmfDomainInCh->scaling.hb_scale, hHeaderData->timeStep, +- hFrameData->frameInfo.borders[0], +- hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_NOOUT); +- } +- +- QmfTransposerApply( +- hSbrDec->hHBE, +- pLowBandReal + hSbrDec->LppTrans.pSettings->overlap + +- hSbrDec->hHBE->noCols + LPC_ORDER, +- pLowBandImag + hSbrDec->LppTrans.pSettings->overlap + +- hSbrDec->hHBE->noCols + LPC_ORDER, +- hSbrDec->hHBE->noCols, pLowBandReal, pLowBandImag, +- hSbrDec->LppTrans.lpcFilterStatesRealHBE, +- hSbrDec->LppTrans.lpcFilterStatesImagHBE, +- hPrevFrameData->prevSbrPitchInBins, hSbrDec->scale_lb, +- hSbrDec->scale_hbe, &hSbrDec->qmfDomainInCh->scaling.hb_scale, +- hHeaderData->timeStep, hFrameData->frameInfo.borders[0], +- hSbrDec->LppTrans.pSettings->overlap, KEEP_STATES_SYNCED_OUTDIFF); +- } +- +- if (hFrameData->sbrPatchingMode == 0) { +- for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { +- /* +- Store the unmodified qmf Slots values for upper part of spectrum +- (required for LPC filtering) required if next frame is a HBE frame +- */ +- FDKmemcpy(hSbrDec->qmfDomainInCh->hQmfSlotsReal[i], +- hSbrDec->LppTrans.lpcFilterStatesRealHBE[i + LPC_ORDER], +- (64) * sizeof(FIXP_DBL)); +- FDKmemcpy(hSbrDec->qmfDomainInCh->hQmfSlotsImag[i], +- hSbrDec->LppTrans.lpcFilterStatesImagHBE[i + LPC_ORDER], +- (64) * sizeof(FIXP_DBL)); +- } +- +- for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { +- /* +- Store the unmodified qmf Slots values for upper part of spectrum +- (required for LPC filtering) required if next frame is a HBE frame +- */ +- FDKmemcpy( +- hSbrDec->qmfDomainInCh->hQmfSlotsReal[i], +- hSbrDec->codecQMFBufferReal[hSbrDec->hHBE->noCols - +- hSbrDec->LppTrans.pSettings->overlap + +- i], +- new_lsb * sizeof(FIXP_DBL)); +- FDKmemcpy( +- hSbrDec->qmfDomainInCh->hQmfSlotsImag[i], +- hSbrDec->codecQMFBufferImag[hSbrDec->hHBE->noCols - +- hSbrDec->LppTrans.pSettings->overlap + +- i], +- new_lsb * sizeof(FIXP_DBL)); +- } +- } +- } +- } +- +- { +- int adapt_lb = 0, diff = 0, +- new_scale = hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; +- +- if ((hSbrDec->qmfDomainInCh->scaling.ov_lb_scale != +- hSbrDec->qmfDomainInCh->scaling.lb_scale) && +- startSlot != 0) { +- /* we need to adapt spectrum to have equal scale factor, always larger +- * than zero */ +- diff = SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.ov_lb_scale) - +- SCALE2EXP(hSbrDec->qmfDomainInCh->scaling.lb_scale); +- +- if (diff > 0) { +- adapt_lb = 1; +- diff = -diff; +- new_scale = hSbrDec->qmfDomainInCh->scaling.ov_lb_scale; +- } +- +- stopBand = new_lsb; +- } +- +- if (hFrameData->sbrPatchingMode == 1) { +- /* scale states from LegSBR filterstates buffer */ +- for (i = 0; i < hSbrDec->LppTrans.pSettings->overlap + LPC_ORDER; i++) { +- scaleValues(hSbrDec->LppTrans.lpcFilterStatesRealLegSBR[i], new_lsb, +- diff); +- if (!useLP) { +- scaleValues(hSbrDec->LppTrans.lpcFilterStatesImagLegSBR[i], new_lsb, +- diff); +- } +- } +- +- if (flags & SBRDEC_SYNTAX_USAC) { +- /* get missing states between old and new x_over from LegSBR +- * filterstates buffer */ +- /* in case of legacy SBR we leave these values zeroed out */ +- for (i = startSlot; i < hSbrDec->LppTrans.pSettings->overlap; i++) { +- FDKmemcpy(&OverlapBufferReal[i][old_lsb], +- &hSbrDec->LppTrans +- .lpcFilterStatesRealLegSBR[LPC_ORDER + i][old_lsb], +- fMax(new_lsb - old_lsb, 0) * sizeof(FIXP_DBL)); +- if (!useLP) { +- FDKmemcpy(&OverlapBufferImag[i][old_lsb], +- &hSbrDec->LppTrans +- .lpcFilterStatesImagLegSBR[LPC_ORDER + i][old_lsb], +- fMax(new_lsb - old_lsb, 0) * sizeof(FIXP_DBL)); +- } +- } +- } +- +- if (new_lsb > old_lsb) { +- stopBand = old_lsb; +- } +- } +- if ((adapt_lb == 1) && (stopBand > startBand)) { +- for (l = startSlot; l < hSbrDec->LppTrans.pSettings->overlap; l++) { +- scaleValues(OverlapBufferReal[l] + startBand, stopBand - startBand, +- diff); +- if (!useLP) { +- scaleValues(OverlapBufferImag[l] + startBand, stopBand - startBand, +- diff); +- } +- } +- } +- hSbrDec->qmfDomainInCh->scaling.ov_lb_scale = new_scale; +- } +- +- sbrError = ResetLimiterBands(hHeaderData->freqBandData.limiterBandTable, +- &hHeaderData->freqBandData.noLimiterBands, +- hHeaderData->freqBandData.freqBandTable[0], +- hHeaderData->freqBandData.nSfb[0], +- hSbrDec->LppTrans.pSettings->patchParam, +- hSbrDec->LppTrans.pSettings->noOfPatches, +- hHeaderData->bs_data.limiterBands, +- hFrameData->sbrPatchingMode, +- GetxOverBandQmfTransposer(hSbrDec->hHBE), +- Get41SbrQmfTransposer(hSbrDec->hHBE)); +- +- hSbrDec->SbrCalculateEnvelope.sbrPatchingMode = hFrameData->sbrPatchingMode; +- +- return sbrError; +-} +diff --git a/libSBRdec/src/sbr_dec.h b/libSBRdec/src/sbr_dec.h +deleted file mode 100644 +index 156da03..0000000 +--- a/libSBRdec/src/sbr_dec.h ++++ /dev/null +@@ -1,204 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Sbr decoder +-*/ +-#ifndef SBR_DEC_H +-#define SBR_DEC_H +- +-#include "sbrdecoder.h" +- +-#include "lpp_tran.h" +-#include "qmf.h" +-#include "env_calc.h" +-#include "FDK_audio.h" +- +-#include "sbrdec_drc.h" +- +-#include "pvc_dec.h" +- +-#include "hbe.h" +- +-enum SBRDEC_QMF_SKIP { +- qmfSkipNothing = 0, +- qmfSkipAnalysis = 1 << 0, +- qmfSkipSynthesis = 1 << 1 +-}; +- +-typedef struct { +- SBR_CALCULATE_ENVELOPE SbrCalculateEnvelope; +- SBR_LPP_TRANS LppTrans; +- PVC_STATIC_DATA PvcStaticData; +- +- /* do scale handling in sbr an not in qmf */ +- SHORT scale_ov; +- SHORT scale_lb; +- SHORT scale_hbe; +- +- SHORT prev_frame_lSbr; +- SHORT prev_frame_hbeSbr; +- +- int codecFrameSize; +- +- HANDLE_HBE_TRANSPOSER hHBE; +- +- HANDLE_FDK_QMF_DOMAIN_IN qmfDomainInCh; +- HANDLE_FDK_QMF_DOMAIN_OUT qmfDomainOutCh; +- +- SBRDEC_DRC_CHANNEL sbrDrcChannel; +- +-#if (SBRDEC_MAX_HB_FADE_FRAMES > 0) +- INT highBandFadeCnt; /* counter for fading in high-band signal smoothly */ +- +-#endif +- FIXP_DBL **tmp_memory; /* shared memory between hbeLightTimeDelayBuffer and +- hQmfHBESlotsReal */ +- +- FIXP_DBL **hQmfHBESlotsReal; +- FIXP_DBL **hQmfHBESlotsImag; +- +- FIXP_DBL **codecQMFBufferReal; +- FIXP_DBL **codecQMFBufferImag; +- UCHAR savedStates; +- int applySbrProc_old; +-} SBR_DEC; +- +-typedef SBR_DEC *HANDLE_SBR_DEC; +- +-typedef struct { +- SBR_FRAME_DATA frameData[(1) + 1]; +- SBR_PREV_FRAME_DATA prevFrameData; +- SBR_DEC SbrDec; +-} SBR_CHANNEL; +- +-typedef SBR_CHANNEL *HANDLE_SBR_CHANNEL; +- +-void sbr_dec( +- HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ +- INT_PCM *timeIn, /*!< pointer to input time signal */ +- INT_PCM *timeOut, /*!< pointer to output time signal */ +- HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ +- INT_PCM *timeOutRight, /*!< pointer to output time signal */ +- INT strideOut, /*!< Time data traversal strideOut */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ +- HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ +- HANDLE_SBR_PREV_FRAME_DATA +- hPrevFrameData, /*!< Some control data of last frame */ +- const int applyProcessing, /*!< Flag for SBR operation */ +- HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize); +- +-SBR_ERROR +-createSbrDec(SBR_CHANNEL *hSbrChannel, HANDLE_SBR_HEADER_DATA hHeaderData, +- TRANSPOSER_SETTINGS *pSettings, const int downsampleFac, +- const UINT qmfFlags, const UINT flags, const int overlap, int chan, +- int codecFrameSize); +- +-int deleteSbrDec(SBR_CHANNEL *hSbrChannel); +- +-SBR_ERROR +-resetSbrDec(HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, +- HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, const int downsampleFac, +- const UINT flags, HANDLE_SBR_FRAME_DATA hFrameData); +- +-#endif +diff --git a/libSBRdec/src/sbr_ram.cpp b/libSBRdec/src/sbr_ram.cpp +deleted file mode 100644 +index 8b35fd2..0000000 +--- a/libSBRdec/src/sbr_ram.cpp ++++ /dev/null +@@ -1,191 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Memory layout +- +- This module declares all static and dynamic memory spaces +-*/ +- +-#include "sbr_ram.h" +- +-#define WORKBUFFER1_TAG 2 +-#define WORKBUFFER2_TAG 3 +- +-/*! +- \name StaticSbrData +- +- Static memory areas, must not be overwritten in other sections of the decoder +-*/ +-/* @{ */ +- +-/*! SBR Decoder main structure */ +-C_ALLOC_MEM(Ram_SbrDecoder, struct SBR_DECODER_INSTANCE, 1) +-/*! SBR Decoder element data
+- Dimension: (8) */ +-C_ALLOC_MEM2(Ram_SbrDecElement, SBR_DECODER_ELEMENT, 1, (8)) +-/*! SBR Decoder individual channel data
+- Dimension: (8) */ +-C_ALLOC_MEM2(Ram_SbrDecChannel, SBR_CHANNEL, 1, (8) + 1) +- +-/*! Static Data of PS */ +- +-C_ALLOC_MEM(Ram_ps_dec, struct PS_DEC, 1) +- +-/* @} */ +- +-/*! +- \name DynamicSbrData +- +- Dynamic memory areas, might be reused in other algorithm sections, +- e.g. the core decoder +-
+- Depending on the mode set by DONT_USE_CORE_WORKBUFFER, workbuffers are +- defined additionally to the CoreWorkbuffer. +-
+- The size of WorkBuffers is ((1024) / (32) * (4) / 2)*(64) = 2048. +-
+- WorkBuffer2 is a pointer to the CoreWorkBuffer wich is reused here in the SBR +- part. In case of DONT_USE_CORE_WORKBUFFER, the CoreWorkbuffer is not used and +- the according Workbuffer2 is defined locally in this file.
WorkBuffer1 is +- reused in the AAC core (-> aacdecoder.cpp, aac_ram.cpp)
+- +- Use of WorkBuffers: +-
+-
+-    -------------------------------------------------------------
+-    AAC core:
+-
+-      CoreWorkbuffer: spectral coefficients
+-      WorkBuffer1:    CAacDecoderChannelInfo, CAacDecoderDynamicData
+-
+-    -------------------------------------------------------------
+-    SBR part:
+-      ----------------------------------------------
+-      Low Power Mode (useLP=1 or LOW_POWER_SBR_ONLY), see assignLcTimeSlots()
+-
+-        SLOT_BASED_PROTOTYPE_SYN_FILTER
+-
+-        WorkBuffer1                                WorkBuffer2(=CoreWorkbuffer)
+-         ________________                           ________________
+-        | RealLeft       |                         | RealRight      |
+-        |________________|                         |________________|
+-
+-      ----------------------------------------------
+-      High Quality Mode (!LOW_POWER_SBR_ONLY and useLP=0), see
+-  assignHqTimeSlots()
+-
+-         SLOTBASED_PS
+-
+-         WorkBuffer1                                WorkBuffer2(=CoreWorkbuffer)
+-         ________________                           ________________
+-        | Real/Imag      |  interleaved            | Real/Imag      |
+-  interleaved
+-        |________________|  first half actual ch   |________________|  second
+-  half actual ch
+-
+-    -------------------------------------------------------------
+-
+-  
+- +-*/ +diff --git a/libSBRdec/src/sbr_ram.h b/libSBRdec/src/sbr_ram.h +deleted file mode 100644 +index e00f8b5..0000000 +--- a/libSBRdec/src/sbr_ram.h ++++ /dev/null +@@ -1,186 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +-\file +-\brief Memory layout +-*/ +-#ifndef SBR_RAM_H +-#define SBR_RAM_H +- +-#include "sbrdecoder.h" +- +-#include "env_extr.h" +-#include "sbr_dec.h" +- +-#define SBRDEC_MAX_CH_PER_ELEMENT (2) +- +-#define FRAME_OK (0) +-#define FRAME_ERROR (1) +-#define FRAME_ERROR_ALLSLOTS (2) +- +-typedef struct { +- SBR_CHANNEL *pSbrChannel[SBRDEC_MAX_CH_PER_ELEMENT]; +- TRANSPOSER_SETTINGS +- transposerSettings; /* Common transport settings for each individual +- channel of an element */ +- HANDLE_FDK_BITSTREAM hBs; +- +- MP4_ELEMENT_ID +- elementID; /* Element ID set during initialization. Can be used for +- concealment */ +- int nChannels; /* Number of elements output channels (=2 in case of PS) */ +- +- UCHAR frameErrorFlag[(1) + 1]; /* Frame error status (for every slot in the +- delay line). Will be copied into header at +- the very beginning of decodeElement() +- routine. */ +- +- UCHAR useFrameSlot; /* Index which defines which slot will be decoded/filled +- next (used with additional delay) */ +- UCHAR useHeaderSlot[(1) + 1]; /* Index array that provides the link between +- header and frame data (important when +- processing with additional delay). */ +-} SBR_DECODER_ELEMENT; +- +-struct SBR_DECODER_INSTANCE { +- SBR_DECODER_ELEMENT *pSbrElement[(8)]; +- SBR_HEADER_DATA sbrHeader[( +- 8)][(1) + 1]; /* Sbr header for each individual channel of an element */ +- +- HANDLE_FDK_QMF_DOMAIN pQmfDomain; +- +- HANDLE_PS_DEC hParametricStereoDec; +- +- /* Global parameters */ +- AUDIO_OBJECT_TYPE coreCodec; /* AOT of core codec */ +- int numSbrElements; +- int numSbrChannels; +- INT sampleRateIn; /* SBR decoder input sampling rate; might be different than +- the transposer input sampling rate. */ +- INT sampleRateOut; /* Sampling rate of the SBR decoder output audio samples. +- */ +- USHORT codecFrameSize; +- UCHAR synDownsampleFac; +- INT downscaleFactor; +- UCHAR numDelayFrames; /* The current number of additional delay frames used +- for processing. */ +- UCHAR harmonicSBR; +- UCHAR +- numFlushedFrames; /* The variable counts the number of frames which are +- flushed consecutively. */ +- +- UINT flags; +-}; +- +-H_ALLOC_MEM(Ram_SbrDecElement, SBR_DECODER_ELEMENT) +-H_ALLOC_MEM(Ram_SbrDecChannel, SBR_CHANNEL) +-H_ALLOC_MEM(Ram_SbrDecoder, struct SBR_DECODER_INSTANCE) +- +-H_ALLOC_MEM(Ram_sbr_QmfStatesSynthesis, FIXP_QSS) +-H_ALLOC_MEM(Ram_sbr_OverlapBuffer, FIXP_DBL) +- +-H_ALLOC_MEM(Ram_sbr_HBEOverlapBuffer, FIXP_DBL) +- +-H_ALLOC_MEM(Ram_ps_dec, PS_DEC) +- +-#endif /* SBR_RAM_H */ +diff --git a/libSBRdec/src/sbr_rom.cpp b/libSBRdec/src/sbr_rom.cpp +deleted file mode 100644 +index 8a6688a..0000000 +--- a/libSBRdec/src/sbr_rom.cpp ++++ /dev/null +@@ -1,1705 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Definition of constant tables +- +- This module contains most of the constant data that can be stored in ROM. +-*/ +- +-#include "sbr_rom.h" +- +-/*! +- \name StartStopBands +- \brief Start and stop subbands of the highband. +- +- k_o = startMin + offset[bs_start_freq]; +- startMin = {3000,4000,5000} * (128/FS_sbr) / FS_sbr < 32Khz, 32Khz <= FS_sbr < +- 64KHz, 64KHz <= FS_sbr The stop subband can also be calculated to save memory +- by defining #CALC_STOP_BAND. +-*/ +-//@{ +-/* tables were created with ../addon/octave/sbr_start_freq_table.m */ +-const UCHAR FDK_sbrDecoder_sbr_start_freq_16[][16] = { +- {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, +- {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_22[][16] = { +- {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 30}, +- {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_24[][16] = { +- {11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 29, 32}, +- {3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 21, 24}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_32[][16] = { +- {10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 29, 32}, +- {2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 21, 24}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_40[][16] = { +- {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 28, 30, 32}, +- {5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 21, 23, 25}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_44[][16] = { +- {8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 28, 32}, +- {2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 22, 26}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_48[][16] = { +- {7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 31}, +- {1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 21, 25}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_64[][16] = { +- {6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 26, 30}, +- {1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 21, 25}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_88[][16] = { +- {5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 23, 27, 31}, +- {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 20, 24, 28}}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_192[16] = { +- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 19, 23, 27}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_176[16] = { +- 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 20, 24, 28}; +-const UCHAR FDK_sbrDecoder_sbr_start_freq_128[16] = { +- 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 21, 25}; +- +-//@} +- +-/*! +- \name Whitening +- \brief Coefficients for spectral whitening in the transposer +-*/ +-//@{ +-/*! Assignment of whitening tuning depending on the crossover frequency */ +-const USHORT FDK_sbrDecoder_sbr_whFactorsIndex[NUM_WHFACTOR_TABLE_ENTRIES] = { +- 0, 5000, 6000, 6500, 7000, 7500, 8000, 9000, 10000}; +- +-/*! +- \brief Whithening levels tuning table +- +- With the current tuning, there are some redundant entries: +- +- \li NUM_WHFACTOR_TABLE_ENTRIES can be reduced by 3, +- \li the first coloumn can be eliminated. +- +-*/ +-const FIXP_DBL +- FDK_sbrDecoder_sbr_whFactorsTable[NUM_WHFACTOR_TABLE_ENTRIES][6] = { +- /* OFF_LEVEL, TRANSITION_LEVEL, LOW_LEVEL, MID_LEVEL, HIGH_LEVEL */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* < 5000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 5000 < 6000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 6000 < 6500 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 6500 < 7000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 7000 < 7500 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 7500 < 8000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 8000 < 9000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 9000 < 10000 */ +- {FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), +- FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* > 10000 */ +-}; +- +-//@} +- +-/*! +- \name EnvAdj +- \brief Constants and tables used for envelope adjustment +-*/ +-//@{ +- +-/*! Mantissas of gain limits */ +-const FIXP_SGL FDK_sbrDecoder_sbr_limGains_m[4] = { +- FL2FXCONST_SGL(0.5011932025f), /*!< -3 dB. Gain limit when limiterGains in +- frameData is 0 */ +- FL2FXCONST_SGL( +- 0.5f), /*!< 0 dB. Gain limit when limiterGains in frameData is 1 */ +- FL2FXCONST_SGL(0.9976346258f), /*!< +3 dB. Gain limit when limiterGains in +- frameData is 2 */ +- FL2FXCONST_SGL(0.6776263578f) /*!< Inf. Gain limit when limiterGains in +- frameData is 3 */ +-}; +- +-/*! Exponents of gain limits */ +-const UCHAR FDK_sbrDecoder_sbr_limGains_e[4] = {0, 1, 1, 67}; +- +-/*! Constants for calculating the number of limiter bands */ +-const FIXP_SGL FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4[4] = { +- FL2FXCONST_SGL(1.0f / 4.0f), FL2FXCONST_SGL(1.2f / 4.0f), +- FL2FXCONST_SGL(2.0f / 4.0f), FL2FXCONST_SGL(3.0f / 4.0f)}; +- +-/*! Constants for calculating the number of limiter bands */ +-const FIXP_DBL FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4_DBL[4] = { +- FL2FXCONST_DBL(1.0f / 4.0f), FL2FXCONST_DBL(1.2f / 4.0f), +- FL2FXCONST_DBL(2.0f / 4.0f), FL2FXCONST_DBL(3.0f / 4.0f)}; +- +-/*! Ratio of old gains and noise levels for the first 4 timeslots of an envelope +- */ +-const FIXP_SGL FDK_sbrDecoder_sbr_smoothFilter[4] = { +- FL2FXCONST_SGL(0.66666666666666f), FL2FXCONST_SGL(0.36516383427084f), +- FL2FXCONST_SGL(0.14699433520835f), FL2FXCONST_SGL(0.03183050093751f)}; +- +-/*! Real and imaginary part of random noise which will be modulated +- to the desired level. An accuracy of 13 bits is sufficient for these +- random numbers. +-*/ +-const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2] = { +- {FL2FXCONST_SGL(-0.99948153278296f / 8.0), +- FL2FXCONST_SGL(-0.59483417516607f / 8.0)}, +- {FL2FXCONST_SGL(0.97113454393991f / 8.0), +- FL2FXCONST_SGL(-0.67528515225647f / 8.0)}, +- {FL2FXCONST_SGL(0.14130051758487f / 8.0), +- FL2FXCONST_SGL(-0.95090983575689f / 8.0)}, +- {FL2FXCONST_SGL(-0.47005496701697f / 8.0), +- FL2FXCONST_SGL(-0.37340549728647f / 8.0)}, +- {FL2FXCONST_SGL(0.80705063769351f / 8.0), +- FL2FXCONST_SGL(0.29653668284408f / 8.0)}, +- {FL2FXCONST_SGL(-0.38981478896926f / 8.0), +- FL2FXCONST_SGL(0.89572605717087f / 8.0)}, +- {FL2FXCONST_SGL(-0.01053049862020f / 8.0), +- FL2FXCONST_SGL(-0.66959058036166f / 8.0)}, +- {FL2FXCONST_SGL(-0.91266367957293f / 8.0), +- FL2FXCONST_SGL(-0.11522938140034f / 8.0)}, +- {FL2FXCONST_SGL(0.54840422910309f / 8.0), +- FL2FXCONST_SGL(0.75221367176302f / 8.0)}, +- {FL2FXCONST_SGL(0.40009252867955f / 8.0), +- FL2FXCONST_SGL(-0.98929400334421f / 8.0)}, +- {FL2FXCONST_SGL(-0.99867974711855f / 8.0), +- FL2FXCONST_SGL(-0.88147068645358f / 8.0)}, +- {FL2FXCONST_SGL(-0.95531076805040f / 8.0), +- FL2FXCONST_SGL(0.90908757154593f / 8.0)}, +- {FL2FXCONST_SGL(-0.45725933317144f / 8.0), +- FL2FXCONST_SGL(-0.56716323646760f / 8.0)}, +- {FL2FXCONST_SGL(-0.72929675029275f / 8.0), +- FL2FXCONST_SGL(-0.98008272727324f / 8.0)}, +- {FL2FXCONST_SGL(0.75622801399036f / 8.0), +- FL2FXCONST_SGL(0.20950329995549f / 8.0)}, +- {FL2FXCONST_SGL(0.07069442601050f / 8.0), +- FL2FXCONST_SGL(-0.78247898470706f / 8.0)}, +- {FL2FXCONST_SGL(0.74496252926055f / 8.0), +- FL2FXCONST_SGL(-0.91169004445807f / 8.0)}, +- {FL2FXCONST_SGL(-0.96440182703856f / 8.0), +- FL2FXCONST_SGL(-0.94739918296622f / 8.0)}, +- {FL2FXCONST_SGL(0.30424629369539f / 8.0), +- FL2FXCONST_SGL(-0.49438267012479f / 8.0)}, +- {FL2FXCONST_SGL(0.66565033746925f / 8.0), +- FL2FXCONST_SGL(0.64652935542491f / 8.0)}, +- {FL2FXCONST_SGL(0.91697008020594f / 8.0), +- FL2FXCONST_SGL(0.17514097332009f / 8.0)}, +- {FL2FXCONST_SGL(-0.70774918760427f / 8.0), +- FL2FXCONST_SGL(0.52548653416543f / 8.0)}, +- {FL2FXCONST_SGL(-0.70051415345560f / 8.0), +- FL2FXCONST_SGL(-0.45340028808763f / 8.0)}, +- {FL2FXCONST_SGL(-0.99496513054797f / 8.0), +- FL2FXCONST_SGL(-0.90071908066973f / 8.0)}, +- {FL2FXCONST_SGL(0.98164490790123f / 8.0), +- FL2FXCONST_SGL(-0.77463155528697f / 8.0)}, +- {FL2FXCONST_SGL(-0.54671580548181f / 8.0), +- FL2FXCONST_SGL(-0.02570928536004f / 8.0)}, +- {FL2FXCONST_SGL(-0.01689629065389f / 8.0), +- FL2FXCONST_SGL(0.00287506445732f / 8.0)}, +- {FL2FXCONST_SGL(-0.86110349531986f / 8.0), +- FL2FXCONST_SGL(0.42548583726477f / 8.0)}, +- {FL2FXCONST_SGL(-0.98892980586032f / 8.0), +- FL2FXCONST_SGL(-0.87881132267556f / 8.0)}, +- {FL2FXCONST_SGL(0.51756627678691f / 8.0), +- FL2FXCONST_SGL(0.66926784710139f / 8.0)}, +- {FL2FXCONST_SGL(-0.99635026409640f / 8.0), +- FL2FXCONST_SGL(-0.58107730574765f / 8.0)}, +- {FL2FXCONST_SGL(-0.99969370862163f / 8.0), +- FL2FXCONST_SGL(0.98369989360250f / 8.0)}, +- {FL2FXCONST_SGL(0.55266258627194f / 8.0), +- FL2FXCONST_SGL(0.59449057465591f / 8.0)}, +- {FL2FXCONST_SGL(0.34581177741673f / 8.0), +- FL2FXCONST_SGL(0.94879421061866f / 8.0)}, +- {FL2FXCONST_SGL(0.62664209577999f / 8.0), +- FL2FXCONST_SGL(-0.74402970906471f / 8.0)}, +- {FL2FXCONST_SGL(-0.77149701404973f / 8.0), +- FL2FXCONST_SGL(-0.33883658042801f / 8.0)}, +- {FL2FXCONST_SGL(-0.91592244254432f / 8.0), +- FL2FXCONST_SGL(0.03687901376713f / 8.0)}, +- {FL2FXCONST_SGL(-0.76285492357887f / 8.0), +- FL2FXCONST_SGL(-0.91371867919124f / 8.0)}, +- {FL2FXCONST_SGL(0.79788337195331f / 8.0), +- FL2FXCONST_SGL(-0.93180971199849f / 8.0)}, +- {FL2FXCONST_SGL(0.54473080610200f / 8.0), +- FL2FXCONST_SGL(-0.11919206037186f / 8.0)}, +- {FL2FXCONST_SGL(-0.85639281671058f / 8.0), +- FL2FXCONST_SGL(0.42429854760451f / 8.0)}, +- {FL2FXCONST_SGL(-0.92882402971423f / 8.0), +- FL2FXCONST_SGL(0.27871809078609f / 8.0)}, +- {FL2FXCONST_SGL(-0.11708371046774f / 8.0), +- FL2FXCONST_SGL(-0.99800843444966f / 8.0)}, +- {FL2FXCONST_SGL(0.21356749817493f / 8.0), +- FL2FXCONST_SGL(-0.90716295627033f / 8.0)}, +- {FL2FXCONST_SGL(-0.76191692573909f / 8.0), +- FL2FXCONST_SGL(0.99768118356265f / 8.0)}, +- {FL2FXCONST_SGL(0.98111043100884f / 8.0), +- FL2FXCONST_SGL(-0.95854459734407f / 8.0)}, +- {FL2FXCONST_SGL(-0.85913269895572f / 8.0), +- FL2FXCONST_SGL(0.95766566168880f / 8.0)}, +- {FL2FXCONST_SGL(-0.93307242253692f / 8.0), +- FL2FXCONST_SGL(0.49431757696466f / 8.0)}, +- {FL2FXCONST_SGL(0.30485754879632f / 8.0), +- FL2FXCONST_SGL(-0.70540034357529f / 8.0)}, +- {FL2FXCONST_SGL(0.85289650925190f / 8.0), +- FL2FXCONST_SGL(0.46766131791044f / 8.0)}, +- {FL2FXCONST_SGL(0.91328082618125f / 8.0), +- FL2FXCONST_SGL(-0.99839597361769f / 8.0)}, +- {FL2FXCONST_SGL(-0.05890199924154f / 8.0), +- FL2FXCONST_SGL(0.70741827819497f / 8.0)}, +- {FL2FXCONST_SGL(0.28398686150148f / 8.0), +- FL2FXCONST_SGL(0.34633555702188f / 8.0)}, +- {FL2FXCONST_SGL(0.95258164539612f / 8.0), +- FL2FXCONST_SGL(-0.54893416026939f / 8.0)}, +- {FL2FXCONST_SGL(-0.78566324168507f / 8.0), +- FL2FXCONST_SGL(-0.75568541079691f / 8.0)}, +- {FL2FXCONST_SGL(-0.95789495447877f / 8.0), +- FL2FXCONST_SGL(-0.20423194696966f / 8.0)}, +- {FL2FXCONST_SGL(0.82411158711197f / 8.0), +- FL2FXCONST_SGL(0.96654618432562f / 8.0)}, +- {FL2FXCONST_SGL(-0.65185446735885f / 8.0), +- FL2FXCONST_SGL(-0.88734990773289f / 8.0)}, +- {FL2FXCONST_SGL(-0.93643603134666f / 8.0), +- FL2FXCONST_SGL(0.99870790442385f / 8.0)}, +- {FL2FXCONST_SGL(0.91427159529618f / 8.0), +- FL2FXCONST_SGL(-0.98290505544444f / 8.0)}, +- {FL2FXCONST_SGL(-0.70395684036886f / 8.0), +- FL2FXCONST_SGL(0.58796798221039f / 8.0)}, +- {FL2FXCONST_SGL(0.00563771969365f / 8.0), +- FL2FXCONST_SGL(0.61768196727244f / 8.0)}, +- {FL2FXCONST_SGL(0.89065051931895f / 8.0), +- FL2FXCONST_SGL(0.52783352697585f / 8.0)}, +- {FL2FXCONST_SGL(-0.68683707712762f / 8.0), +- FL2FXCONST_SGL(0.80806944710339f / 8.0)}, +- {FL2FXCONST_SGL(0.72165342518718f / 8.0), +- FL2FXCONST_SGL(-0.69259857349564f / 8.0)}, +- {FL2FXCONST_SGL(-0.62928247730667f / 8.0), +- FL2FXCONST_SGL(0.13627037407335f / 8.0)}, +- {FL2FXCONST_SGL(0.29938434065514f / 8.0), +- FL2FXCONST_SGL(-0.46051329682246f / 8.0)}, +- {FL2FXCONST_SGL(-0.91781958879280f / 8.0), +- FL2FXCONST_SGL(-0.74012716684186f / 8.0)}, +- {FL2FXCONST_SGL(0.99298717043688f / 8.0), +- FL2FXCONST_SGL(0.40816610075661f / 8.0)}, +- {FL2FXCONST_SGL(0.82368298622748f / 8.0), +- FL2FXCONST_SGL(-0.74036047190173f / 8.0)}, +- {FL2FXCONST_SGL(-0.98512833386833f / 8.0), +- FL2FXCONST_SGL(-0.99972330709594f / 8.0)}, +- {FL2FXCONST_SGL(-0.95915368242257f / 8.0), +- FL2FXCONST_SGL(-0.99237800466040f / 8.0)}, +- {FL2FXCONST_SGL(-0.21411126572790f / 8.0), +- FL2FXCONST_SGL(-0.93424819052545f / 8.0)}, +- {FL2FXCONST_SGL(-0.68821476106884f / 8.0), +- FL2FXCONST_SGL(-0.26892306315457f / 8.0)}, +- {FL2FXCONST_SGL(0.91851997982317f / 8.0), +- FL2FXCONST_SGL(0.09358228901785f / 8.0)}, +- {FL2FXCONST_SGL(-0.96062769559127f / 8.0), +- FL2FXCONST_SGL(0.36099095133739f / 8.0)}, +- {FL2FXCONST_SGL(0.51646184922287f / 8.0), +- FL2FXCONST_SGL(-0.71373332873917f / 8.0)}, +- {FL2FXCONST_SGL(0.61130721139669f / 8.0), +- FL2FXCONST_SGL(0.46950141175917f / 8.0)}, +- {FL2FXCONST_SGL(0.47336129371299f / 8.0), +- FL2FXCONST_SGL(-0.27333178296162f / 8.0)}, +- {FL2FXCONST_SGL(0.90998308703519f / 8.0), +- FL2FXCONST_SGL(0.96715662938132f / 8.0)}, +- {FL2FXCONST_SGL(0.44844799194357f / 8.0), +- FL2FXCONST_SGL(0.99211574628306f / 8.0)}, +- {FL2FXCONST_SGL(0.66614891079092f / 8.0), +- FL2FXCONST_SGL(0.96590176169121f / 8.0)}, +- {FL2FXCONST_SGL(0.74922239129237f / 8.0), +- FL2FXCONST_SGL(-0.89879858826087f / 8.0)}, +- {FL2FXCONST_SGL(-0.99571588506485f / 8.0), +- FL2FXCONST_SGL(0.52785521494349f / 8.0)}, +- {FL2FXCONST_SGL(0.97401082477563f / 8.0), +- FL2FXCONST_SGL(-0.16855870075190f / 8.0)}, +- {FL2FXCONST_SGL(0.72683747733879f / 8.0), +- FL2FXCONST_SGL(-0.48060774432251f / 8.0)}, +- {FL2FXCONST_SGL(0.95432193457128f / 8.0), +- FL2FXCONST_SGL(0.68849603408441f / 8.0)}, +- {FL2FXCONST_SGL(-0.72962208425191f / 8.0), +- FL2FXCONST_SGL(-0.76608443420917f / 8.0)}, +- {FL2FXCONST_SGL(-0.85359479233537f / 8.0), +- FL2FXCONST_SGL(0.88738125901579f / 8.0)}, +- {FL2FXCONST_SGL(-0.81412430338535f / 8.0), +- FL2FXCONST_SGL(-0.97480768049637f / 8.0)}, +- {FL2FXCONST_SGL(-0.87930772356786f / 8.0), +- FL2FXCONST_SGL(0.74748307690436f / 8.0)}, +- {FL2FXCONST_SGL(-0.71573331064977f / 8.0), +- FL2FXCONST_SGL(-0.98570608178923f / 8.0)}, +- {FL2FXCONST_SGL(0.83524300028228f / 8.0), +- FL2FXCONST_SGL(0.83702537075163f / 8.0)}, +- {FL2FXCONST_SGL(-0.48086065601423f / 8.0), +- FL2FXCONST_SGL(-0.98848504923531f / 8.0)}, +- {FL2FXCONST_SGL(0.97139128574778f / 8.0), +- FL2FXCONST_SGL(0.80093621198236f / 8.0)}, +- {FL2FXCONST_SGL(0.51992825347895f / 8.0), +- FL2FXCONST_SGL(0.80247631400510f / 8.0)}, +- {FL2FXCONST_SGL(-0.00848591195325f / 8.0), +- FL2FXCONST_SGL(-0.76670128000486f / 8.0)}, +- {FL2FXCONST_SGL(-0.70294374303036f / 8.0), +- FL2FXCONST_SGL(0.55359910445577f / 8.0)}, +- {FL2FXCONST_SGL(-0.95894428168140f / 8.0), +- FL2FXCONST_SGL(-0.43265504344783f / 8.0)}, +- {FL2FXCONST_SGL(0.97079252950321f / 8.0), +- FL2FXCONST_SGL(0.09325857238682f / 8.0)}, +- {FL2FXCONST_SGL(-0.92404293670797f / 8.0), +- FL2FXCONST_SGL(0.85507704027855f / 8.0)}, +- {FL2FXCONST_SGL(-0.69506469500450f / 8.0), +- FL2FXCONST_SGL(0.98633412625459f / 8.0)}, +- {FL2FXCONST_SGL(0.26559203620024f / 8.0), +- FL2FXCONST_SGL(0.73314307966524f / 8.0)}, +- {FL2FXCONST_SGL(0.28038443336943f / 8.0), +- FL2FXCONST_SGL(0.14537913654427f / 8.0)}, +- {FL2FXCONST_SGL(-0.74138124825523f / 8.0), +- FL2FXCONST_SGL(0.99310339807762f / 8.0)}, +- {FL2FXCONST_SGL(-0.01752795995444f / 8.0), +- FL2FXCONST_SGL(-0.82616635284178f / 8.0)}, +- {FL2FXCONST_SGL(-0.55126773094930f / 8.0), +- FL2FXCONST_SGL(-0.98898543862153f / 8.0)}, +- {FL2FXCONST_SGL(0.97960898850996f / 8.0), +- FL2FXCONST_SGL(-0.94021446752851f / 8.0)}, +- {FL2FXCONST_SGL(-0.99196309146936f / 8.0), +- FL2FXCONST_SGL(0.67019017358456f / 8.0)}, +- {FL2FXCONST_SGL(-0.67684928085260f / 8.0), +- FL2FXCONST_SGL(0.12631491649378f / 8.0)}, +- {FL2FXCONST_SGL(0.09140039465500f / 8.0), +- FL2FXCONST_SGL(-0.20537731453108f / 8.0)}, +- {FL2FXCONST_SGL(-0.71658965751996f / 8.0), +- FL2FXCONST_SGL(-0.97788200391224f / 8.0)}, +- {FL2FXCONST_SGL(0.81014640078925f / 8.0), +- FL2FXCONST_SGL(0.53722648362443f / 8.0)}, +- {FL2FXCONST_SGL(0.40616991671205f / 8.0), +- FL2FXCONST_SGL(-0.26469008598449f / 8.0)}, +- {FL2FXCONST_SGL(-0.67680188682972f / 8.0), +- FL2FXCONST_SGL(0.94502052337695f / 8.0)}, +- {FL2FXCONST_SGL(0.86849774348749f / 8.0), +- FL2FXCONST_SGL(-0.18333598647899f / 8.0)}, +- {FL2FXCONST_SGL(-0.99500381284851f / 8.0), +- FL2FXCONST_SGL(-0.02634122068550f / 8.0)}, +- {FL2FXCONST_SGL(0.84329189340667f / 8.0), +- FL2FXCONST_SGL(0.10406957462213f / 8.0)}, +- {FL2FXCONST_SGL(-0.09215968531446f / 8.0), +- FL2FXCONST_SGL(0.69540012101253f / 8.0)}, +- {FL2FXCONST_SGL(0.99956173327206f / 8.0), +- FL2FXCONST_SGL(-0.12358542001404f / 8.0)}, +- {FL2FXCONST_SGL(-0.79732779473535f / 8.0), +- FL2FXCONST_SGL(-0.91582524736159f / 8.0)}, +- {FL2FXCONST_SGL(0.96349973642406f / 8.0), +- FL2FXCONST_SGL(0.96640458041000f / 8.0)}, +- {FL2FXCONST_SGL(-0.79942778496547f / 8.0), +- FL2FXCONST_SGL(0.64323902822857f / 8.0)}, +- {FL2FXCONST_SGL(-0.11566039853896f / 8.0), +- FL2FXCONST_SGL(0.28587846253726f / 8.0)}, +- {FL2FXCONST_SGL(-0.39922954514662f / 8.0), +- FL2FXCONST_SGL(0.94129601616966f / 8.0)}, +- {FL2FXCONST_SGL(0.99089197565987f / 8.0), +- FL2FXCONST_SGL(-0.92062625581587f / 8.0)}, +- {FL2FXCONST_SGL(0.28631285179909f / 8.0), +- FL2FXCONST_SGL(-0.91035047143603f / 8.0)}, +- {FL2FXCONST_SGL(-0.83302725605608f / 8.0), +- FL2FXCONST_SGL(-0.67330410892084f / 8.0)}, +- {FL2FXCONST_SGL(0.95404443402072f / 8.0), +- FL2FXCONST_SGL(0.49162765398743f / 8.0)}, +- {FL2FXCONST_SGL(-0.06449863579434f / 8.0), +- FL2FXCONST_SGL(0.03250560813135f / 8.0)}, +- {FL2FXCONST_SGL(-0.99575054486311f / 8.0), +- FL2FXCONST_SGL(0.42389784469507f / 8.0)}, +- {FL2FXCONST_SGL(-0.65501142790847f / 8.0), +- FL2FXCONST_SGL(0.82546114655624f / 8.0)}, +- {FL2FXCONST_SGL(-0.81254441908887f / 8.0), +- FL2FXCONST_SGL(-0.51627234660629f / 8.0)}, +- {FL2FXCONST_SGL(-0.99646369485481f / 8.0), +- FL2FXCONST_SGL(0.84490533520752f / 8.0)}, +- {FL2FXCONST_SGL(0.00287840603348f / 8.0), +- FL2FXCONST_SGL(0.64768261158166f / 8.0)}, +- {FL2FXCONST_SGL(0.70176989408455f / 8.0), +- FL2FXCONST_SGL(-0.20453028573322f / 8.0)}, +- {FL2FXCONST_SGL(0.96361882270190f / 8.0), +- FL2FXCONST_SGL(0.40706967140989f / 8.0)}, +- {FL2FXCONST_SGL(-0.68883758192426f / 8.0), +- FL2FXCONST_SGL(0.91338958840772f / 8.0)}, +- {FL2FXCONST_SGL(-0.34875585502238f / 8.0), +- FL2FXCONST_SGL(0.71472290693300f / 8.0)}, +- {FL2FXCONST_SGL(0.91980081243087f / 8.0), +- FL2FXCONST_SGL(0.66507455644919f / 8.0)}, +- {FL2FXCONST_SGL(-0.99009048343881f / 8.0), +- FL2FXCONST_SGL(0.85868021604848f / 8.0)}, +- {FL2FXCONST_SGL(0.68865791458395f / 8.0), +- FL2FXCONST_SGL(0.55660316809678f / 8.0)}, +- {FL2FXCONST_SGL(-0.99484402129368f / 8.0), +- FL2FXCONST_SGL(-0.20052559254934f / 8.0)}, +- {FL2FXCONST_SGL(0.94214511408023f / 8.0), +- FL2FXCONST_SGL(-0.99696425367461f / 8.0)}, +- {FL2FXCONST_SGL(-0.67414626793544f / 8.0), +- FL2FXCONST_SGL(0.49548221180078f / 8.0)}, +- {FL2FXCONST_SGL(-0.47339353684664f / 8.0), +- FL2FXCONST_SGL(-0.85904328834047f / 8.0)}, +- {FL2FXCONST_SGL(0.14323651387360f / 8.0), +- FL2FXCONST_SGL(-0.94145598222488f / 8.0)}, +- {FL2FXCONST_SGL(-0.29268293575672f / 8.0), +- FL2FXCONST_SGL(0.05759224927952f / 8.0)}, +- {FL2FXCONST_SGL(0.43793861458754f / 8.0), +- FL2FXCONST_SGL(-0.78904969892724f / 8.0)}, +- {FL2FXCONST_SGL(-0.36345126374441f / 8.0), +- FL2FXCONST_SGL(0.64874435357162f / 8.0)}, +- {FL2FXCONST_SGL(-0.08750604656825f / 8.0), +- FL2FXCONST_SGL(0.97686944362527f / 8.0)}, +- {FL2FXCONST_SGL(-0.96495267812511f / 8.0), +- FL2FXCONST_SGL(-0.53960305946511f / 8.0)}, +- {FL2FXCONST_SGL(0.55526940659947f / 8.0), +- FL2FXCONST_SGL(0.78891523734774f / 8.0)}, +- {FL2FXCONST_SGL(0.73538215752630f / 8.0), +- FL2FXCONST_SGL(0.96452072373404f / 8.0)}, +- {FL2FXCONST_SGL(-0.30889773919437f / 8.0), +- FL2FXCONST_SGL(-0.80664389776860f / 8.0)}, +- {FL2FXCONST_SGL(0.03574995626194f / 8.0), +- FL2FXCONST_SGL(-0.97325616900959f / 8.0)}, +- {FL2FXCONST_SGL(0.98720684660488f / 8.0), +- FL2FXCONST_SGL(0.48409133691962f / 8.0)}, +- {FL2FXCONST_SGL(-0.81689296271203f / 8.0), +- FL2FXCONST_SGL(-0.90827703628298f / 8.0)}, +- {FL2FXCONST_SGL(0.67866860118215f / 8.0), +- FL2FXCONST_SGL(0.81284503870856f / 8.0)}, +- {FL2FXCONST_SGL(-0.15808569732583f / 8.0), +- FL2FXCONST_SGL(0.85279555024382f / 8.0)}, +- {FL2FXCONST_SGL(0.80723395114371f / 8.0), +- FL2FXCONST_SGL(-0.24717418514605f / 8.0)}, +- {FL2FXCONST_SGL(0.47788757329038f / 8.0), +- FL2FXCONST_SGL(-0.46333147839295f / 8.0)}, +- {FL2FXCONST_SGL(0.96367554763201f / 8.0), +- FL2FXCONST_SGL(0.38486749303242f / 8.0)}, +- {FL2FXCONST_SGL(-0.99143875716818f / 8.0), +- FL2FXCONST_SGL(-0.24945277239809f / 8.0)}, +- {FL2FXCONST_SGL(0.83081876925833f / 8.0), +- FL2FXCONST_SGL(-0.94780851414763f / 8.0)}, +- {FL2FXCONST_SGL(-0.58753191905341f / 8.0), +- FL2FXCONST_SGL(0.01290772389163f / 8.0)}, +- {FL2FXCONST_SGL(0.95538108220960f / 8.0), +- FL2FXCONST_SGL(-0.85557052096538f / 8.0)}, +- {FL2FXCONST_SGL(-0.96490920476211f / 8.0), +- FL2FXCONST_SGL(-0.64020970923102f / 8.0)}, +- {FL2FXCONST_SGL(-0.97327101028521f / 8.0), +- FL2FXCONST_SGL(0.12378128133110f / 8.0)}, +- {FL2FXCONST_SGL(0.91400366022124f / 8.0), +- FL2FXCONST_SGL(0.57972471346930f / 8.0)}, +- {FL2FXCONST_SGL(-0.99925837363824f / 8.0), +- FL2FXCONST_SGL(0.71084847864067f / 8.0)}, +- {FL2FXCONST_SGL(-0.86875903507313f / 8.0), +- FL2FXCONST_SGL(-0.20291699203564f / 8.0)}, +- {FL2FXCONST_SGL(-0.26240034795124f / 8.0), +- FL2FXCONST_SGL(-0.68264554369108f / 8.0)}, +- {FL2FXCONST_SGL(-0.24664412953388f / 8.0), +- FL2FXCONST_SGL(-0.87642273115183f / 8.0)}, +- {FL2FXCONST_SGL(0.02416275806869f / 8.0), +- FL2FXCONST_SGL(0.27192914288905f / 8.0)}, +- {FL2FXCONST_SGL(0.82068619590515f / 8.0), +- FL2FXCONST_SGL(-0.85087787994476f / 8.0)}, +- {FL2FXCONST_SGL(0.88547373760759f / 8.0), +- FL2FXCONST_SGL(-0.89636802901469f / 8.0)}, +- {FL2FXCONST_SGL(-0.18173078152226f / 8.0), +- FL2FXCONST_SGL(-0.26152145156800f / 8.0)}, +- {FL2FXCONST_SGL(0.09355476558534f / 8.0), +- FL2FXCONST_SGL(0.54845123045604f / 8.0)}, +- {FL2FXCONST_SGL(-0.54668414224090f / 8.0), +- FL2FXCONST_SGL(0.95980774020221f / 8.0)}, +- {FL2FXCONST_SGL(0.37050990604091f / 8.0), +- FL2FXCONST_SGL(-0.59910140383171f / 8.0)}, +- {FL2FXCONST_SGL(-0.70373594262891f / 8.0), +- FL2FXCONST_SGL(0.91227665827081f / 8.0)}, +- {FL2FXCONST_SGL(-0.34600785879594f / 8.0), +- FL2FXCONST_SGL(-0.99441426144200f / 8.0)}, +- {FL2FXCONST_SGL(-0.68774481731008f / 8.0), +- FL2FXCONST_SGL(-0.30238837956299f / 8.0)}, +- {FL2FXCONST_SGL(-0.26843291251234f / 8.0), +- FL2FXCONST_SGL(0.83115668004362f / 8.0)}, +- {FL2FXCONST_SGL(0.49072334613242f / 8.0), +- FL2FXCONST_SGL(-0.45359708737775f / 8.0)}, +- {FL2FXCONST_SGL(0.38975993093975f / 8.0), +- FL2FXCONST_SGL(0.95515358099121f / 8.0)}, +- {FL2FXCONST_SGL(-0.97757125224150f / 8.0), +- FL2FXCONST_SGL(0.05305894580606f / 8.0)}, +- {FL2FXCONST_SGL(-0.17325552859616f / 8.0), +- FL2FXCONST_SGL(-0.92770672250494f / 8.0)}, +- {FL2FXCONST_SGL(0.99948035025744f / 8.0), +- FL2FXCONST_SGL(0.58285545563426f / 8.0)}, +- {FL2FXCONST_SGL(-0.64946246527458f / 8.0), +- FL2FXCONST_SGL(0.68645507104960f / 8.0)}, +- {FL2FXCONST_SGL(-0.12016920576437f / 8.0), +- FL2FXCONST_SGL(-0.57147322153312f / 8.0)}, +- {FL2FXCONST_SGL(-0.58947456517751f / 8.0), +- FL2FXCONST_SGL(-0.34847132454388f / 8.0)}, +- {FL2FXCONST_SGL(-0.41815140454465f / 8.0), +- FL2FXCONST_SGL(0.16276422358861f / 8.0)}, +- {FL2FXCONST_SGL(0.99885650204884f / 8.0), +- FL2FXCONST_SGL(0.11136095490444f / 8.0)}, +- {FL2FXCONST_SGL(-0.56649614128386f / 8.0), +- FL2FXCONST_SGL(-0.90494866361587f / 8.0)}, +- {FL2FXCONST_SGL(0.94138021032330f / 8.0), +- FL2FXCONST_SGL(0.35281916733018f / 8.0)}, +- {FL2FXCONST_SGL(-0.75725076534641f / 8.0), +- FL2FXCONST_SGL(0.53650549640587f / 8.0)}, +- {FL2FXCONST_SGL(0.20541973692630f / 8.0), +- FL2FXCONST_SGL(-0.94435144369918f / 8.0)}, +- {FL2FXCONST_SGL(0.99980371023351f / 8.0), +- FL2FXCONST_SGL(0.79835913565599f / 8.0)}, +- {FL2FXCONST_SGL(0.29078277605775f / 8.0), +- FL2FXCONST_SGL(0.35393777921520f / 8.0)}, +- {FL2FXCONST_SGL(-0.62858772103030f / 8.0), +- FL2FXCONST_SGL(0.38765693387102f / 8.0)}, +- {FL2FXCONST_SGL(0.43440904467688f / 8.0), +- FL2FXCONST_SGL(-0.98546330463232f / 8.0)}, +- {FL2FXCONST_SGL(-0.98298583762390f / 8.0), +- FL2FXCONST_SGL(0.21021524625209f / 8.0)}, +- {FL2FXCONST_SGL(0.19513029146934f / 8.0), +- FL2FXCONST_SGL(-0.94239832251867f / 8.0)}, +- {FL2FXCONST_SGL(-0.95476662400101f / 8.0), +- FL2FXCONST_SGL(0.98364554179143f / 8.0)}, +- {FL2FXCONST_SGL(0.93379635304810f / 8.0), +- FL2FXCONST_SGL(-0.70881994583682f / 8.0)}, +- {FL2FXCONST_SGL(-0.85235410573336f / 8.0), +- FL2FXCONST_SGL(-0.08342347966410f / 8.0)}, +- {FL2FXCONST_SGL(-0.86425093011245f / 8.0), +- FL2FXCONST_SGL(-0.45795025029466f / 8.0)}, +- {FL2FXCONST_SGL(0.38879779059045f / 8.0), +- FL2FXCONST_SGL(0.97274429344593f / 8.0)}, +- {FL2FXCONST_SGL(0.92045124735495f / 8.0), +- FL2FXCONST_SGL(-0.62433652524220f / 8.0)}, +- {FL2FXCONST_SGL(0.89162532251878f / 8.0), +- FL2FXCONST_SGL(0.54950955570563f / 8.0)}, +- {FL2FXCONST_SGL(-0.36834336949252f / 8.0), +- FL2FXCONST_SGL(0.96458298020975f / 8.0)}, +- {FL2FXCONST_SGL(0.93891760988045f / 8.0), +- FL2FXCONST_SGL(-0.89968353740388f / 8.0)}, +- {FL2FXCONST_SGL(0.99267657565094f / 8.0), +- FL2FXCONST_SGL(-0.03757034316958f / 8.0)}, +- {FL2FXCONST_SGL(-0.94063471614176f / 8.0), +- FL2FXCONST_SGL(0.41332338538963f / 8.0)}, +- {FL2FXCONST_SGL(0.99740224117019f / 8.0), +- FL2FXCONST_SGL(-0.16830494996370f / 8.0)}, +- {FL2FXCONST_SGL(-0.35899413170555f / 8.0), +- FL2FXCONST_SGL(-0.46633226649613f / 8.0)}, +- {FL2FXCONST_SGL(0.05237237274947f / 8.0), +- FL2FXCONST_SGL(-0.25640361602661f / 8.0)}, +- {FL2FXCONST_SGL(0.36703583957424f / 8.0), +- FL2FXCONST_SGL(-0.38653265641875f / 8.0)}, +- {FL2FXCONST_SGL(0.91653180367913f / 8.0), +- FL2FXCONST_SGL(-0.30587628726597f / 8.0)}, +- {FL2FXCONST_SGL(0.69000803499316f / 8.0), +- FL2FXCONST_SGL(0.90952171386132f / 8.0)}, +- {FL2FXCONST_SGL(-0.38658751133527f / 8.0), +- FL2FXCONST_SGL(0.99501571208985f / 8.0)}, +- {FL2FXCONST_SGL(-0.29250814029851f / 8.0), +- FL2FXCONST_SGL(0.37444994344615f / 8.0)}, +- {FL2FXCONST_SGL(-0.60182204677608f / 8.0), +- FL2FXCONST_SGL(0.86779651036123f / 8.0)}, +- {FL2FXCONST_SGL(-0.97418588163217f / 8.0), +- FL2FXCONST_SGL(0.96468523666475f / 8.0)}, +- {FL2FXCONST_SGL(0.88461574003963f / 8.0), +- FL2FXCONST_SGL(0.57508405276414f / 8.0)}, +- {FL2FXCONST_SGL(0.05198933055162f / 8.0), +- FL2FXCONST_SGL(0.21269661669964f / 8.0)}, +- {FL2FXCONST_SGL(-0.53499621979720f / 8.0), +- FL2FXCONST_SGL(0.97241553731237f / 8.0)}, +- {FL2FXCONST_SGL(-0.49429560226497f / 8.0), +- FL2FXCONST_SGL(0.98183865291903f / 8.0)}, +- {FL2FXCONST_SGL(-0.98935142339139f / 8.0), +- FL2FXCONST_SGL(-0.40249159006933f / 8.0)}, +- {FL2FXCONST_SGL(-0.98081380091130f / 8.0), +- FL2FXCONST_SGL(-0.72856895534041f / 8.0)}, +- {FL2FXCONST_SGL(-0.27338148835532f / 8.0), +- FL2FXCONST_SGL(0.99950922447209f / 8.0)}, +- {FL2FXCONST_SGL(0.06310802338302f / 8.0), +- FL2FXCONST_SGL(-0.54539587529618f / 8.0)}, +- {FL2FXCONST_SGL(-0.20461677199539f / 8.0), +- FL2FXCONST_SGL(-0.14209977628489f / 8.0)}, +- {FL2FXCONST_SGL(0.66223843141647f / 8.0), +- FL2FXCONST_SGL(0.72528579940326f / 8.0)}, +- {FL2FXCONST_SGL(-0.84764345483665f / 8.0), +- FL2FXCONST_SGL(0.02372316801261f / 8.0)}, +- {FL2FXCONST_SGL(-0.89039863483811f / 8.0), +- FL2FXCONST_SGL(0.88866581484602f / 8.0)}, +- {FL2FXCONST_SGL(0.95903308477986f / 8.0), +- FL2FXCONST_SGL(0.76744927173873f / 8.0)}, +- {FL2FXCONST_SGL(0.73504123909879f / 8.0), +- FL2FXCONST_SGL(-0.03747203173192f / 8.0)}, +- {FL2FXCONST_SGL(-0.31744434966056f / 8.0), +- FL2FXCONST_SGL(-0.36834111883652f / 8.0)}, +- {FL2FXCONST_SGL(-0.34110827591623f / 8.0), +- FL2FXCONST_SGL(0.40211222807691f / 8.0)}, +- {FL2FXCONST_SGL(0.47803883714199f / 8.0), +- FL2FXCONST_SGL(-0.39423219786288f / 8.0)}, +- {FL2FXCONST_SGL(0.98299195879514f / 8.0), +- FL2FXCONST_SGL(0.01989791390047f / 8.0)}, +- {FL2FXCONST_SGL(-0.30963073129751f / 8.0), +- FL2FXCONST_SGL(-0.18076720599336f / 8.0)}, +- {FL2FXCONST_SGL(0.99992588229018f / 8.0), +- FL2FXCONST_SGL(-0.26281872094289f / 8.0)}, +- {FL2FXCONST_SGL(-0.93149731080767f / 8.0), +- FL2FXCONST_SGL(-0.98313162570490f / 8.0)}, +- {FL2FXCONST_SGL(0.99923472302773f / 8.0), +- FL2FXCONST_SGL(-0.80142993767554f / 8.0)}, +- {FL2FXCONST_SGL(-0.26024169633417f / 8.0), +- FL2FXCONST_SGL(-0.75999759855752f / 8.0)}, +- {FL2FXCONST_SGL(-0.35712514743563f / 8.0), +- FL2FXCONST_SGL(0.19298963768574f / 8.0)}, +- {FL2FXCONST_SGL(-0.99899084509530f / 8.0), +- FL2FXCONST_SGL(0.74645156992493f / 8.0)}, +- {FL2FXCONST_SGL(0.86557171579452f / 8.0), +- FL2FXCONST_SGL(0.55593866696299f / 8.0)}, +- {FL2FXCONST_SGL(0.33408042438752f / 8.0), +- FL2FXCONST_SGL(0.86185953874709f / 8.0)}, +- {FL2FXCONST_SGL(0.99010736374716f / 8.0), +- FL2FXCONST_SGL(0.04602397576623f / 8.0)}, +- {FL2FXCONST_SGL(-0.66694269691195f / 8.0), +- FL2FXCONST_SGL(-0.91643611810148f / 8.0)}, +- {FL2FXCONST_SGL(0.64016792079480f / 8.0), +- FL2FXCONST_SGL(0.15649530836856f / 8.0)}, +- {FL2FXCONST_SGL(0.99570534804836f / 8.0), +- FL2FXCONST_SGL(0.45844586038111f / 8.0)}, +- {FL2FXCONST_SGL(-0.63431466947340f / 8.0), +- FL2FXCONST_SGL(0.21079116459234f / 8.0)}, +- {FL2FXCONST_SGL(-0.07706847005931f / 8.0), +- FL2FXCONST_SGL(-0.89581437101329f / 8.0)}, +- {FL2FXCONST_SGL(0.98590090577724f / 8.0), +- FL2FXCONST_SGL(0.88241721133981f / 8.0)}, +- {FL2FXCONST_SGL(0.80099335254678f / 8.0), +- FL2FXCONST_SGL(-0.36851896710853f / 8.0)}, +- {FL2FXCONST_SGL(0.78368131392666f / 8.0), +- FL2FXCONST_SGL(0.45506999802597f / 8.0)}, +- {FL2FXCONST_SGL(0.08707806671691f / 8.0), +- FL2FXCONST_SGL(0.80938994918745f / 8.0)}, +- {FL2FXCONST_SGL(-0.86811883080712f / 8.0), +- FL2FXCONST_SGL(0.39347308654705f / 8.0)}, +- {FL2FXCONST_SGL(-0.39466529740375f / 8.0), +- FL2FXCONST_SGL(-0.66809432114456f / 8.0)}, +- {FL2FXCONST_SGL(0.97875325649683f / 8.0), +- FL2FXCONST_SGL(-0.72467840967746f / 8.0)}, +- {FL2FXCONST_SGL(-0.95038560288864f / 8.0), +- FL2FXCONST_SGL(0.89563219587625f / 8.0)}, +- {FL2FXCONST_SGL(0.17005239424212f / 8.0), +- FL2FXCONST_SGL(0.54683053962658f / 8.0)}, +- {FL2FXCONST_SGL(-0.76910792026848f / 8.0), +- FL2FXCONST_SGL(-0.96226617549298f / 8.0)}, +- {FL2FXCONST_SGL(0.99743281016846f / 8.0), +- FL2FXCONST_SGL(0.42697157037567f / 8.0)}, +- {FL2FXCONST_SGL(0.95437383549973f / 8.0), +- FL2FXCONST_SGL(0.97002324109952f / 8.0)}, +- {FL2FXCONST_SGL(0.99578905365569f / 8.0), +- FL2FXCONST_SGL(-0.54106826257356f / 8.0)}, +- {FL2FXCONST_SGL(0.28058259829990f / 8.0), +- FL2FXCONST_SGL(-0.85361420634036f / 8.0)}, +- {FL2FXCONST_SGL(0.85256524470573f / 8.0), +- FL2FXCONST_SGL(-0.64567607735589f / 8.0)}, +- {FL2FXCONST_SGL(-0.50608540105128f / 8.0), +- FL2FXCONST_SGL(-0.65846015480300f / 8.0)}, +- {FL2FXCONST_SGL(-0.97210735183243f / 8.0), +- FL2FXCONST_SGL(-0.23095213067791f / 8.0)}, +- {FL2FXCONST_SGL(0.95424048234441f / 8.0), +- FL2FXCONST_SGL(-0.99240147091219f / 8.0)}, +- {FL2FXCONST_SGL(-0.96926570524023f / 8.0), +- FL2FXCONST_SGL(0.73775654896574f / 8.0)}, +- {FL2FXCONST_SGL(0.30872163214726f / 8.0), +- FL2FXCONST_SGL(0.41514960556126f / 8.0)}, +- {FL2FXCONST_SGL(-0.24523839572639f / 8.0), +- FL2FXCONST_SGL(0.63206633394807f / 8.0)}, +- {FL2FXCONST_SGL(-0.33813265086024f / 8.0), +- FL2FXCONST_SGL(-0.38661779441897f / 8.0)}, +- {FL2FXCONST_SGL(-0.05826828420146f / 8.0), +- FL2FXCONST_SGL(-0.06940774188029f / 8.0)}, +- {FL2FXCONST_SGL(-0.22898461455054f / 8.0), +- FL2FXCONST_SGL(0.97054853316316f / 8.0)}, +- {FL2FXCONST_SGL(-0.18509915019881f / 8.0), +- FL2FXCONST_SGL(0.47565762892084f / 8.0)}, +- {FL2FXCONST_SGL(-0.10488238045009f / 8.0), +- FL2FXCONST_SGL(-0.87769947402394f / 8.0)}, +- {FL2FXCONST_SGL(-0.71886586182037f / 8.0), +- FL2FXCONST_SGL(0.78030982480538f / 8.0)}, +- {FL2FXCONST_SGL(0.99793873738654f / 8.0), +- FL2FXCONST_SGL(0.90041310491497f / 8.0)}, +- {FL2FXCONST_SGL(0.57563307626120f / 8.0), +- FL2FXCONST_SGL(-0.91034337352097f / 8.0)}, +- {FL2FXCONST_SGL(0.28909646383717f / 8.0), +- FL2FXCONST_SGL(0.96307783970534f / 8.0)}, +- {FL2FXCONST_SGL(0.42188998312520f / 8.0), +- FL2FXCONST_SGL(0.48148651230437f / 8.0)}, +- {FL2FXCONST_SGL(0.93335049681047f / 8.0), +- FL2FXCONST_SGL(-0.43537023883588f / 8.0)}, +- {FL2FXCONST_SGL(-0.97087374418267f / 8.0), +- FL2FXCONST_SGL(0.86636445711364f / 8.0)}, +- {FL2FXCONST_SGL(0.36722871286923f / 8.0), +- FL2FXCONST_SGL(0.65291654172961f / 8.0)}, +- {FL2FXCONST_SGL(-0.81093025665696f / 8.0), +- FL2FXCONST_SGL(0.08778370229363f / 8.0)}, +- {FL2FXCONST_SGL(-0.26240603062237f / 8.0), +- FL2FXCONST_SGL(-0.92774095379098f / 8.0)}, +- {FL2FXCONST_SGL(0.83996497984604f / 8.0), +- FL2FXCONST_SGL(0.55839849139647f / 8.0)}, +- {FL2FXCONST_SGL(-0.99909615720225f / 8.0), +- FL2FXCONST_SGL(-0.96024605713970f / 8.0)}, +- {FL2FXCONST_SGL(0.74649464155061f / 8.0), +- FL2FXCONST_SGL(0.12144893606462f / 8.0)}, +- {FL2FXCONST_SGL(-0.74774595569805f / 8.0), +- FL2FXCONST_SGL(-0.26898062008959f / 8.0)}, +- {FL2FXCONST_SGL(0.95781667469567f / 8.0), +- FL2FXCONST_SGL(-0.79047927052628f / 8.0)}, +- {FL2FXCONST_SGL(0.95472308713099f / 8.0), +- FL2FXCONST_SGL(-0.08588776019550f / 8.0)}, +- {FL2FXCONST_SGL(0.48708332746299f / 8.0), +- FL2FXCONST_SGL(0.99999041579432f / 8.0)}, +- {FL2FXCONST_SGL(0.46332038247497f / 8.0), +- FL2FXCONST_SGL(0.10964126185063f / 8.0)}, +- {FL2FXCONST_SGL(-0.76497004940162f / 8.0), +- FL2FXCONST_SGL(0.89210929242238f / 8.0)}, +- {FL2FXCONST_SGL(0.57397389364339f / 8.0), +- FL2FXCONST_SGL(0.35289703373760f / 8.0)}, +- {FL2FXCONST_SGL(0.75374316974495f / 8.0), +- FL2FXCONST_SGL(0.96705214651335f / 8.0)}, +- {FL2FXCONST_SGL(-0.59174397685714f / 8.0), +- FL2FXCONST_SGL(-0.89405370422752f / 8.0)}, +- {FL2FXCONST_SGL(0.75087906691890f / 8.0), +- FL2FXCONST_SGL(-0.29612672982396f / 8.0)}, +- {FL2FXCONST_SGL(-0.98607857336230f / 8.0), +- FL2FXCONST_SGL(0.25034911730023f / 8.0)}, +- {FL2FXCONST_SGL(-0.40761056640505f / 8.0), +- FL2FXCONST_SGL(-0.90045573444695f / 8.0)}, +- {FL2FXCONST_SGL(0.66929266740477f / 8.0), +- FL2FXCONST_SGL(0.98629493401748f / 8.0)}, +- {FL2FXCONST_SGL(-0.97463695257310f / 8.0), +- FL2FXCONST_SGL(-0.00190223301301f / 8.0)}, +- {FL2FXCONST_SGL(0.90145509409859f / 8.0), +- FL2FXCONST_SGL(0.99781390365446f / 8.0)}, +- {FL2FXCONST_SGL(-0.87259289048043f / 8.0), +- FL2FXCONST_SGL(0.99233587353666f / 8.0)}, +- {FL2FXCONST_SGL(-0.91529461447692f / 8.0), +- FL2FXCONST_SGL(-0.15698707534206f / 8.0)}, +- {FL2FXCONST_SGL(-0.03305738840705f / 8.0), +- FL2FXCONST_SGL(-0.37205262859764f / 8.0)}, +- {FL2FXCONST_SGL(0.07223051368337f / 8.0), +- FL2FXCONST_SGL(-0.88805001733626f / 8.0)}, +- {FL2FXCONST_SGL(0.99498012188353f / 8.0), +- FL2FXCONST_SGL(0.97094358113387f / 8.0)}, +- {FL2FXCONST_SGL(-0.74904939500519f / 8.0), +- FL2FXCONST_SGL(0.99985483641521f / 8.0)}, +- {FL2FXCONST_SGL(0.04585228574211f / 8.0), +- FL2FXCONST_SGL(0.99812337444082f / 8.0)}, +- {FL2FXCONST_SGL(-0.89054954257993f / 8.0), +- FL2FXCONST_SGL(-0.31791913188064f / 8.0)}, +- {FL2FXCONST_SGL(-0.83782144651251f / 8.0), +- FL2FXCONST_SGL(0.97637632547466f / 8.0)}, +- {FL2FXCONST_SGL(0.33454804933804f / 8.0), +- FL2FXCONST_SGL(-0.86231516800408f / 8.0)}, +- {FL2FXCONST_SGL(-0.99707579362824f / 8.0), +- FL2FXCONST_SGL(0.93237990079441f / 8.0)}, +- {FL2FXCONST_SGL(-0.22827527843994f / 8.0), +- FL2FXCONST_SGL(0.18874759397997f / 8.0)}, +- {FL2FXCONST_SGL(0.67248046289143f / 8.0), +- FL2FXCONST_SGL(-0.03646211390569f / 8.0)}, +- {FL2FXCONST_SGL(-0.05146538187944f / 8.0), +- FL2FXCONST_SGL(-0.92599700120679f / 8.0)}, +- {FL2FXCONST_SGL(0.99947295749905f / 8.0), +- FL2FXCONST_SGL(0.93625229707912f / 8.0)}, +- {FL2FXCONST_SGL(0.66951124390363f / 8.0), +- FL2FXCONST_SGL(0.98905825623893f / 8.0)}, +- {FL2FXCONST_SGL(-0.99602956559179f / 8.0), +- FL2FXCONST_SGL(-0.44654715757688f / 8.0)}, +- {FL2FXCONST_SGL(0.82104905483590f / 8.0), +- FL2FXCONST_SGL(0.99540741724928f / 8.0)}, +- {FL2FXCONST_SGL(0.99186510988782f / 8.0), +- FL2FXCONST_SGL(0.72023001312947f / 8.0)}, +- {FL2FXCONST_SGL(-0.65284592392918f / 8.0), +- FL2FXCONST_SGL(0.52186723253637f / 8.0)}, +- {FL2FXCONST_SGL(0.93885443798188f / 8.0), +- FL2FXCONST_SGL(-0.74895312615259f / 8.0)}, +- {FL2FXCONST_SGL(0.96735248738388f / 8.0), +- FL2FXCONST_SGL(0.90891816978629f / 8.0)}, +- {FL2FXCONST_SGL(-0.22225968841114f / 8.0), +- FL2FXCONST_SGL(0.57124029781228f / 8.0)}, +- {FL2FXCONST_SGL(-0.44132783753414f / 8.0), +- FL2FXCONST_SGL(-0.92688840659280f / 8.0)}, +- {FL2FXCONST_SGL(-0.85694974219574f / 8.0), +- FL2FXCONST_SGL(0.88844532719844f / 8.0)}, +- {FL2FXCONST_SGL(0.91783042091762f / 8.0), +- FL2FXCONST_SGL(-0.46356892383970f / 8.0)}, +- {FL2FXCONST_SGL(0.72556974415690f / 8.0), +- FL2FXCONST_SGL(-0.99899555770747f / 8.0)}, +- {FL2FXCONST_SGL(-0.99711581834508f / 8.0), +- FL2FXCONST_SGL(0.58211560180426f / 8.0)}, +- {FL2FXCONST_SGL(0.77638976371966f / 8.0), +- FL2FXCONST_SGL(0.94321834873819f / 8.0)}, +- {FL2FXCONST_SGL(0.07717324253925f / 8.0), +- FL2FXCONST_SGL(0.58638399856595f / 8.0)}, +- {FL2FXCONST_SGL(-0.56049829194163f / 8.0), +- FL2FXCONST_SGL(0.82522301569036f / 8.0)}, +- {FL2FXCONST_SGL(0.98398893639988f / 8.0), +- FL2FXCONST_SGL(0.39467440420569f / 8.0)}, +- {FL2FXCONST_SGL(0.47546946844938f / 8.0), +- FL2FXCONST_SGL(0.68613044836811f / 8.0)}, +- {FL2FXCONST_SGL(0.65675089314631f / 8.0), +- FL2FXCONST_SGL(0.18331637134880f / 8.0)}, +- {FL2FXCONST_SGL(0.03273375457980f / 8.0), +- FL2FXCONST_SGL(-0.74933109564108f / 8.0)}, +- {FL2FXCONST_SGL(-0.38684144784738f / 8.0), +- FL2FXCONST_SGL(0.51337349030406f / 8.0)}, +- {FL2FXCONST_SGL(-0.97346267944545f / 8.0), +- FL2FXCONST_SGL(-0.96549364384098f / 8.0)}, +- {FL2FXCONST_SGL(-0.53282156061942f / 8.0), +- FL2FXCONST_SGL(-0.91423265091354f / 8.0)}, +- {FL2FXCONST_SGL(0.99817310731176f / 8.0), +- FL2FXCONST_SGL(0.61133572482148f / 8.0)}, +- {FL2FXCONST_SGL(-0.50254500772635f / 8.0), +- FL2FXCONST_SGL(-0.88829338134294f / 8.0)}, +- {FL2FXCONST_SGL(0.01995873238855f / 8.0), +- FL2FXCONST_SGL(0.85223515096765f / 8.0)}, +- {FL2FXCONST_SGL(0.99930381973804f / 8.0), +- FL2FXCONST_SGL(0.94578896296649f / 8.0)}, +- {FL2FXCONST_SGL(0.82907767600783f / 8.0), +- FL2FXCONST_SGL(-0.06323442598128f / 8.0)}, +- {FL2FXCONST_SGL(-0.58660709669728f / 8.0), +- FL2FXCONST_SGL(0.96840773806582f / 8.0)}, +- {FL2FXCONST_SGL(-0.17573736667267f / 8.0), +- FL2FXCONST_SGL(-0.48166920859485f / 8.0)}, +- {FL2FXCONST_SGL(0.83434292401346f / 8.0), +- FL2FXCONST_SGL(-0.13023450646997f / 8.0)}, +- {FL2FXCONST_SGL(0.05946491307025f / 8.0), +- FL2FXCONST_SGL(0.20511047074866f / 8.0)}, +- {FL2FXCONST_SGL(0.81505484574602f / 8.0), +- FL2FXCONST_SGL(-0.94685947861369f / 8.0)}, +- {FL2FXCONST_SGL(-0.44976380954860f / 8.0), +- FL2FXCONST_SGL(0.40894572671545f / 8.0)}, +- {FL2FXCONST_SGL(-0.89746474625671f / 8.0), +- FL2FXCONST_SGL(0.99846578838537f / 8.0)}, +- {FL2FXCONST_SGL(0.39677256130792f / 8.0), +- FL2FXCONST_SGL(-0.74854668609359f / 8.0)}, +- {FL2FXCONST_SGL(-0.07588948563079f / 8.0), +- FL2FXCONST_SGL(0.74096214084170f / 8.0)}, +- {FL2FXCONST_SGL(0.76343198951445f / 8.0), +- FL2FXCONST_SGL(0.41746629422634f / 8.0)}, +- {FL2FXCONST_SGL(-0.74490104699626f / 8.0), +- FL2FXCONST_SGL(0.94725911744610f / 8.0)}, +- {FL2FXCONST_SGL(0.64880119792759f / 8.0), +- FL2FXCONST_SGL(0.41336660830571f / 8.0)}, +- {FL2FXCONST_SGL(0.62319537462542f / 8.0), +- FL2FXCONST_SGL(-0.93098313552599f / 8.0)}, +- {FL2FXCONST_SGL(0.42215817594807f / 8.0), +- FL2FXCONST_SGL(-0.07712787385208f / 8.0)}, +- {FL2FXCONST_SGL(0.02704554141885f / 8.0), +- FL2FXCONST_SGL(-0.05417518053666f / 8.0)}, +- {FL2FXCONST_SGL(0.80001773566818f / 8.0), +- FL2FXCONST_SGL(0.91542195141039f / 8.0)}, +- {FL2FXCONST_SGL(-0.79351832348816f / 8.0), +- FL2FXCONST_SGL(-0.36208897989136f / 8.0)}, +- {FL2FXCONST_SGL(0.63872359151636f / 8.0), +- FL2FXCONST_SGL(0.08128252493444f / 8.0)}, +- {FL2FXCONST_SGL(0.52890520960295f / 8.0), +- FL2FXCONST_SGL(0.60048872455592f / 8.0)}, +- {FL2FXCONST_SGL(0.74238552914587f / 8.0), +- FL2FXCONST_SGL(0.04491915291044f / 8.0)}, +- {FL2FXCONST_SGL(0.99096131449250f / 8.0), +- FL2FXCONST_SGL(-0.19451182854402f / 8.0)}, +- {FL2FXCONST_SGL(-0.80412329643109f / 8.0), +- FL2FXCONST_SGL(-0.88513818199457f / 8.0)}, +- {FL2FXCONST_SGL(-0.64612616129736f / 8.0), +- FL2FXCONST_SGL(0.72198674804544f / 8.0)}, +- {FL2FXCONST_SGL(0.11657770663191f / 8.0), +- FL2FXCONST_SGL(-0.83662833815041f / 8.0)}, +- {FL2FXCONST_SGL(-0.95053182488101f / 8.0), +- FL2FXCONST_SGL(-0.96939905138082f / 8.0)}, +- {FL2FXCONST_SGL(-0.62228872928622f / 8.0), +- FL2FXCONST_SGL(0.82767262846661f / 8.0)}, +- {FL2FXCONST_SGL(0.03004475787316f / 8.0), +- FL2FXCONST_SGL(-0.99738896333384f / 8.0)}, +- {FL2FXCONST_SGL(-0.97987214341034f / 8.0), +- FL2FXCONST_SGL(0.36526129686425f / 8.0)}, +- {FL2FXCONST_SGL(-0.99986980746200f / 8.0), +- FL2FXCONST_SGL(-0.36021610299715f / 8.0)}, +- {FL2FXCONST_SGL(0.89110648599879f / 8.0), +- FL2FXCONST_SGL(-0.97894250343044f / 8.0)}, +- {FL2FXCONST_SGL(0.10407960510582f / 8.0), +- FL2FXCONST_SGL(0.77357793811619f / 8.0)}, +- {FL2FXCONST_SGL(0.95964737821728f / 8.0), +- FL2FXCONST_SGL(-0.35435818285502f / 8.0)}, +- {FL2FXCONST_SGL(0.50843233159162f / 8.0), +- FL2FXCONST_SGL(0.96107691266205f / 8.0)}, +- {FL2FXCONST_SGL(0.17006334670615f / 8.0), +- FL2FXCONST_SGL(-0.76854025314829f / 8.0)}, +- {FL2FXCONST_SGL(0.25872675063360f / 8.0), +- FL2FXCONST_SGL(0.99893303933816f / 8.0)}, +- {FL2FXCONST_SGL(-0.01115998681937f / 8.0), +- FL2FXCONST_SGL(0.98496019742444f / 8.0)}, +- {FL2FXCONST_SGL(-0.79598702973261f / 8.0), +- FL2FXCONST_SGL(0.97138411318894f / 8.0)}, +- {FL2FXCONST_SGL(-0.99264708948101f / 8.0), +- FL2FXCONST_SGL(-0.99542822402536f / 8.0)}, +- {FL2FXCONST_SGL(-0.99829663752818f / 8.0), +- FL2FXCONST_SGL(0.01877138824311f / 8.0)}, +- {FL2FXCONST_SGL(-0.70801016548184f / 8.0), +- FL2FXCONST_SGL(0.33680685948117f / 8.0)}, +- {FL2FXCONST_SGL(-0.70467057786826f / 8.0), +- FL2FXCONST_SGL(0.93272777501857f / 8.0)}, +- {FL2FXCONST_SGL(0.99846021905254f / 8.0), +- FL2FXCONST_SGL(-0.98725746254433f / 8.0)}, +- {FL2FXCONST_SGL(-0.63364968534650f / 8.0), +- FL2FXCONST_SGL(-0.16473594423746f / 8.0)}, +- {FL2FXCONST_SGL(-0.16258217500792f / 8.0), +- FL2FXCONST_SGL(-0.95939125400802f / 8.0)}, +- {FL2FXCONST_SGL(-0.43645594360633f / 8.0), +- FL2FXCONST_SGL(-0.94805030113284f / 8.0)}, +- {FL2FXCONST_SGL(-0.99848471702976f / 8.0), +- FL2FXCONST_SGL(0.96245166923809f / 8.0)}, +- {FL2FXCONST_SGL(-0.16796458968998f / 8.0), +- FL2FXCONST_SGL(-0.98987511890470f / 8.0)}, +- {FL2FXCONST_SGL(-0.87979225745213f / 8.0), +- FL2FXCONST_SGL(-0.71725725041680f / 8.0)}, +- {FL2FXCONST_SGL(0.44183099021786f / 8.0), +- FL2FXCONST_SGL(-0.93568974498761f / 8.0)}, +- {FL2FXCONST_SGL(0.93310180125532f / 8.0), +- FL2FXCONST_SGL(-0.99913308068246f / 8.0)}, +- {FL2FXCONST_SGL(-0.93941931782002f / 8.0), +- FL2FXCONST_SGL(-0.56409379640356f / 8.0)}, +- {FL2FXCONST_SGL(-0.88590003188677f / 8.0), +- FL2FXCONST_SGL(0.47624600491382f / 8.0)}, +- {FL2FXCONST_SGL(0.99971463703691f / 8.0), +- FL2FXCONST_SGL(-0.83889954253462f / 8.0)}, +- {FL2FXCONST_SGL(-0.75376385639978f / 8.0), +- FL2FXCONST_SGL(0.00814643438625f / 8.0)}, +- {FL2FXCONST_SGL(0.93887685615875f / 8.0), +- FL2FXCONST_SGL(-0.11284528204636f / 8.0)}, +- {FL2FXCONST_SGL(0.85126435782309f / 8.0), +- FL2FXCONST_SGL(0.52349251543547f / 8.0)}, +- {FL2FXCONST_SGL(0.39701421446381f / 8.0), +- FL2FXCONST_SGL(0.81779634174316f / 8.0)}, +- {FL2FXCONST_SGL(-0.37024464187437f / 8.0), +- FL2FXCONST_SGL(-0.87071656222959f / 8.0)}, +- {FL2FXCONST_SGL(-0.36024828242896f / 8.0), +- FL2FXCONST_SGL(0.34655735648287f / 8.0)}, +- {FL2FXCONST_SGL(-0.93388812549209f / 8.0), +- FL2FXCONST_SGL(-0.84476541096429f / 8.0)}, +- {FL2FXCONST_SGL(-0.65298804552119f / 8.0), +- FL2FXCONST_SGL(-0.18439575450921f / 8.0)}, +- {FL2FXCONST_SGL(0.11960319006843f / 8.0), +- FL2FXCONST_SGL(0.99899346780168f / 8.0)}, +- {FL2FXCONST_SGL(0.94292565553160f / 8.0), +- FL2FXCONST_SGL(0.83163906518293f / 8.0)}, +- {FL2FXCONST_SGL(0.75081145286948f / 8.0), +- FL2FXCONST_SGL(-0.35533223142265f / 8.0)}, +- {FL2FXCONST_SGL(0.56721979748394f / 8.0), +- FL2FXCONST_SGL(-0.24076836414499f / 8.0)}, +- {FL2FXCONST_SGL(0.46857766746029f / 8.0), +- FL2FXCONST_SGL(-0.30140233457198f / 8.0)}, +- {FL2FXCONST_SGL(0.97312313923635f / 8.0), +- FL2FXCONST_SGL(-0.99548191630031f / 8.0)}, +- {FL2FXCONST_SGL(-0.38299976567017f / 8.0), +- FL2FXCONST_SGL(0.98516909715427f / 8.0)}, +- {FL2FXCONST_SGL(0.41025800019463f / 8.0), +- FL2FXCONST_SGL(0.02116736935734f / 8.0)}, +- {FL2FXCONST_SGL(0.09638062008048f / 8.0), +- FL2FXCONST_SGL(0.04411984381457f / 8.0)}, +- {FL2FXCONST_SGL(-0.85283249275397f / 8.0), +- FL2FXCONST_SGL(0.91475563922421f / 8.0)}, +- {FL2FXCONST_SGL(0.88866808958124f / 8.0), +- FL2FXCONST_SGL(-0.99735267083226f / 8.0)}, +- {FL2FXCONST_SGL(-0.48202429536989f / 8.0), +- FL2FXCONST_SGL(-0.96805608884164f / 8.0)}, +- {FL2FXCONST_SGL(0.27572582416567f / 8.0), +- FL2FXCONST_SGL(0.58634753335832f / 8.0)}, +- {FL2FXCONST_SGL(-0.65889129659168f / 8.0), +- FL2FXCONST_SGL(0.58835634138583f / 8.0)}, +- {FL2FXCONST_SGL(0.98838086953732f / 8.0), +- FL2FXCONST_SGL(0.99994349600236f / 8.0)}, +- {FL2FXCONST_SGL(-0.20651349620689f / 8.0), +- FL2FXCONST_SGL(0.54593044066355f / 8.0)}, +- {FL2FXCONST_SGL(-0.62126416356920f / 8.0), +- FL2FXCONST_SGL(-0.59893681700392f / 8.0)}, +- {FL2FXCONST_SGL(0.20320105410437f / 8.0), +- FL2FXCONST_SGL(-0.86879180355289f / 8.0)}, +- {FL2FXCONST_SGL(-0.97790548600584f / 8.0), +- FL2FXCONST_SGL(0.96290806999242f / 8.0)}, +- {FL2FXCONST_SGL(0.11112534735126f / 8.0), +- FL2FXCONST_SGL(0.21484763313301f / 8.0)}, +- {FL2FXCONST_SGL(-0.41368337314182f / 8.0), +- FL2FXCONST_SGL(0.28216837680365f / 8.0)}, +- {FL2FXCONST_SGL(0.24133038992960f / 8.0), +- FL2FXCONST_SGL(0.51294362630238f / 8.0)}, +- {FL2FXCONST_SGL(-0.66393410674885f / 8.0), +- FL2FXCONST_SGL(-0.08249679629081f / 8.0)}, +- {FL2FXCONST_SGL(-0.53697829178752f / 8.0), +- FL2FXCONST_SGL(-0.97649903936228f / 8.0)}, +- {FL2FXCONST_SGL(-0.97224737889348f / 8.0), +- FL2FXCONST_SGL(0.22081333579837f / 8.0)}, +- {FL2FXCONST_SGL(0.87392477144549f / 8.0), +- FL2FXCONST_SGL(-0.12796173740361f / 8.0)}, +- {FL2FXCONST_SGL(0.19050361015753f / 8.0), +- FL2FXCONST_SGL(0.01602615387195f / 8.0)}, +- {FL2FXCONST_SGL(-0.46353441212724f / 8.0), +- FL2FXCONST_SGL(-0.95249041539006f / 8.0)}, +- {FL2FXCONST_SGL(-0.07064096339021f / 8.0), +- FL2FXCONST_SGL(-0.94479803205886f / 8.0)}, +- {FL2FXCONST_SGL(-0.92444085484466f / 8.0), +- FL2FXCONST_SGL(-0.10457590187436f / 8.0)}, +- {FL2FXCONST_SGL(-0.83822593578728f / 8.0), +- FL2FXCONST_SGL(-0.01695043208885f / 8.0)}, +- {FL2FXCONST_SGL(0.75214681811150f / 8.0), +- FL2FXCONST_SGL(-0.99955681042665f / 8.0)}, +- {FL2FXCONST_SGL(-0.42102998829339f / 8.0), +- FL2FXCONST_SGL(0.99720941999394f / 8.0)}, +- {FL2FXCONST_SGL(-0.72094786237696f / 8.0), +- FL2FXCONST_SGL(-0.35008961934255f / 8.0)}, +- {FL2FXCONST_SGL(0.78843311019251f / 8.0), +- FL2FXCONST_SGL(0.52851398958271f / 8.0)}, +- {FL2FXCONST_SGL(0.97394027897442f / 8.0), +- FL2FXCONST_SGL(-0.26695944086561f / 8.0)}, +- {FL2FXCONST_SGL(0.99206463477946f / 8.0), +- FL2FXCONST_SGL(-0.57010120849429f / 8.0)}, +- {FL2FXCONST_SGL(0.76789609461795f / 8.0), +- FL2FXCONST_SGL(-0.76519356730966f / 8.0)}, +- {FL2FXCONST_SGL(-0.82002421836409f / 8.0), +- FL2FXCONST_SGL(-0.73530179553767f / 8.0)}, +- {FL2FXCONST_SGL(0.81924990025724f / 8.0), +- FL2FXCONST_SGL(0.99698425250579f / 8.0)}, +- {FL2FXCONST_SGL(-0.26719850873357f / 8.0), +- FL2FXCONST_SGL(0.68903369776193f / 8.0)}, +- {FL2FXCONST_SGL(-0.43311260380975f / 8.0), +- FL2FXCONST_SGL(0.85321815947490f / 8.0)}, +- {FL2FXCONST_SGL(0.99194979673836f / 8.0), +- FL2FXCONST_SGL(0.91876249766422f / 8.0)}, +- {FL2FXCONST_SGL(-0.80692001248487f / 8.0), +- FL2FXCONST_SGL(-0.32627540663214f / 8.0)}, +- {FL2FXCONST_SGL(0.43080003649976f / 8.0), +- FL2FXCONST_SGL(-0.21919095636638f / 8.0)}, +- {FL2FXCONST_SGL(0.67709491937357f / 8.0), +- FL2FXCONST_SGL(-0.95478075822906f / 8.0)}, +- {FL2FXCONST_SGL(0.56151770568316f / 8.0), +- FL2FXCONST_SGL(-0.70693811747778f / 8.0)}, +- {FL2FXCONST_SGL(0.10831862810749f / 8.0), +- FL2FXCONST_SGL(-0.08628837174592f / 8.0)}, +- {FL2FXCONST_SGL(0.91229417540436f / 8.0), +- FL2FXCONST_SGL(-0.65987351408410f / 8.0)}, +- {FL2FXCONST_SGL(-0.48972893932274f / 8.0), +- FL2FXCONST_SGL(0.56289246362686f / 8.0)}, +- {FL2FXCONST_SGL(-0.89033658689697f / 8.0), +- FL2FXCONST_SGL(-0.71656563987082f / 8.0)}, +- {FL2FXCONST_SGL(0.65269447475094f / 8.0), +- FL2FXCONST_SGL(0.65916004833932f / 8.0)}, +- {FL2FXCONST_SGL(0.67439478141121f / 8.0), +- FL2FXCONST_SGL(-0.81684380846796f / 8.0)}, +- {FL2FXCONST_SGL(-0.47770832416973f / 8.0), +- FL2FXCONST_SGL(-0.16789556203025f / 8.0)}, +- {FL2FXCONST_SGL(-0.99715979260878f / 8.0), +- FL2FXCONST_SGL(-0.93565784007648f / 8.0)}, +- {FL2FXCONST_SGL(-0.90889593602546f / 8.0), +- FL2FXCONST_SGL(0.62034397054380f / 8.0)}, +- {FL2FXCONST_SGL(-0.06618622548177f / 8.0), +- FL2FXCONST_SGL(-0.23812217221359f / 8.0)}, +- {FL2FXCONST_SGL(0.99430266919728f / 8.0), +- FL2FXCONST_SGL(0.18812555317553f / 8.0)}, +- {FL2FXCONST_SGL(0.97686402381843f / 8.0), +- FL2FXCONST_SGL(-0.28664534366620f / 8.0)}, +- {FL2FXCONST_SGL(0.94813650221268f / 8.0), +- FL2FXCONST_SGL(-0.97506640027128f / 8.0)}, +- {FL2FXCONST_SGL(-0.95434497492853f / 8.0), +- FL2FXCONST_SGL(-0.79607978501983f / 8.0)}, +- {FL2FXCONST_SGL(-0.49104783137150f / 8.0), +- FL2FXCONST_SGL(0.32895214359663f / 8.0)}, +- {FL2FXCONST_SGL(0.99881175120751f / 8.0), +- FL2FXCONST_SGL(0.88993983831354f / 8.0)}, +- {FL2FXCONST_SGL(0.50449166760303f / 8.0), +- FL2FXCONST_SGL(-0.85995072408434f / 8.0)}, +- {FL2FXCONST_SGL(0.47162891065108f / 8.0), +- FL2FXCONST_SGL(-0.18680204049569f / 8.0)}, +- {FL2FXCONST_SGL(-0.62081581361840f / 8.0), +- FL2FXCONST_SGL(0.75000676218956f / 8.0)}, +- {FL2FXCONST_SGL(-0.43867015250812f / 8.0), +- FL2FXCONST_SGL(0.99998069244322f / 8.0)}, +- {FL2FXCONST_SGL(0.98630563232075f / 8.0), +- FL2FXCONST_SGL(-0.53578899600662f / 8.0)}, +- {FL2FXCONST_SGL(-0.61510362277374f / 8.0), +- FL2FXCONST_SGL(-0.89515019899997f / 8.0)}, +- {FL2FXCONST_SGL(-0.03841517601843f / 8.0), +- FL2FXCONST_SGL(-0.69888815681179f / 8.0)}, +- {FL2FXCONST_SGL(-0.30102157304644f / 8.0), +- FL2FXCONST_SGL(-0.07667808922205f / 8.0)}, +- {FL2FXCONST_SGL(0.41881284182683f / 8.0), +- FL2FXCONST_SGL(0.02188098922282f / 8.0)}, +- {FL2FXCONST_SGL(-0.86135454941237f / 8.0), +- FL2FXCONST_SGL(0.98947480909359f / 8.0)}, +- {FL2FXCONST_SGL(0.67226861393788f / 8.0), +- FL2FXCONST_SGL(-0.13494389011014f / 8.0)}, +- {FL2FXCONST_SGL(-0.70737398842068f / 8.0), +- FL2FXCONST_SGL(-0.76547349325992f / 8.0)}, +- {FL2FXCONST_SGL(0.94044946687963f / 8.0), +- FL2FXCONST_SGL(0.09026201157416f / 8.0)}, +- {FL2FXCONST_SGL(-0.82386352534327f / 8.0), +- FL2FXCONST_SGL(0.08924768823676f / 8.0)}, +- {FL2FXCONST_SGL(-0.32070666698656f / 8.0), +- FL2FXCONST_SGL(0.50143421908753f / 8.0)}, +- {FL2FXCONST_SGL(0.57593163224487f / 8.0), +- FL2FXCONST_SGL(-0.98966422921509f / 8.0)}, +- {FL2FXCONST_SGL(-0.36326018419965f / 8.0), +- FL2FXCONST_SGL(0.07440243123228f / 8.0)}, +- {FL2FXCONST_SGL(0.99979044674350f / 8.0), +- FL2FXCONST_SGL(-0.14130287347405f / 8.0)}, +- {FL2FXCONST_SGL(-0.92366023326932f / 8.0), +- FL2FXCONST_SGL(-0.97979298068180f / 8.0)}, +- {FL2FXCONST_SGL(-0.44607178518598f / 8.0), +- FL2FXCONST_SGL(-0.54233252016394f / 8.0)}, +- {FL2FXCONST_SGL(0.44226800932956f / 8.0), +- FL2FXCONST_SGL(0.71326756742752f / 8.0)}, +- {FL2FXCONST_SGL(0.03671907158312f / 8.0), +- FL2FXCONST_SGL(0.63606389366675f / 8.0)}, +- {FL2FXCONST_SGL(0.52175424682195f / 8.0), +- FL2FXCONST_SGL(-0.85396826735705f / 8.0)}, +- {FL2FXCONST_SGL(-0.94701139690956f / 8.0), +- FL2FXCONST_SGL(-0.01826348194255f / 8.0)}, +- {FL2FXCONST_SGL(-0.98759606946049f / 8.0), +- FL2FXCONST_SGL(0.82288714303073f / 8.0)}, +- {FL2FXCONST_SGL(0.87434794743625f / 8.0), +- FL2FXCONST_SGL(0.89399495655433f / 8.0)}, +- {FL2FXCONST_SGL(-0.93412041758744f / 8.0), +- FL2FXCONST_SGL(0.41374052024363f / 8.0)}, +- {FL2FXCONST_SGL(0.96063943315511f / 8.0), +- FL2FXCONST_SGL(0.93116709541280f / 8.0)}, +- {FL2FXCONST_SGL(0.97534253457837f / 8.0), +- FL2FXCONST_SGL(0.86150930812689f / 8.0)}, +- {FL2FXCONST_SGL(0.99642466504163f / 8.0), +- FL2FXCONST_SGL(0.70190043427512f / 8.0)}, +- {FL2FXCONST_SGL(-0.94705089665984f / 8.0), +- FL2FXCONST_SGL(-0.29580042814306f / 8.0)}, +- {FL2FXCONST_SGL(0.91599807087376f / 8.0), +- FL2FXCONST_SGL(-0.98147830385781f / 8.0)}}; +-//@} +- +-/* +-static const FIXP_SGL harmonicPhase [2][4] = { +- { 1.0, 0.0, -1.0, 0.0}, +- { 0.0, 1.0, 0.0, -1.0} +-}; +-*/ +- +-/* tables for SBR and AAC LD */ +-/* table for 8 time slot index */ +-const int FDK_sbrDecoder_envelopeTable_8[8][5] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* borders from left to right side; -1 = not in use */ +- /*[|T-|------]*/ {2, 0, 0, 1, -1}, +- /*[|-T-|-----]*/ {2, 0, 0, 2, -1}, +- /*[--|T-|----]*/ {3, 1, 1, 2, 4}, +- /*[---|T-|---]*/ {3, 1, 1, 3, 5}, +- /*[----|T-|--]*/ {3, 1, 1, 4, 6}, +- /*[-----|T--|]*/ {2, 1, 1, 5, -1}, +- /*[------|T-|]*/ {2, 1, 1, 6, -1}, +- /*[-------|T|]*/ {2, 1, 1, 7, -1}, +-}; +- +-/* table for 15 time slot index */ +-const int FDK_sbrDecoder_envelopeTable_15[15][6] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* length from left to right side; -1 = not in use */ +- /*[|T---|------------]*/ {2, 0, 0, 4, -1, -1}, +- /*[|-T---|-----------]*/ {2, 0, 0, 5, -1, -1}, +- /*[|--|T---|---------]*/ {3, 1, 1, 2, 6, -1}, +- /*[|---|T---|--------]*/ {3, 1, 1, 3, 7, -1}, +- /*[|----|T---|-------]*/ {3, 1, 1, 4, 8, -1}, +- /*[|-----|T---|------]*/ {3, 1, 1, 5, 9, -1}, +- /*[|------|T---|-----]*/ {3, 1, 1, 6, 10, -1}, +- /*[|-------|T---|----]*/ {3, 1, 1, 7, 11, -1}, +- /*[|--------|T---|---]*/ {3, 1, 1, 8, 12, -1}, +- /*[|---------|T---|--]*/ {3, 1, 1, 9, 13, -1}, +- /*[|----------|T----|]*/ {2, 1, 1, 10, -1, -1}, +- /*[|-----------|T---|]*/ {2, 1, 1, 11, -1, -1}, +- /*[|------------|T--|]*/ {2, 1, 1, 12, -1, -1}, +- /*[|-------------|T-|]*/ {2, 1, 1, 13, -1, -1}, +- /*[|--------------|T|]*/ {2, 1, 1, 14, -1, -1}, +-}; +- +-/* table for 16 time slot index */ +-const int FDK_sbrDecoder_envelopeTable_16[16][6] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* length from left to right side; -1 = not in use */ +- /*[|T---|------------|]*/ {2, 0, 0, 4, -1, -1}, +- /*[|-T---|-----------|]*/ {2, 0, 0, 5, -1, -1}, +- /*[|--|T---|----------]*/ {3, 1, 1, 2, 6, -1}, +- /*[|---|T---|---------]*/ {3, 1, 1, 3, 7, -1}, +- /*[|----|T---|--------]*/ {3, 1, 1, 4, 8, -1}, +- /*[|-----|T---|-------]*/ {3, 1, 1, 5, 9, -1}, +- /*[|------|T---|------]*/ {3, 1, 1, 6, 10, -1}, +- /*[|-------|T---|-----]*/ {3, 1, 1, 7, 11, -1}, +- /*[|--------|T---|----]*/ {3, 1, 1, 8, 12, -1}, +- /*[|---------|T---|---]*/ {3, 1, 1, 9, 13, -1}, +- /*[|----------|T---|--]*/ {3, 1, 1, 10, 14, -1}, +- /*[|-----------|T----|]*/ {2, 1, 1, 11, -1, -1}, +- /*[|------------|T---|]*/ {2, 1, 1, 12, -1, -1}, +- /*[|-------------|T--|]*/ {2, 1, 1, 13, -1, -1}, +- /*[|--------------|T-|]*/ {2, 1, 1, 14, -1, -1}, +- /*[|---------------|T|]*/ {2, 1, 1, 15, -1, -1}, +-}; +- +-/*! +- \name FrameInfoDefaults +- +- Predefined envelope positions for the FIX-FIX case (static framing) +-*/ +-//@{ +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_15 = { +- 0, 1, {0, 15, 0, 0, 0, 0}, {1, 0, 0, 0, 0}, -1, 1, {0, 15, 0}, {0, 0, 0}, +- 0, 0}; +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_15 = { +- 0, 2, {0, 8, 15, 0, 0, 0}, {1, 1, 0, 0, 0}, -1, 2, {0, 8, 15}, {0, 0, 0}, +- 0, 0}; +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_15 = { +- 0, 4, {0, 4, 8, 12, 15, 0}, {1, 1, 1, 1, 0}, -1, 2, {0, 8, 15}, {0, 0, 0}, +- 0, 0}; +-#if (MAX_ENVELOPES >= 8) +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_15 = { +- 0, +- 8, +- {0, 2, 4, 6, 8, 10, 12, 14, 15}, +- {1, 1, 1, 1, 1, 1, 1, 1}, +- -1, +- 2, +- {0, 8, 15}, +- {0, 0, 0}, +- 0, +- 0}; +-#endif +- +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_16 = { +- 0, 1, {0, 16, 0, 0, 0, 0}, {1, 0, 0, 0, 0}, -1, 1, {0, 16, 0}, {0, 0, 0}, +- 0, 0}; +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_16 = { +- 0, 2, {0, 8, 16, 0, 0, 0}, {1, 1, 0, 0, 0}, -1, 2, {0, 8, 16}, {0, 0, 0}, +- 0, 0}; +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_16 = { +- 0, 4, {0, 4, 8, 12, 16, 0}, {1, 1, 1, 1, 0}, -1, 2, {0, 8, 16}, {0, 0, 0}, +- 0, 0}; +- +-#if (MAX_ENVELOPES >= 8) +-const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_16 = { +- 0, +- 8, +- {0, 2, 4, 6, 8, 10, 12, 14, 16}, +- {1, 1, 1, 1, 1, 1, 1, 1}, +- -1, +- 2, +- {0, 8, 16}, +- {0, 0, 0}, +- 0, +- 0}; +-#endif +- +-//@} +- +-/*! +- \name SBR_HuffmanTables +- +- SBR Huffman Table Overview: \n +- \n +- o envelope level, 1.5 dB: \n +- 1) sbr_huffBook_EnvLevel10T[120][2] \n +- 2) sbr_huffBook_EnvLevel10F[120][2] \n +- \n +- o envelope balance, 1.5 dB: \n +- 3) sbr_huffBook_EnvBalance10T[48][2] \n +- 4) sbr_huffBook_EnvBalance10F[48][2] \n +- \n +- o envelope level, 3.0 dB: \n +- 5) sbr_huffBook_EnvLevel11T[62][2] \n +- 6) sbr_huffBook_EnvLevel11F[62][2] \n +- \n +- o envelope balance, 3.0 dB: \n +- 7) sbr_huffBook_EnvBalance11T[24][2] \n +- 8) sbr_huffBook_EnvBalance11F[24][2] \n +- \n +- o noise level, 3.0 dB: \n +- 9) sbr_huffBook_NoiseLevel11T[62][2] \n +- -) (sbr_huffBook_EnvLevel11F[62][2] is used for freq dir)\n +- \n +- o noise balance, 3.0 dB: \n +- 10) sbr_huffBook_NoiseBalance11T[24][2]\n +- -) (sbr_huffBook_EnvBalance11F[24][2] is used for freq dir)\n +- \n +- (1.5 dB is never used for noise) +- +-*/ +-//@{ +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10T[120][2] = { +- {1, 2}, {-64, -65}, {3, 4}, {-63, -66}, {5, 6}, +- {-62, -67}, {7, 8}, {-61, -68}, {9, 10}, {-60, -69}, +- {11, 12}, {-59, -70}, {13, 14}, {-58, -71}, {15, 16}, +- {-57, -72}, {17, 18}, {-73, -56}, {19, 21}, {-74, 20}, +- {-55, -75}, {22, 26}, {23, 24}, {-54, -76}, {-77, 25}, +- {-53, -78}, {27, 34}, {28, 29}, {-52, -79}, {30, 31}, +- {-80, -51}, {32, 33}, {-83, -82}, {-81, -50}, {35, 57}, +- {36, 40}, {37, 38}, {-88, -84}, {-48, 39}, {-90, -85}, +- {41, 46}, {42, 43}, {-49, -87}, {44, 45}, {-89, -86}, +- {-124, -123}, {47, 50}, {48, 49}, {-122, -121}, {-120, -119}, +- {51, 54}, {52, 53}, {-118, -117}, {-116, -115}, {55, 56}, +- {-114, -113}, {-112, -111}, {58, 89}, {59, 74}, {60, 67}, +- {61, 64}, {62, 63}, {-110, -109}, {-108, -107}, {65, 66}, +- {-106, -105}, {-104, -103}, {68, 71}, {69, 70}, {-102, -101}, +- {-100, -99}, {72, 73}, {-98, -97}, {-96, -95}, {75, 82}, +- {76, 79}, {77, 78}, {-94, -93}, {-92, -91}, {80, 81}, +- {-47, -46}, {-45, -44}, {83, 86}, {84, 85}, {-43, -42}, +- {-41, -40}, {87, 88}, {-39, -38}, {-37, -36}, {90, 105}, +- {91, 98}, {92, 95}, {93, 94}, {-35, -34}, {-33, -32}, +- {96, 97}, {-31, -30}, {-29, -28}, {99, 102}, {100, 101}, +- {-27, -26}, {-25, -24}, {103, 104}, {-23, -22}, {-21, -20}, +- {106, 113}, {107, 110}, {108, 109}, {-19, -18}, {-17, -16}, +- {111, 112}, {-15, -14}, {-13, -12}, {114, 117}, {115, 116}, +- {-11, -10}, {-9, -8}, {118, 119}, {-7, -6}, {-5, -4}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10F[120][2] = { +- {1, 2}, {-64, -65}, {3, 4}, {-63, -66}, {5, 6}, +- {-67, -62}, {7, 8}, {-68, -61}, {9, 10}, {-69, -60}, +- {11, 13}, {-70, 12}, {-59, -71}, {14, 16}, {-58, 15}, +- {-72, -57}, {17, 19}, {-73, 18}, {-56, -74}, {20, 23}, +- {21, 22}, {-55, -75}, {-54, -53}, {24, 27}, {25, 26}, +- {-76, -52}, {-77, -51}, {28, 31}, {29, 30}, {-50, -78}, +- {-79, -49}, {32, 36}, {33, 34}, {-48, -47}, {-80, 35}, +- {-81, -82}, {37, 47}, {38, 41}, {39, 40}, {-83, -46}, +- {-45, -84}, {42, 44}, {-85, 43}, {-44, -43}, {45, 46}, +- {-88, -87}, {-86, -90}, {48, 66}, {49, 56}, {50, 53}, +- {51, 52}, {-92, -42}, {-41, -39}, {54, 55}, {-105, -89}, +- {-38, -37}, {57, 60}, {58, 59}, {-94, -91}, {-40, -36}, +- {61, 63}, {-20, 62}, {-115, -110}, {64, 65}, {-108, -107}, +- {-101, -97}, {67, 89}, {68, 75}, {69, 72}, {70, 71}, +- {-95, -93}, {-34, -27}, {73, 74}, {-22, -17}, {-16, -124}, +- {76, 82}, {77, 79}, {-123, 78}, {-122, -121}, {80, 81}, +- {-120, -119}, {-118, -117}, {83, 86}, {84, 85}, {-116, -114}, +- {-113, -112}, {87, 88}, {-111, -109}, {-106, -104}, {90, 105}, +- {91, 98}, {92, 95}, {93, 94}, {-103, -102}, {-100, -99}, +- {96, 97}, {-98, -96}, {-35, -33}, {99, 102}, {100, 101}, +- {-32, -31}, {-30, -29}, {103, 104}, {-28, -26}, {-25, -24}, +- {106, 113}, {107, 110}, {108, 109}, {-23, -21}, {-19, -18}, +- {111, 112}, {-15, -14}, {-13, -12}, {114, 117}, {115, 116}, +- {-11, -10}, {-9, -8}, {118, 119}, {-7, -6}, {-5, -4}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10T[48][2] = { +- {-64, 1}, {-63, 2}, {-65, 3}, {-62, 4}, {-66, 5}, {-61, 6}, +- {-67, 7}, {-60, 8}, {-68, 9}, {10, 11}, {-69, -59}, {12, 13}, +- {-70, -58}, {14, 28}, {15, 21}, {16, 18}, {-57, 17}, {-71, -56}, +- {19, 20}, {-88, -87}, {-86, -85}, {22, 25}, {23, 24}, {-84, -83}, +- {-82, -81}, {26, 27}, {-80, -79}, {-78, -77}, {29, 36}, {30, 33}, +- {31, 32}, {-76, -75}, {-74, -73}, {34, 35}, {-72, -55}, {-54, -53}, +- {37, 41}, {38, 39}, {-52, -51}, {-50, 40}, {-49, -48}, {42, 45}, +- {43, 44}, {-47, -46}, {-45, -44}, {46, 47}, {-43, -42}, {-41, -40}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10F[48][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {-66, 4}, {-62, 5}, {-61, 6}, +- {-67, 7}, {-68, 8}, {-60, 9}, {10, 11}, {-69, -59}, {-70, 12}, +- {-58, 13}, {14, 17}, {-71, 15}, {-57, 16}, {-56, -73}, {18, 32}, +- {19, 25}, {20, 22}, {-72, 21}, {-88, -87}, {23, 24}, {-86, -85}, +- {-84, -83}, {26, 29}, {27, 28}, {-82, -81}, {-80, -79}, {30, 31}, +- {-78, -77}, {-76, -75}, {33, 40}, {34, 37}, {35, 36}, {-74, -55}, +- {-54, -53}, {38, 39}, {-52, -51}, {-50, -49}, {41, 44}, {42, 43}, +- {-48, -47}, {-46, -45}, {45, 46}, {-44, -43}, {-42, 47}, {-41, -40}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11T[62][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {-66, 4}, {-62, 5}, {-67, 6}, +- {-61, 7}, {-68, 8}, {-60, 9}, {10, 11}, {-69, -59}, {12, 14}, +- {-70, 13}, {-71, -58}, {15, 18}, {16, 17}, {-72, -57}, {-73, -74}, +- {19, 22}, {-56, 20}, {-55, 21}, {-54, -77}, {23, 31}, {24, 25}, +- {-75, -76}, {26, 27}, {-78, -53}, {28, 29}, {-52, -95}, {-94, 30}, +- {-93, -92}, {32, 47}, {33, 40}, {34, 37}, {35, 36}, {-91, -90}, +- {-89, -88}, {38, 39}, {-87, -86}, {-85, -84}, {41, 44}, {42, 43}, +- {-83, -82}, {-81, -80}, {45, 46}, {-79, -51}, {-50, -49}, {48, 55}, +- {49, 52}, {50, 51}, {-48, -47}, {-46, -45}, {53, 54}, {-44, -43}, +- {-42, -41}, {56, 59}, {57, 58}, {-40, -39}, {-38, -37}, {60, 61}, +- {-36, -35}, {-34, -33}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11F[62][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {-66, 4}, {-62, 5}, {-67, 6}, +- {7, 8}, {-61, -68}, {9, 10}, {-60, -69}, {11, 12}, {-59, -70}, +- {13, 14}, {-58, -71}, {15, 16}, {-57, -72}, {17, 19}, {-56, 18}, +- {-55, -73}, {20, 24}, {21, 22}, {-74, -54}, {-53, 23}, {-75, -76}, +- {25, 30}, {26, 27}, {-52, -51}, {28, 29}, {-77, -79}, {-50, -49}, +- {31, 39}, {32, 35}, {33, 34}, {-78, -46}, {-82, -88}, {36, 37}, +- {-83, -48}, {-47, 38}, {-86, -85}, {40, 47}, {41, 44}, {42, 43}, +- {-80, -44}, {-43, -42}, {45, 46}, {-39, -87}, {-84, -40}, {48, 55}, +- {49, 52}, {50, 51}, {-95, -94}, {-93, -92}, {53, 54}, {-91, -90}, +- {-89, -81}, {56, 59}, {57, 58}, {-45, -41}, {-38, -37}, {60, 61}, +- {-36, -35}, {-34, -33}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11T[24][2] = { +- {-64, 1}, {-63, 2}, {-65, 3}, {-66, 4}, {-62, 5}, {-61, 6}, +- {-67, 7}, {-68, 8}, {-60, 9}, {10, 16}, {11, 13}, {-69, 12}, +- {-76, -75}, {14, 15}, {-74, -73}, {-72, -71}, {17, 20}, {18, 19}, +- {-70, -59}, {-58, -57}, {21, 22}, {-56, -55}, {-54, 23}, {-53, -52}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11F[24][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {-66, 4}, {-62, 5}, {-61, 6}, +- {-67, 7}, {-68, 8}, {-60, 9}, {10, 13}, {-69, 11}, {-59, 12}, +- {-58, -76}, {14, 17}, {15, 16}, {-75, -74}, {-73, -72}, {18, 21}, +- {19, 20}, {-71, -70}, {-57, -56}, {22, 23}, {-55, -54}, {-53, -52}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T[62][2] = { +- {-64, 1}, {-63, 2}, {-65, 3}, {-66, 4}, {-62, 5}, {-67, 6}, +- {7, 8}, {-61, -68}, {9, 30}, {10, 15}, {-60, 11}, {-69, 12}, +- {13, 14}, {-59, -53}, {-95, -94}, {16, 23}, {17, 20}, {18, 19}, +- {-93, -92}, {-91, -90}, {21, 22}, {-89, -88}, {-87, -86}, {24, 27}, +- {25, 26}, {-85, -84}, {-83, -82}, {28, 29}, {-81, -80}, {-79, -78}, +- {31, 46}, {32, 39}, {33, 36}, {34, 35}, {-77, -76}, {-75, -74}, +- {37, 38}, {-73, -72}, {-71, -70}, {40, 43}, {41, 42}, {-58, -57}, +- {-56, -55}, {44, 45}, {-54, -52}, {-51, -50}, {47, 54}, {48, 51}, +- {49, 50}, {-49, -48}, {-47, -46}, {52, 53}, {-45, -44}, {-43, -42}, +- {55, 58}, {56, 57}, {-41, -40}, {-39, -38}, {59, 60}, {-37, -36}, +- {-35, 61}, {-34, -33}}; +- +-const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T[24][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {4, 9}, {-66, 5}, {-62, 6}, +- {7, 8}, {-76, -75}, {-74, -73}, {10, 17}, {11, 14}, {12, 13}, +- {-72, -71}, {-70, -69}, {15, 16}, {-68, -67}, {-61, -60}, {18, 21}, +- {19, 20}, {-59, -58}, {-57, -56}, {22, 23}, {-55, -54}, {-53, -52}}; +-//@} +- +-/*! +- \name parametric stereo +- \brief constants used by the parametric stereo part of the decoder +- +-*/ +- +-/* constants used in psbitdec.cpp */ +- +-/* FIX_BORDER can have 0, 1, 2, 4 envelopes */ +-const UCHAR FDK_sbrDecoder_aFixNoEnvDecode[4] = {0, 1, 2, 4}; +- +-/* IID & ICC Huffman codebooks */ +-const SCHAR aBookPsIidTimeDecode[28][2] = { +- {-64, 1}, {-65, 2}, {-63, 3}, {-66, 4}, {-62, 5}, {-67, 6}, +- {-61, 7}, {-68, 8}, {-60, 9}, {-69, 10}, {-59, 11}, {-70, 12}, +- {-58, 13}, {-57, 14}, {-71, 15}, {16, 17}, {-56, -72}, {18, 21}, +- {19, 20}, {-55, -78}, {-77, -76}, {22, 25}, {23, 24}, {-75, -74}, +- {-73, -54}, {26, 27}, {-53, -52}, {-51, -50}}; +- +-const SCHAR aBookPsIidFreqDecode[28][2] = { +- {-64, 1}, {2, 3}, {-63, -65}, {4, 5}, {-62, -66}, {6, 7}, +- {-61, -67}, {8, 9}, {-68, -60}, {-59, 10}, {-69, 11}, {-58, 12}, +- {-70, 13}, {-71, 14}, {-57, 15}, {16, 17}, {-56, -72}, {18, 19}, +- {-55, -54}, {20, 21}, {-73, -53}, {22, 24}, {-74, 23}, {-75, -78}, +- {25, 26}, {-77, -76}, {-52, 27}, {-51, -50}}; +- +-const SCHAR aBookPsIccTimeDecode[14][2] = { +- {-64, 1}, {-63, 2}, {-65, 3}, {-62, 4}, {-66, 5}, {-61, 6}, {-67, 7}, +- {-60, 8}, {-68, 9}, {-59, 10}, {-69, 11}, {-58, 12}, {-70, 13}, {-71, -57}}; +- +-const SCHAR aBookPsIccFreqDecode[14][2] = { +- {-64, 1}, {-63, 2}, {-65, 3}, {-62, 4}, {-66, 5}, {-61, 6}, {-67, 7}, +- {-60, 8}, {-59, 9}, {-68, 10}, {-58, 11}, {-69, 12}, {-57, 13}, {-70, -71}}; +- +-/* IID-fine Huffman codebooks */ +- +-const SCHAR aBookPsIidFineTimeDecode[60][2] = { +- {1, -64}, {-63, 2}, {3, -65}, {4, 59}, {5, 7}, {6, -67}, +- {-68, -60}, {-61, 8}, {9, 11}, {-59, 10}, {-70, -58}, {12, 41}, +- {13, 20}, {14, -71}, {-55, 15}, {-53, 16}, {17, -77}, {18, 19}, +- {-85, -84}, {-46, -45}, {-57, 21}, {22, 40}, {23, 29}, {-51, 24}, +- {25, 26}, {-83, -82}, {27, 28}, {-90, -38}, {-92, -91}, {30, 37}, +- {31, 34}, {32, 33}, {-35, -34}, {-37, -36}, {35, 36}, {-94, -93}, +- {-89, -39}, {38, -79}, {39, -81}, {-88, -40}, {-74, -54}, {42, -69}, +- {43, 44}, {-72, -56}, {45, 52}, {46, 50}, {47, -76}, {-49, 48}, +- {-47, 49}, {-87, -41}, {-52, 51}, {-78, -50}, {53, -73}, {54, -75}, +- {55, 57}, {56, -80}, {-86, -42}, {-48, 58}, {-44, -43}, {-66, -62}}; +- +-const SCHAR aBookPsIidFineFreqDecode[60][2] = { +- {1, -64}, {2, 4}, {3, -65}, {-66, -62}, {-63, 5}, {6, 7}, +- {-67, -61}, {8, 9}, {-68, -60}, {10, 11}, {-69, -59}, {12, 13}, +- {-70, -58}, {14, 18}, {-57, 15}, {16, -72}, {-54, 17}, {-75, -53}, +- {19, 37}, {-56, 20}, {21, -73}, {22, 29}, {23, -76}, {24, -78}, +- {25, 28}, {26, 27}, {-85, -43}, {-83, -45}, {-81, -47}, {-52, 30}, +- {-50, 31}, {32, -79}, {33, 34}, {-82, -46}, {35, 36}, {-90, -89}, +- {-92, -91}, {38, -71}, {-55, 39}, {40, -74}, {41, 50}, {42, -77}, +- {-49, 43}, {44, 47}, {45, 46}, {-86, -42}, {-88, -87}, {48, 49}, +- {-39, -38}, {-41, -40}, {-51, 51}, {52, 59}, {53, 56}, {54, 55}, +- {-35, -34}, {-37, -36}, {57, 58}, {-94, -93}, {-84, -44}, {-80, -48}}; +- +-/* constants used in psdec.cpp */ +- +-/* the values of the following 3 tables are shiftet right by 1 ! */ +-const FIXP_DBL ScaleFactors[NO_IID_LEVELS] = { +- +- 0x5a5ded00, 0x59cd0400, 0x58c29680, 0x564c2e80, 0x52a3d480, +- 0x4c8be080, 0x46df3080, 0x40000000, 0x384ba5c0, 0x304c2980, +- 0x24e9f640, 0x1b4a2940, 0x11b5c0a0, 0x0b4e2540, 0x0514ea90}; +- +-const FIXP_DBL ScaleFactorsFine[NO_IID_LEVELS_FINE] = { +- +- 0x5a825c00, 0x5a821c00, 0x5a815100, 0x5a7ed000, 0x5a76e600, 0x5a5ded00, +- 0x5a39b880, 0x59f1fd00, 0x5964d680, 0x5852ca00, 0x564c2e80, 0x54174480, +- 0x50ea7500, 0x4c8be080, 0x46df3080, 0x40000000, 0x384ba5c0, 0x304c2980, +- 0x288dd240, 0x217a2900, 0x1b4a2940, 0x13c5ece0, 0x0e2b0090, 0x0a178ef0, +- 0x072ab798, 0x0514ea90, 0x02dc5944, 0x019bf87c, 0x00e7b173, 0x00824b8b, +- 0x00494568}; +-const FIXP_DBL Alphas[NO_ICC_LEVELS] = { +- +- 0x00000000, 0x0b6b5be0, 0x12485f80, 0x1da2fa40, +- 0x2637ebc0, 0x3243f6c0, 0x466b7480, 0x6487ed80}; +- +-const UCHAR bins2groupMap20[NO_IID_GROUPS] = { +- 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; +- +-const UCHAR FDK_sbrDecoder_aNoIidBins[3] = { +- NO_LOW_RES_IID_BINS, NO_MID_RES_IID_BINS, NO_HI_RES_IID_BINS}; +- +-const UCHAR FDK_sbrDecoder_aNoIccBins[3] = { +- NO_LOW_RES_ICC_BINS, NO_MID_RES_ICC_BINS, NO_HI_RES_ICC_BINS}; +- +-/************************************************************************/ +-/*! +- \brief Create lookup tables for some arithmetic functions +- +- The tables would normally be defined as const arrays, +- but initialization at run time allows to specify their accuracy. +-*/ +-/************************************************************************/ +- +-/* 1/x-table: (example for INV_TABLE_BITS 8) +- +- The table covers an input range from 0.5 to 1.0 with a step size of 1/512, +- starting at 0.5 + 1/512. +- Each table entry corresponds to an input interval starting 1/1024 below the +- exact value and ending 1/1024 above it. +- +- The table is actually a 0.5/x-table, so that the output range is again +- 0.5...1.0 and the exponent of the result must be increased by 1. +- +- Input range Index in table result +- ------------------------------------------------------------------- +- 0.500000...0.500976 - 0.5 / 0.500000 = 1.000000 +- 0.500976...0.502930 0 0.5 / 0.501953 = 0.996109 +- 0.502930...0.500488 1 0.5 / 0.503906 = 0.992248 +- ... +- 0.999023...1.000000 255 0.5 / 1.000000 = 0.500000 +- +- for (i=0; iprevFact_mag[band] = FL2FXCONST_DBL(0.5f); +- } +- +- for (band = 0; band < SBRDEC_MAX_DRC_BANDS; band++) { +- hDrcData->currFact_mag[band] = FL2FXCONST_DBL(0.5f); +- hDrcData->nextFact_mag[band] = FL2FXCONST_DBL(0.5f); +- } +- +- hDrcData->prevFact_exp = 1; +- hDrcData->currFact_exp = 1; +- hDrcData->nextFact_exp = 1; +- +- hDrcData->numBandsCurr = 1; +- hDrcData->numBandsNext = 1; +- +- hDrcData->winSequenceCurr = 0; +- hDrcData->winSequenceNext = 0; +- +- hDrcData->drcInterpolationSchemeCurr = 0; +- hDrcData->drcInterpolationSchemeNext = 0; +- +- hDrcData->enable = 0; +-} +- +-/*! +- \brief Swap DRC QMF scaling factors after they have been applied. +- +- \hDrcData Handle to DRC channel data. +- +- \return none +-*/ +-void sbrDecoder_drcUpdateChannel(HANDLE_SBR_DRC_CHANNEL hDrcData) { +- if (hDrcData == NULL) { +- return; +- } +- if (hDrcData->enable != 1) { +- return; +- } +- +- /* swap previous data */ +- FDKmemcpy(hDrcData->currFact_mag, hDrcData->nextFact_mag, +- SBRDEC_MAX_DRC_BANDS * sizeof(FIXP_DBL)); +- +- hDrcData->currFact_exp = hDrcData->nextFact_exp; +- +- hDrcData->numBandsCurr = hDrcData->numBandsNext; +- +- FDKmemcpy(hDrcData->bandTopCurr, hDrcData->bandTopNext, +- SBRDEC_MAX_DRC_BANDS * sizeof(USHORT)); +- +- hDrcData->drcInterpolationSchemeCurr = hDrcData->drcInterpolationSchemeNext; +- +- hDrcData->winSequenceCurr = hDrcData->winSequenceNext; +-} +- +-/*! +- \brief Apply DRC factors slot based. +- +- \hDrcData Handle to DRC channel data. +- \qmfRealSlot Pointer to real valued QMF data of one time slot. +- \qmfImagSlot Pointer to the imaginary QMF data of one time slot. +- \col Number of the time slot. +- \numQmfSubSamples Total number of time slots for one frame. +- \scaleFactor Pointer to the out scale factor of the time slot. +- +- \return None. +-*/ +-void sbrDecoder_drcApplySlot(HANDLE_SBR_DRC_CHANNEL hDrcData, +- FIXP_DBL *qmfRealSlot, FIXP_DBL *qmfImagSlot, +- int col, int numQmfSubSamples, int maxShift) { +- const UCHAR *winBorderToColMap; +- +- int band, bottomMdct, topMdct, bin, useLP; +- int indx = numQmfSubSamples - (numQmfSubSamples >> 1) - 10; /* l_border */ +- int frameLenFlag = (numQmfSubSamples == 30) ? 1 : 0; +- int frameSize = (frameLenFlag == 1) ? 960 : 1024; +- +- const FIXP_DBL *fact_mag = NULL; +- INT fact_exp = 0; +- UINT numBands = 0; +- USHORT *bandTop = NULL; +- int shortDrc = 0; +- +- FIXP_DBL alphaValue = FL2FXCONST_DBL(0.0f); +- +- if (hDrcData == NULL) { +- return; +- } +- if (hDrcData->enable != 1) { +- return; +- } +- +- winBorderToColMap = winBorderToColMappingTab[frameLenFlag]; +- +- useLP = (qmfImagSlot == NULL) ? 1 : 0; +- +- col += indx; +- bottomMdct = 0; +- +- /* get respective data and calc interpolation factor */ +- if (col < (numQmfSubSamples >> 1)) { /* first half of current frame */ +- if (hDrcData->winSequenceCurr != 2) { /* long window */ +- int j = col + (numQmfSubSamples >> 1); +- +- if (hDrcData->drcInterpolationSchemeCurr == 0) { +- INT k = (frameLenFlag) ? 0x4444445 : 0x4000000; +- +- alphaValue = (FIXP_DBL)(j * k); +- } else { +- if (j >= (int)winBorderToColMap[hDrcData->drcInterpolationSchemeCurr]) { +- alphaValue = (FIXP_DBL)MAXVAL_DBL; +- } +- } +- } else { /* short windows */ +- shortDrc = 1; +- } +- +- fact_mag = hDrcData->currFact_mag; +- fact_exp = hDrcData->currFact_exp; +- numBands = hDrcData->numBandsCurr; +- bandTop = hDrcData->bandTopCurr; +- } else if (col < numQmfSubSamples) { /* second half of current frame */ +- if (hDrcData->winSequenceNext != 2) { /* next: long window */ +- int j = col - (numQmfSubSamples >> 1); +- +- if (hDrcData->drcInterpolationSchemeNext == 0) { +- INT k = (frameLenFlag) ? 0x4444445 : 0x4000000; +- +- alphaValue = (FIXP_DBL)(j * k); +- } else { +- if (j >= (int)winBorderToColMap[hDrcData->drcInterpolationSchemeNext]) { +- alphaValue = (FIXP_DBL)MAXVAL_DBL; +- } +- } +- +- fact_mag = hDrcData->nextFact_mag; +- fact_exp = hDrcData->nextFact_exp; +- numBands = hDrcData->numBandsNext; +- bandTop = hDrcData->bandTopNext; +- } else { /* next: short windows */ +- if (hDrcData->winSequenceCurr != 2) { /* current: long window */ +- alphaValue = (FIXP_DBL)0; +- +- fact_mag = hDrcData->nextFact_mag; +- fact_exp = hDrcData->nextFact_exp; +- numBands = hDrcData->numBandsNext; +- bandTop = hDrcData->bandTopNext; +- } else { /* current: short windows */ +- shortDrc = 1; +- +- fact_mag = hDrcData->currFact_mag; +- fact_exp = hDrcData->currFact_exp; +- numBands = hDrcData->numBandsCurr; +- bandTop = hDrcData->bandTopCurr; +- } +- } +- } else { /* first half of next frame */ +- if (hDrcData->winSequenceNext != 2) { /* long window */ +- int j = col - (numQmfSubSamples >> 1); +- +- if (hDrcData->drcInterpolationSchemeNext == 0) { +- INT k = (frameLenFlag) ? 0x4444445 : 0x4000000; +- +- alphaValue = (FIXP_DBL)(j * k); +- } else { +- if (j >= (int)winBorderToColMap[hDrcData->drcInterpolationSchemeNext]) { +- alphaValue = (FIXP_DBL)MAXVAL_DBL; +- } +- } +- } else { /* short windows */ +- shortDrc = 1; +- } +- +- fact_mag = hDrcData->nextFact_mag; +- fact_exp = hDrcData->nextFact_exp; +- numBands = hDrcData->numBandsNext; +- bandTop = hDrcData->bandTopNext; +- +- col -= numQmfSubSamples; +- } +- +- /* process bands */ +- for (band = 0; band < (int)numBands; band++) { +- int bottomQmf, topQmf; +- +- FIXP_DBL drcFact_mag = (FIXP_DBL)MAXVAL_DBL; +- +- topMdct = (bandTop[band] + 1) << 2; +- +- if (!shortDrc) { /* long window */ +- if (frameLenFlag) { +- /* 960 framing */ +- bottomQmf = fMultIfloor((FIXP_DBL)0x4444445, bottomMdct); +- topQmf = fMultIfloor((FIXP_DBL)0x4444445, topMdct); +- +- topMdct = 30 * topQmf; +- } else { +- /* 1024 framing */ +- topMdct &= ~0x1f; +- +- bottomQmf = bottomMdct >> 5; +- topQmf = topMdct >> 5; +- } +- +- if (band == ((int)numBands - 1)) { +- topQmf = (64); +- } +- +- for (bin = bottomQmf; bin < topQmf; bin++) { +- FIXP_DBL drcFact1_mag = hDrcData->prevFact_mag[bin]; +- FIXP_DBL drcFact2_mag = fact_mag[band]; +- +- /* normalize scale factors */ +- if (hDrcData->prevFact_exp < maxShift) { +- drcFact1_mag >>= maxShift - hDrcData->prevFact_exp; +- } +- if (fact_exp < maxShift) { +- drcFact2_mag >>= maxShift - fact_exp; +- } +- +- /* interpolate */ +- if (alphaValue == (FIXP_DBL)0) { +- drcFact_mag = drcFact1_mag; +- } else if (alphaValue == (FIXP_DBL)MAXVAL_DBL) { +- drcFact_mag = drcFact2_mag; +- } else { +- drcFact_mag = +- fMult(alphaValue, drcFact2_mag) + +- fMult(((FIXP_DBL)MAXVAL_DBL - alphaValue), drcFact1_mag); +- } +- +- /* apply scaling */ +- qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); +- if (!useLP) { +- qmfImagSlot[bin] = fMult(qmfImagSlot[bin], drcFact_mag); +- } +- +- /* save previous factors */ +- if (col == (numQmfSubSamples >> 1) - 1) { +- hDrcData->prevFact_mag[bin] = fact_mag[band]; +- } +- } +- } else { /* short windows */ +- unsigned startWinIdx, stopWinIdx; +- int startCol, stopCol; +- FIXP_DBL invFrameSizeDiv8 = +- (frameLenFlag) ? (FIXP_DBL)0x1111112 : (FIXP_DBL)0x1000000; +- +- /* limit top at the frame borders */ +- if (topMdct < 0) { +- topMdct = 0; +- } +- if (topMdct >= frameSize) { +- topMdct = frameSize - 1; +- } +- +- if (frameLenFlag) { +- /* 960 framing */ +- topMdct = fMultIfloor((FIXP_DBL)0x78000000, +- fMultIfloor((FIXP_DBL)0x22222223, topMdct) << 2); +- +- startWinIdx = fMultIfloor(invFrameSizeDiv8, bottomMdct) + +- 1; /* winBorderToColMap table has offset of 1 */ +- stopWinIdx = fMultIceil(invFrameSizeDiv8 - (FIXP_DBL)1, topMdct) + 1; +- } else { +- /* 1024 framing */ +- topMdct &= ~0x03; +- +- startWinIdx = fMultIfloor(invFrameSizeDiv8, bottomMdct) + 1; +- stopWinIdx = fMultIceil(invFrameSizeDiv8, topMdct) + 1; +- } +- +- /* startCol is truncated to the nearest corresponding start subsample in +- the QMF of the short window bottom is present in:*/ +- startCol = (int)winBorderToColMap[startWinIdx]; +- +- /* stopCol is rounded upwards to the nearest corresponding stop subsample +- in the QMF of the short window top is present in. */ +- stopCol = (int)winBorderToColMap[stopWinIdx]; +- +- bottomQmf = fMultIfloor(invFrameSizeDiv8, +- ((bottomMdct % (numQmfSubSamples << 2)) << 5)); +- topQmf = fMultIfloor(invFrameSizeDiv8, +- ((topMdct % (numQmfSubSamples << 2)) << 5)); +- +- /* extend last band */ +- if (band == ((int)numBands - 1)) { +- topQmf = (64); +- stopCol = numQmfSubSamples; +- stopWinIdx = 10; +- } +- +- if (topQmf == 0) { +- if (frameLenFlag) { +- FIXP_DBL rem = fMult(invFrameSizeDiv8, +- (FIXP_DBL)(topMdct << (DFRACT_BITS - 12))); +- if ((LONG)rem & (LONG)0x1F) { +- stopWinIdx -= 1; +- stopCol = (int)winBorderToColMap[stopWinIdx]; +- } +- } +- topQmf = (64); +- } +- +- /* save previous factors */ +- if (stopCol == numQmfSubSamples) { +- int tmpBottom = bottomQmf; +- +- if ((int)winBorderToColMap[8] > startCol) { +- tmpBottom = 0; /* band starts in previous short window */ +- } +- +- for (bin = tmpBottom; bin < topQmf; bin++) { +- hDrcData->prevFact_mag[bin] = fact_mag[band]; +- } +- } +- +- /* apply */ +- if ((col >= startCol) && (col < stopCol)) { +- if (col >= (int)winBorderToColMap[startWinIdx + 1]) { +- bottomQmf = 0; /* band starts in previous short window */ +- } +- if (col < (int)winBorderToColMap[stopWinIdx - 1]) { +- topQmf = (64); /* band ends in next short window */ +- } +- +- drcFact_mag = fact_mag[band]; +- +- /* normalize scale factor */ +- if (fact_exp < maxShift) { +- drcFact_mag >>= maxShift - fact_exp; +- } +- +- /* apply scaling */ +- for (bin = bottomQmf; bin < topQmf; bin++) { +- qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); +- if (!useLP) { +- qmfImagSlot[bin] = fMult(qmfImagSlot[bin], drcFact_mag); +- } +- } +- } +- } +- +- bottomMdct = topMdct; +- } /* end of bands loop */ +- +- if (col == (numQmfSubSamples >> 1) - 1) { +- hDrcData->prevFact_exp = fact_exp; +- } +-} +- +-/*! +- \brief Apply DRC factors frame based. +- +- \hDrcData Handle to DRC channel data. +- \qmfRealSlot Pointer to real valued QMF data of the whole frame. +- \qmfImagSlot Pointer to the imaginary QMF data of the whole frame. +- \numQmfSubSamples Total number of time slots for one frame. +- \scaleFactor Pointer to the out scale factor of the frame. +- +- \return None. +-*/ +-void sbrDecoder_drcApply(HANDLE_SBR_DRC_CHANNEL hDrcData, +- FIXP_DBL **QmfBufferReal, FIXP_DBL **QmfBufferImag, +- int numQmfSubSamples, int *scaleFactor) { +- int col; +- int maxShift = 0; +- +- if (hDrcData == NULL) { +- return; +- } +- if (hDrcData->enable == 0) { +- return; /* Avoid changing the scaleFactor even though the processing is +- disabled. */ +- } +- +- /* get max scale factor */ +- if (hDrcData->prevFact_exp > maxShift) { +- maxShift = hDrcData->prevFact_exp; +- } +- if (hDrcData->currFact_exp > maxShift) { +- maxShift = hDrcData->currFact_exp; +- } +- if (hDrcData->nextFact_exp > maxShift) { +- maxShift = hDrcData->nextFact_exp; +- } +- +- for (col = 0; col < numQmfSubSamples; col++) { +- FIXP_DBL *qmfSlotReal = QmfBufferReal[col]; +- FIXP_DBL *qmfSlotImag = (QmfBufferImag == NULL) ? NULL : QmfBufferImag[col]; +- +- sbrDecoder_drcApplySlot(hDrcData, qmfSlotReal, qmfSlotImag, col, +- numQmfSubSamples, maxShift); +- } +- +- *scaleFactor += maxShift; +-} +diff --git a/libSBRdec/src/sbrdec_drc.h b/libSBRdec/src/sbrdec_drc.h +deleted file mode 100644 +index 2eb0e20..0000000 +--- a/libSBRdec/src/sbrdec_drc.h ++++ /dev/null +@@ -1,149 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): Christian Griebel +- +- Description: Dynamic range control (DRC) decoder tool for SBR +- +-*******************************************************************************/ +- +-#ifndef SBRDEC_DRC_H +-#define SBRDEC_DRC_H +- +-#include "sbrdecoder.h" +- +-#define SBRDEC_MAX_DRC_CHANNELS (8) +-#define SBRDEC_MAX_DRC_BANDS (16) +- +-typedef struct { +- FIXP_DBL prevFact_mag[(64)]; +- INT prevFact_exp; +- +- FIXP_DBL currFact_mag[SBRDEC_MAX_DRC_BANDS]; +- FIXP_DBL nextFact_mag[SBRDEC_MAX_DRC_BANDS]; +- INT currFact_exp; +- INT nextFact_exp; +- +- UINT numBandsCurr; +- UINT numBandsNext; +- USHORT bandTopCurr[SBRDEC_MAX_DRC_BANDS]; +- USHORT bandTopNext[SBRDEC_MAX_DRC_BANDS]; +- +- SHORT drcInterpolationSchemeCurr; +- SHORT drcInterpolationSchemeNext; +- +- SHORT enable; +- +- UCHAR winSequenceCurr; +- UCHAR winSequenceNext; +- +-} SBRDEC_DRC_CHANNEL; +- +-typedef SBRDEC_DRC_CHANNEL *HANDLE_SBR_DRC_CHANNEL; +- +-void sbrDecoder_drcInitChannel(HANDLE_SBR_DRC_CHANNEL hDrcData); +- +-void sbrDecoder_drcUpdateChannel(HANDLE_SBR_DRC_CHANNEL hDrcData); +- +-void sbrDecoder_drcApplySlot(HANDLE_SBR_DRC_CHANNEL hDrcData, +- FIXP_DBL *qmfRealSlot, FIXP_DBL *qmfImagSlot, +- int col, int numQmfSubSamples, int maxShift); +- +-void sbrDecoder_drcApply(HANDLE_SBR_DRC_CHANNEL hDrcData, +- FIXP_DBL **QmfBufferReal, FIXP_DBL **QmfBufferImag, +- int numQmfSubSamples, int *scaleFactor); +- +-#endif /* SBRDEC_DRC_H */ +diff --git a/libSBRdec/src/sbrdec_freq_sca.cpp b/libSBRdec/src/sbrdec_freq_sca.cpp +deleted file mode 100644 +index 165f94b..0000000 +--- a/libSBRdec/src/sbrdec_freq_sca.cpp ++++ /dev/null +@@ -1,835 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Frequency scale calculation +-*/ +- +-#include "sbrdec_freq_sca.h" +- +-#include "transcendent.h" +-#include "sbr_rom.h" +-#include "env_extr.h" +- +-#include "genericStds.h" /* need log() for debug-code only */ +- +-#define MAX_OCTAVE 29 +-#define MAX_SECOND_REGION 50 +- +-static int numberOfBands(FIXP_SGL bpo_div16, int start, int stop, int warpFlag); +-static void CalcBands(UCHAR *diff, UCHAR start, UCHAR stop, UCHAR num_bands); +-static SBR_ERROR modifyBands(UCHAR max_band, UCHAR *diff, UCHAR length); +-static void cumSum(UCHAR start_value, UCHAR *diff, UCHAR length, +- UCHAR *start_adress); +- +-/*! +- \brief Retrieve QMF-band where the SBR range starts +- +- Convert startFreq which was read from the bitstream into a +- QMF-channel number. +- +- \return Number of start band +-*/ +-static UCHAR getStartBand( +- UINT fs, /*!< Output sampling frequency */ +- UCHAR startFreq, /*!< Index to table of possible start bands */ +- UINT headerDataFlags) /*!< Info to SBR mode */ +-{ +- INT band; +- UINT fsMapped = fs; +- SBR_RATE rate = DUAL; +- +- if (headerDataFlags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { +- if (headerDataFlags & SBRDEC_QUAD_RATE) { +- rate = QUAD; +- } +- fsMapped = sbrdec_mapToStdSampleRate(fs, 1); +- } +- +- FDK_ASSERT(2 * (rate + 1) <= (4)); +- +- switch (fsMapped) { +- case 192000: +- band = FDK_sbrDecoder_sbr_start_freq_192[startFreq]; +- break; +- case 176400: +- band = FDK_sbrDecoder_sbr_start_freq_176[startFreq]; +- break; +- case 128000: +- band = FDK_sbrDecoder_sbr_start_freq_128[startFreq]; +- break; +- case 96000: +- case 88200: +- band = FDK_sbrDecoder_sbr_start_freq_88[rate][startFreq]; +- break; +- case 64000: +- band = FDK_sbrDecoder_sbr_start_freq_64[rate][startFreq]; +- break; +- case 48000: +- band = FDK_sbrDecoder_sbr_start_freq_48[rate][startFreq]; +- break; +- case 44100: +- band = FDK_sbrDecoder_sbr_start_freq_44[rate][startFreq]; +- break; +- case 40000: +- band = FDK_sbrDecoder_sbr_start_freq_40[rate][startFreq]; +- break; +- case 32000: +- band = FDK_sbrDecoder_sbr_start_freq_32[rate][startFreq]; +- break; +- case 24000: +- band = FDK_sbrDecoder_sbr_start_freq_24[rate][startFreq]; +- break; +- case 22050: +- band = FDK_sbrDecoder_sbr_start_freq_22[rate][startFreq]; +- break; +- case 16000: +- band = FDK_sbrDecoder_sbr_start_freq_16[rate][startFreq]; +- break; +- default: +- band = 255; +- } +- +- return band; +-} +- +-/*! +- \brief Retrieve QMF-band where the SBR range starts +- +- Convert startFreq which was read from the bitstream into a +- QMF-channel number. +- +- \return Number of start band +-*/ +-static UCHAR getStopBand( +- UINT fs, /*!< Output sampling frequency */ +- UCHAR stopFreq, /*!< Index to table of possible start bands */ +- UINT headerDataFlags, /*!< Info to SBR mode */ +- UCHAR k0) /*!< Start freq index */ +-{ +- UCHAR k2; +- +- if (stopFreq < 14) { +- INT stopMin; +- INT num = 2 * (64); +- UCHAR diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; +- UCHAR *diff0 = diff_tot; +- UCHAR *diff1 = diff_tot + MAX_OCTAVE; +- +- if (headerDataFlags & SBRDEC_QUAD_RATE) { +- num >>= 1; +- } +- +- if (fs < 32000) { +- stopMin = (((2 * 6000 * num) / fs) + 1) >> 1; +- } else { +- if (fs < 64000) { +- stopMin = (((2 * 8000 * num) / fs) + 1) >> 1; +- } else { +- stopMin = (((2 * 10000 * num) / fs) + 1) >> 1; +- } +- } +- +- /* +- Choose a stop band between k1 and 64 depending on stopFreq (0..13), +- based on a logarithmic scale. +- The vectors diff0 and diff1 are used temporarily here. +- */ +- CalcBands(diff0, stopMin, 64, 13); +- shellsort(diff0, 13); +- cumSum(stopMin, diff0, 13, diff1); +- k2 = diff1[stopFreq]; +- } else if (stopFreq == 14) +- k2 = 2 * k0; +- else +- k2 = 3 * k0; +- +- /* Limit to Nyquist */ +- if (k2 > (64)) k2 = (64); +- +- /* Range checks */ +- /* 1 <= difference <= 48; 1 <= fs <= 96000 */ +- { +- UCHAR max_freq_coeffs = (headerDataFlags & SBRDEC_QUAD_RATE) +- ? MAX_FREQ_COEFFS_QUAD_RATE +- : MAX_FREQ_COEFFS; +- if (((k2 - k0) > max_freq_coeffs) || (k2 <= k0)) { +- return 255; +- } +- } +- +- if (headerDataFlags & SBRDEC_QUAD_RATE) { +- return k2; /* skip other checks: (k2 - k0) must be <= +- MAX_FREQ_COEFFS_QUAD_RATE for all fs */ +- } +- if (headerDataFlags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) { +- /* 1 <= difference <= 35; 42000 <= fs <= 96000 */ +- if ((fs >= 42000) && ((k2 - k0) > MAX_FREQ_COEFFS_FS44100)) { +- return 255; +- } +- /* 1 <= difference <= 32; 46009 <= fs <= 96000 */ +- if ((fs >= 46009) && ((k2 - k0) > MAX_FREQ_COEFFS_FS48000)) { +- return 255; +- } +- } else { +- /* 1 <= difference <= 35; fs == 44100 */ +- if ((fs == 44100) && ((k2 - k0) > MAX_FREQ_COEFFS_FS44100)) { +- return 255; +- } +- /* 1 <= difference <= 32; 48000 <= fs <= 96000 */ +- if ((fs >= 48000) && ((k2 - k0) > MAX_FREQ_COEFFS_FS48000)) { +- return 255; +- } +- } +- +- return k2; +-} +- +-/*! +- \brief Generates master frequency tables +- +- Frequency tables are calculated according to the selected domain +- (linear/logarithmic) and granularity. +- IEC 14496-3 4.6.18.3.2.1 +- +- \return errorCode, 0 if successful +-*/ +-SBR_ERROR +-sbrdecUpdateFreqScale( +- UCHAR *v_k_master, /*!< Master table to be created */ +- UCHAR *numMaster, /*!< Number of entries in master table */ +- UINT fs, /*!< SBR working sampling rate */ +- HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Control data from bitstream */ +- UINT flags) { +- FIXP_SGL bpo_div16; /* bands_per_octave divided by 16 */ +- INT dk = 0; +- +- /* Internal variables */ +- UCHAR k0, k2, i; +- UCHAR num_bands0 = 0; +- UCHAR num_bands1 = 0; +- UCHAR diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; +- UCHAR *diff0 = diff_tot; +- UCHAR *diff1 = diff_tot + MAX_OCTAVE; +- INT k2_achived; +- INT k2_diff; +- INT incr = 0; +- +- /* +- Determine start band +- */ +- if (flags & SBRDEC_QUAD_RATE) { +- fs >>= 1; +- } +- +- k0 = getStartBand(fs, hHeaderData->bs_data.startFreq, flags); +- if (k0 == 255) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* +- Determine stop band +- */ +- k2 = getStopBand(fs, hHeaderData->bs_data.stopFreq, flags, k0); +- if (k2 == 255) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- if (hHeaderData->bs_data.freqScale > 0) { /* Bark */ +- INT k1; +- +- if (hHeaderData->bs_data.freqScale == 1) { +- bpo_div16 = FL2FXCONST_SGL(12.0f / 16.0f); +- } else if (hHeaderData->bs_data.freqScale == 2) { +- bpo_div16 = FL2FXCONST_SGL(10.0f / 16.0f); +- } else { +- bpo_div16 = FL2FXCONST_SGL(8.0f / 16.0f); +- } +- +- /* Ref: ISO/IEC 23003-3, Figure 12 - Flowchart calculation of fMaster for +- * 4:1 system when bs_freq_scale > 0 */ +- if (flags & SBRDEC_QUAD_RATE) { +- if ((SHORT)k0 < (SHORT)(bpo_div16 >> ((FRACT_BITS - 1) - 4))) { +- bpo_div16 = (FIXP_SGL)(k0 & (UCHAR)0xfe) +- << ((FRACT_BITS - 1) - 4); /* bpo_div16 = floor(k0/2)*2 */ +- } +- } +- +- if (1000 * k2 > 2245 * k0) { /* Two or more regions */ +- k1 = 2 * k0; +- +- num_bands0 = numberOfBands(bpo_div16, k0, k1, 0); +- num_bands1 = +- numberOfBands(bpo_div16, k1, k2, hHeaderData->bs_data.alterScale); +- if (num_bands0 < 1) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- if (num_bands1 < 1) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- CalcBands(diff0, k0, k1, num_bands0); +- shellsort(diff0, num_bands0); +- if (diff0[0] == 0) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- cumSum(k0, diff0, num_bands0, v_k_master); +- +- CalcBands(diff1, k1, k2, num_bands1); +- shellsort(diff1, num_bands1); +- if (diff0[num_bands0 - 1] > diff1[0]) { +- SBR_ERROR err; +- +- err = modifyBands(diff0[num_bands0 - 1], diff1, num_bands1); +- if (err) return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Add 2nd region */ +- cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); +- *numMaster = num_bands0 + num_bands1; /* Output nr of bands */ +- +- } else { /* Only one region */ +- k1 = k2; +- +- num_bands0 = numberOfBands(bpo_div16, k0, k1, 0); +- if (num_bands0 < 1) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- CalcBands(diff0, k0, k1, num_bands0); +- shellsort(diff0, num_bands0); +- if (diff0[0] == 0) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- cumSum(k0, diff0, num_bands0, v_k_master); +- *numMaster = num_bands0; /* Output nr of bands */ +- } +- } else { /* Linear mode */ +- if (hHeaderData->bs_data.alterScale == 0) { +- dk = 1; +- /* FLOOR to get to few number of bands (next lower even number) */ +- num_bands0 = (k2 - k0) & 254; +- } else { +- dk = 2; +- num_bands0 = (((k2 - k0) >> 1) + 1) & 254; /* ROUND to the closest fit */ +- } +- +- if (num_bands0 < 1) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- /* We must return already here because 'i' can become negative below. */ +- } +- +- k2_achived = k0 + num_bands0 * dk; +- k2_diff = k2 - k2_achived; +- +- for (i = 0; i < num_bands0; i++) diff_tot[i] = dk; +- +- /* If linear scale wasn't achieved */ +- /* and we got too wide SBR area */ +- if (k2_diff < 0) { +- incr = 1; +- i = 0; +- } +- +- /* If linear scale wasn't achieved */ +- /* and we got too small SBR area */ +- if (k2_diff > 0) { +- incr = -1; +- i = num_bands0 - 1; +- } +- +- /* Adjust diff vector to get sepc. SBR range */ +- while (k2_diff != 0) { +- diff_tot[i] = diff_tot[i] - incr; +- i = i + incr; +- k2_diff = k2_diff + incr; +- } +- +- cumSum(k0, diff_tot, num_bands0, v_k_master); /* cumsum */ +- *numMaster = num_bands0; /* Output nr of bands */ +- } +- +- if (*numMaster < 1) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Ref: ISO/IEC 23003-3 Cor.3, "In 7.5.5.2, add to the requirements:"*/ +- if (flags & SBRDEC_QUAD_RATE) { +- int k; +- for (k = 1; k < *numMaster; k++) { +- if (!(v_k_master[k] - v_k_master[k - 1] <= k0 - 2)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- } +- } +- +- /* +- Print out the calculated table +- */ +- +- return SBRDEC_OK; +-} +- +-/*! +- \brief Calculate frequency ratio of one SBR band +- +- All SBR bands should span a constant frequency range in the logarithmic +- domain. This function calculates the ratio of any SBR band's upper and lower +- frequency. +- +- \return num_band-th root of k_start/k_stop +-*/ +-static FIXP_SGL calcFactorPerBand(int k_start, int k_stop, int num_bands) { +- /* Scaled bandfactor and step 1 bit right to avoid overflow +- * use double data type */ +- FIXP_DBL bandfactor = FL2FXCONST_DBL(0.25f); /* Start value */ +- FIXP_DBL step = FL2FXCONST_DBL(0.125f); /* Initial increment for factor */ +- +- int direction = 1; +- +- /* Because saturation can't be done in INT IIS, +- * changed start and stop data type from FIXP_SGL to FIXP_DBL */ +- FIXP_DBL start = k_start << (DFRACT_BITS - 8); +- FIXP_DBL stop = k_stop << (DFRACT_BITS - 8); +- +- FIXP_DBL temp; +- +- int j, i = 0; +- +- while (step > FL2FXCONST_DBL(0.0f)) { +- i++; +- temp = stop; +- +- /* Calculate temp^num_bands: */ +- for (j = 0; j < num_bands; j++) +- // temp = fMult(temp,bandfactor); +- temp = fMultDiv2(temp, bandfactor) << 2; +- +- if (temp < start) { /* Factor too strong, make it weaker */ +- if (direction == 0) +- /* Halfen step. Right shift is not done as fract because otherwise the +- lowest bit cannot be cleared due to rounding */ +- step = (FIXP_DBL)((LONG)step >> 1); +- direction = 1; +- bandfactor = bandfactor + step; +- } else { /* Factor is too weak: make it stronger */ +- if (direction == 1) step = (FIXP_DBL)((LONG)step >> 1); +- direction = 0; +- bandfactor = bandfactor - step; +- } +- +- if (i > 100) { +- step = FL2FXCONST_DBL(0.0f); +- } +- } +- return FX_DBL2FX_SGL(bandfactor << 1); +-} +- +-/*! +- \brief Calculate number of SBR bands between start and stop band +- +- Given the number of bands per octave, this function calculates how many +- bands fit in the given frequency range. +- When the warpFlag is set, the 'band density' is decreased by a factor +- of 1/1.3 +- +- \return number of bands +-*/ +-static int numberOfBands( +- FIXP_SGL bpo_div16, /*!< Input: number of bands per octave divided by 16 */ +- int start, /*!< First QMF band of SBR frequency range */ +- int stop, /*!< Last QMF band of SBR frequency range + 1 */ +- int warpFlag) /*!< Stretching flag */ +-{ +- FIXP_SGL num_bands_div128; +- int num_bands; +- +- num_bands_div128 = +- FX_DBL2FX_SGL(fMult(FDK_getNumOctavesDiv8(start, stop), bpo_div16)); +- +- if (warpFlag) { +- /* Apply the warp factor of 1.3 to get wider bands. We use a value +- of 32768/25200 instead of the exact value to avoid critical cases +- of rounding. +- */ +- num_bands_div128 = FX_DBL2FX_SGL( +- fMult(num_bands_div128, FL2FXCONST_SGL(25200.0 / 32768.0))); +- } +- +- /* add scaled 1 for rounding to even numbers: */ +- num_bands_div128 = num_bands_div128 + FL2FXCONST_SGL(1.0f / 128.0f); +- /* scale back to right aligned integer and double the value: */ +- num_bands = 2 * ((LONG)num_bands_div128 >> (FRACT_BITS - 7)); +- +- return (num_bands); +-} +- +-/*! +- \brief Calculate width of SBR bands +- +- Given the desired number of bands within the SBR frequency range, +- this function calculates the width of each SBR band in QMF channels. +- The bands get wider from start to stop (bark scale). +-*/ +-static void CalcBands(UCHAR *diff, /*!< Vector of widths to be calculated */ +- UCHAR start, /*!< Lower end of subband range */ +- UCHAR stop, /*!< Upper end of subband range */ +- UCHAR num_bands) /*!< Desired number of bands */ +-{ +- int i; +- int previous; +- int current; +- FIXP_SGL exact, temp; +- FIXP_SGL bandfactor = calcFactorPerBand(start, stop, num_bands); +- +- previous = stop; /* Start with highest QMF channel */ +- exact = (FIXP_SGL)( +- stop << (FRACT_BITS - 8)); /* Shift left to gain some accuracy */ +- +- for (i = num_bands - 1; i >= 0; i--) { +- /* Calculate border of next lower sbr band */ +- exact = FX_DBL2FX_SGL(fMult(exact, bandfactor)); +- +- /* Add scaled 0.5 for rounding: +- We use a value 128/256 instead of 0.5 to avoid some critical cases of +- rounding. */ +- temp = exact + FL2FXCONST_SGL(128.0 / 32768.0); +- +- /* scale back to right alinged integer: */ +- current = (LONG)temp >> (FRACT_BITS - 8); +- +- /* Save width of band i */ +- diff[i] = previous - current; +- previous = current; +- } +-} +- +-/*! +- \brief Calculate cumulated sum vector from delta vector +-*/ +-static void cumSum(UCHAR start_value, UCHAR *diff, UCHAR length, +- UCHAR *start_adress) { +- int i; +- start_adress[0] = start_value; +- for (i = 1; i <= length; i++) +- start_adress[i] = start_adress[i - 1] + diff[i - 1]; +-} +- +-/*! +- \brief Adapt width of frequency bands in the second region +- +- If SBR spans more than 2 octaves, the upper part of a bark-frequency-scale +- is calculated separately. This function tries to avoid that the second region +- starts with a band smaller than the highest band of the first region. +-*/ +-static SBR_ERROR modifyBands(UCHAR max_band_previous, UCHAR *diff, +- UCHAR length) { +- int change = max_band_previous - diff[0]; +- +- /* Limit the change so that the last band cannot get narrower than the first +- * one */ +- if (change > (diff[length - 1] - diff[0]) >> 1) +- change = (diff[length - 1] - diff[0]) >> 1; +- +- diff[0] += change; +- diff[length - 1] -= change; +- shellsort(diff, length); +- +- return SBRDEC_OK; +-} +- +-/*! +- \brief Update high resolution frequency band table +-*/ +-static void sbrdecUpdateHiRes(UCHAR *h_hires, UCHAR *num_hires, +- UCHAR *v_k_master, UCHAR num_bands, +- UCHAR xover_band) { +- UCHAR i; +- +- *num_hires = num_bands - xover_band; +- +- for (i = xover_band; i <= num_bands; i++) { +- h_hires[i - xover_band] = v_k_master[i]; +- } +-} +- +-/*! +- \brief Build low resolution table out of high resolution table +-*/ +-static void sbrdecUpdateLoRes(UCHAR *h_lores, UCHAR *num_lores, UCHAR *h_hires, +- UCHAR num_hires) { +- UCHAR i; +- +- if ((num_hires & 1) == 0) { +- /* If even number of hires bands */ +- *num_lores = num_hires >> 1; +- /* Use every second lores=hires[0,2,4...] */ +- for (i = 0; i <= *num_lores; i++) h_lores[i] = h_hires[i * 2]; +- } else { +- /* Odd number of hires, which means xover is odd */ +- *num_lores = (num_hires + 1) >> 1; +- /* Use lores=hires[0,1,3,5 ...] */ +- h_lores[0] = h_hires[0]; +- for (i = 1; i <= *num_lores; i++) { +- h_lores[i] = h_hires[i * 2 - 1]; +- } +- } +-} +- +-/*! +- \brief Derive a low-resolution frequency-table from the master frequency +- table +-*/ +-void sbrdecDownSampleLoRes(UCHAR *v_result, UCHAR num_result, +- UCHAR *freqBandTableRef, UCHAR num_Ref) { +- int step; +- int i, j; +- int org_length, result_length; +- int v_index[MAX_FREQ_COEFFS >> 1]; +- +- /* init */ +- org_length = num_Ref; +- result_length = num_result; +- +- v_index[0] = 0; /* Always use left border */ +- i = 0; +- while (org_length > 0) { +- /* Create downsample vector */ +- i++; +- step = org_length / result_length; +- org_length = org_length - step; +- result_length--; +- v_index[i] = v_index[i - 1] + step; +- } +- +- for (j = 0; j <= i; j++) { +- /* Use downsample vector to index LoResolution vector */ +- v_result[j] = freqBandTableRef[v_index[j]]; +- } +-} +- +-/*! +- \brief Sorting routine +-*/ +-void shellsort(UCHAR *in, UCHAR n) { +- int i, j, v, w; +- int inc = 1; +- +- do +- inc = 3 * inc + 1; +- while (inc <= n); +- +- do { +- inc = inc / 3; +- for (i = inc; i < n; i++) { +- v = in[i]; +- j = i; +- while ((w = in[j - inc]) > v) { +- in[j] = w; +- j -= inc; +- if (j < inc) break; +- } +- in[j] = v; +- } +- } while (inc > 1); +-} +- +-/*! +- \brief Reset frequency band tables +- \return errorCode, 0 if successful +-*/ +-SBR_ERROR +-resetFreqBandTables(HANDLE_SBR_HEADER_DATA hHeaderData, const UINT flags) { +- SBR_ERROR err = SBRDEC_OK; +- int k2, kx, lsb, usb; +- int intTemp; +- UCHAR nBandsLo, nBandsHi; +- HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; +- +- /* Calculate master frequency function */ +- err = sbrdecUpdateFreqScale(hFreq->v_k_master, &hFreq->numMaster, +- hHeaderData->sbrProcSmplRate, hHeaderData, flags); +- +- if (err || (hHeaderData->bs_info.xover_band > hFreq->numMaster)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Derive Hiresolution from master frequency function */ +- sbrdecUpdateHiRes(hFreq->freqBandTable[1], &nBandsHi, hFreq->v_k_master, +- hFreq->numMaster, hHeaderData->bs_info.xover_band); +- /* Derive Loresolution from Hiresolution */ +- sbrdecUpdateLoRes(hFreq->freqBandTable[0], &nBandsLo, hFreq->freqBandTable[1], +- nBandsHi); +- +- hFreq->nSfb[0] = nBandsLo; +- hFreq->nSfb[1] = nBandsHi; +- +- /* Check index to freqBandTable[0] */ +- if (!(nBandsLo > 0) || +- (nBandsLo > (((hHeaderData->numberOfAnalysisBands == 16) +- ? MAX_FREQ_COEFFS_QUAD_RATE +- : MAX_FREQ_COEFFS_DUAL_RATE) >> +- 1))) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- lsb = hFreq->freqBandTable[0][0]; +- usb = hFreq->freqBandTable[0][nBandsLo]; +- +- /* Check for start frequency border k_x: +- - ISO/IEC 14496-3 4.6.18.3.6 Requirements +- - ISO/IEC 23003-3 7.5.5.2 Modifications and additions to the MPEG-4 SBR +- tool +- */ +- /* Note that lsb > as hHeaderData->numberOfAnalysisBands is a valid SBR config +- * for 24 band QMF analysis. */ +- if ((lsb > ((flags & SBRDEC_QUAD_RATE) ? 16 : (32))) || (lsb >= usb)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Calculate number of noise bands */ +- +- k2 = hFreq->freqBandTable[1][nBandsHi]; +- kx = hFreq->freqBandTable[1][0]; +- +- if (hHeaderData->bs_data.noise_bands == 0) { +- hFreq->nNfb = 1; +- } else /* Calculate no of noise bands 1,2 or 3 bands/octave */ +- { +- /* Fetch number of octaves divided by 32 */ +- intTemp = (LONG)FDK_getNumOctavesDiv8(kx, k2) >> 2; +- +- /* Integer-Multiplication with number of bands: */ +- intTemp = intTemp * hHeaderData->bs_data.noise_bands; +- +- /* Add scaled 0.5 for rounding: */ +- intTemp = intTemp + (LONG)FL2FXCONST_SGL(0.5f / 32.0f); +- +- /* Convert to right-aligned integer: */ +- intTemp = intTemp >> (FRACT_BITS - 1 /*sign*/ - 5 /* rescale */); +- +- if (intTemp == 0) intTemp = 1; +- +- hFreq->nNfb = intTemp; +- } +- +- hFreq->nInvfBands = hFreq->nNfb; +- +- if (hFreq->nNfb > MAX_NOISE_COEFFS) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- /* Get noise bands */ +- sbrdecDownSampleLoRes(hFreq->freqBandTableNoise, hFreq->nNfb, +- hFreq->freqBandTable[0], nBandsLo); +- +- /* save old highband; required for overlap in usac +- when headerchange occurs at XVAR and VARX frame; */ +- hFreq->ov_highSubband = hFreq->highSubband; +- +- hFreq->lowSubband = lsb; +- hFreq->highSubband = usb; +- +- return SBRDEC_OK; +-} +diff --git a/libSBRdec/src/sbrdec_freq_sca.h b/libSBRdec/src/sbrdec_freq_sca.h +deleted file mode 100644 +index 7e6b8e8..0000000 +--- a/libSBRdec/src/sbrdec_freq_sca.h ++++ /dev/null +@@ -1,127 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Frequency scale prototypes +-*/ +-#ifndef SBRDEC_FREQ_SCA_H +-#define SBRDEC_FREQ_SCA_H +- +-#include "sbrdecoder.h" +-#include "env_extr.h" +- +-typedef enum { DUAL, QUAD } SBR_RATE; +- +-SBR_ERROR +-sbrdecUpdateFreqScale(UCHAR *v_k_master, UCHAR *numMaster, UINT fs, +- HANDLE_SBR_HEADER_DATA headerData, UINT flags); +- +-void sbrdecDownSampleLoRes(UCHAR *v_result, UCHAR num_result, +- UCHAR *freqBandTableRef, UCHAR num_Ref); +- +-void shellsort(UCHAR *in, UCHAR n); +- +-SBR_ERROR +-resetFreqBandTables(HANDLE_SBR_HEADER_DATA hHeaderData, const UINT flags); +- +-#endif +diff --git a/libSBRdec/src/sbrdecoder.cpp b/libSBRdec/src/sbrdecoder.cpp +deleted file mode 100644 +index 4bc6f69..0000000 +--- a/libSBRdec/src/sbrdecoder.cpp ++++ /dev/null +@@ -1,2023 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief SBR decoder frontend +- This module provides a frontend to the SBR decoder. The function openSBR() is +- called for initialization. The function sbrDecoder_Apply() is called for each +- frame. sbr_Apply() will call the required functions to decode the raw SBR data +- (provided by env_extr.cpp), to decode the envelope data and noise floor levels +- [decodeSbrData()], and to finally apply SBR to the current frame [sbr_dec()]. +- +- \sa sbrDecoder_Apply(), \ref documentationOverview +-*/ +- +-/*! +- \page documentationOverview Overview of important information resources and +- source code documentation +- +- As part of this documentation you can find more extensive descriptions about +- key concepts and algorithms at the following locations: +- +-

Programming

+- +- \li Buffer management: sbrDecoder_Apply() and sbr_dec() +- \li Internal scale factors to maximize SNR on fixed point processors: +- #QMF_SCALE_FACTOR \li Special mantissa-exponent format: Created in +- requantizeEnvelopeData() and used in calculateSbrEnvelope() +- +-

Algorithmic details

+- \li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref +- SBR_STANDARD_ELEMENT \li Details about the bitstream decoder: env_extr.cpp \li +- Details about the QMF filterbank and the provided polyphase implementation: +- qmf_dec.cpp \li Details about the transposer: lpp_tran.cpp \li Details about +- the envelope adjuster: env_calc.cpp +- +-*/ +- +-#include "sbrdecoder.h" +- +-#include "FDK_bitstream.h" +- +-#include "sbrdec_freq_sca.h" +-#include "env_extr.h" +-#include "sbr_dec.h" +-#include "env_dec.h" +-#include "sbr_crc.h" +-#include "sbr_ram.h" +-#include "sbr_rom.h" +-#include "lpp_tran.h" +-#include "transcendent.h" +- +-#include "FDK_crc.h" +- +-#include "sbrdec_drc.h" +- +-#include "psbitdec.h" +- +-/* Decoder library info */ +-#define SBRDECODER_LIB_VL0 3 +-#define SBRDECODER_LIB_VL1 0 +-#define SBRDECODER_LIB_VL2 0 +-#define SBRDECODER_LIB_TITLE "SBR Decoder" +-#ifdef __ANDROID__ +-#define SBRDECODER_LIB_BUILD_DATE "" +-#define SBRDECODER_LIB_BUILD_TIME "" +-#else +-#define SBRDECODER_LIB_BUILD_DATE __DATE__ +-#define SBRDECODER_LIB_BUILD_TIME __TIME__ +-#endif +- +-static void setFrameErrorFlag(SBR_DECODER_ELEMENT *pSbrElement, UCHAR value) { +- if (pSbrElement != NULL) { +- switch (value) { +- case FRAME_ERROR_ALLSLOTS: +- FDKmemset(pSbrElement->frameErrorFlag, FRAME_ERROR, +- sizeof(pSbrElement->frameErrorFlag)); +- break; +- default: +- pSbrElement->frameErrorFlag[pSbrElement->useFrameSlot] = value; +- } +- } +-} +- +-static UCHAR getHeaderSlot(UCHAR currentSlot, UCHAR hdrSlotUsage[(1) + 1]) { +- UINT occupied = 0; +- int s; +- UCHAR slot = hdrSlotUsage[currentSlot]; +- +- FDK_ASSERT((1) + 1 < 32); +- +- for (s = 0; s < (1) + 1; s++) { +- if ((hdrSlotUsage[s] == slot) && (s != slot)) { +- occupied = 1; +- break; +- } +- } +- +- if (occupied) { +- occupied = 0; +- +- for (s = 0; s < (1) + 1; s++) { +- occupied |= 1 << hdrSlotUsage[s]; +- } +- for (s = 0; s < (1) + 1; s++) { +- if (!(occupied & 0x1)) { +- slot = s; +- break; +- } +- occupied >>= 1; +- } +- } +- +- return slot; +-} +- +-static void copySbrHeader(HANDLE_SBR_HEADER_DATA hDst, +- const HANDLE_SBR_HEADER_DATA hSrc) { +- /* copy the whole header memory (including pointers) */ +- FDKmemcpy(hDst, hSrc, sizeof(SBR_HEADER_DATA)); +- +- /* update pointers */ +- hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo; +- hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi; +-} +- +-static int compareSbrHeader(const HANDLE_SBR_HEADER_DATA hHdr1, +- const HANDLE_SBR_HEADER_DATA hHdr2) { +- int result = 0; +- +- /* compare basic data */ +- result |= (hHdr1->syncState != hHdr2->syncState) ? 1 : 0; +- result |= (hHdr1->status != hHdr2->status) ? 1 : 0; +- result |= (hHdr1->frameErrorFlag != hHdr2->frameErrorFlag) ? 1 : 0; +- result |= (hHdr1->numberTimeSlots != hHdr2->numberTimeSlots) ? 1 : 0; +- result |= +- (hHdr1->numberOfAnalysisBands != hHdr2->numberOfAnalysisBands) ? 1 : 0; +- result |= (hHdr1->timeStep != hHdr2->timeStep) ? 1 : 0; +- result |= (hHdr1->sbrProcSmplRate != hHdr2->sbrProcSmplRate) ? 1 : 0; +- +- /* compare bitstream data */ +- result |= +- FDKmemcmp(&hHdr1->bs_data, &hHdr2->bs_data, sizeof(SBR_HEADER_DATA_BS)); +- result |= +- FDKmemcmp(&hHdr1->bs_dflt, &hHdr2->bs_dflt, sizeof(SBR_HEADER_DATA_BS)); +- result |= FDKmemcmp(&hHdr1->bs_info, &hHdr2->bs_info, +- sizeof(SBR_HEADER_DATA_BS_INFO)); +- +- /* compare frequency band data */ +- result |= FDKmemcmp(&hHdr1->freqBandData, &hHdr2->freqBandData, +- (8 + MAX_NUM_LIMITERS + 1) * sizeof(UCHAR)); +- result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableLo, +- hHdr2->freqBandData.freqBandTableLo, +- (MAX_FREQ_COEFFS / 2 + 1) * sizeof(UCHAR)); +- result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableHi, +- hHdr2->freqBandData.freqBandTableHi, +- (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR)); +- result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableNoise, +- hHdr2->freqBandData.freqBandTableNoise, +- (MAX_NOISE_COEFFS + 1) * sizeof(UCHAR)); +- result |= +- FDKmemcmp(hHdr1->freqBandData.v_k_master, hHdr2->freqBandData.v_k_master, +- (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR)); +- +- return result; +-} +- +-/*! +- \brief Reset SBR decoder. +- +- Reset should only be called if SBR has been sucessfully detected by +- an appropriate checkForPayload() function. +- +- \return Error code. +-*/ +-static SBR_ERROR sbrDecoder_ResetElement(HANDLE_SBRDECODER self, +- int sampleRateIn, int sampleRateOut, +- int samplesPerFrame, +- const MP4_ELEMENT_ID elementID, +- const int elementIndex, +- const int overlap) { +- SBR_ERROR sbrError = SBRDEC_OK; +- HANDLE_SBR_HEADER_DATA hSbrHeader; +- UINT qmfFlags = 0; +- +- int i, synDownsampleFac; +- +- /* USAC: assuming theoretical case 8 kHz output sample rate with 4:1 SBR */ +- const int sbr_min_sample_rate_in = IS_USAC(self->coreCodec) ? 2000 : 6400; +- +- /* Check in/out samplerates */ +- if (sampleRateIn < sbr_min_sample_rate_in || sampleRateIn > (96000)) { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- if (sampleRateOut > (96000)) { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- /* Set QMF mode flags */ +- if (self->flags & SBRDEC_LOW_POWER) qmfFlags |= QMF_FLAG_LP; +- +- if (self->coreCodec == AOT_ER_AAC_ELD) { +- if (self->flags & SBRDEC_LD_MPS_QMF) { +- qmfFlags |= QMF_FLAG_MPSLDFB; +- } else { +- qmfFlags |= QMF_FLAG_CLDFB; +- } +- } +- +- /* Set downsampling factor for synthesis filter bank */ +- if (sampleRateOut == 0) { +- /* no single rate mode */ +- sampleRateOut = +- sampleRateIn +- << 1; /* In case of implicit signalling, assume dual rate SBR */ +- } +- +- if (sampleRateIn == sampleRateOut) { +- synDownsampleFac = 2; +- self->flags |= SBRDEC_DOWNSAMPLE; +- } else { +- synDownsampleFac = 1; +- self->flags &= ~SBRDEC_DOWNSAMPLE; +- } +- +- self->synDownsampleFac = synDownsampleFac; +- self->sampleRateOut = sampleRateOut; +- +- { +- for (i = 0; i < (1) + 1; i++) { +- int setDflt; +- hSbrHeader = &(self->sbrHeader[elementIndex][i]); +- setDflt = ((hSbrHeader->syncState == SBR_NOT_INITIALIZED) || +- (self->flags & SBRDEC_FORCE_RESET)) +- ? 1 +- : 0; +- +- /* init a default header such that we can at least do upsampling later */ +- sbrError = initHeaderData(hSbrHeader, sampleRateIn, sampleRateOut, +- self->downscaleFactor, samplesPerFrame, +- self->flags, setDflt); +- +- /* Set synchState to UPSAMPLING in case it already is initialized */ +- hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING +- ? UPSAMPLING +- : hSbrHeader->syncState; +- } +- } +- +- if (sbrError != SBRDEC_OK) { +- goto bail; +- } +- +- if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) { +- self->pQmfDomain->globalConf.flags_requested |= qmfFlags; +- self->pQmfDomain->globalConf.nBandsAnalysis_requested = +- self->sbrHeader[elementIndex][0].numberOfAnalysisBands; +- self->pQmfDomain->globalConf.nBandsSynthesis_requested = +- (synDownsampleFac == 1) ? 64 : 32; /* may be overwritten by MPS */ +- self->pQmfDomain->globalConf.nBandsSynthesis_requested /= +- self->downscaleFactor; +- self->pQmfDomain->globalConf.nQmfTimeSlots_requested = +- self->sbrHeader[elementIndex][0].numberTimeSlots * +- self->sbrHeader[elementIndex][0].timeStep; +- self->pQmfDomain->globalConf.nQmfOvTimeSlots_requested = overlap; +- self->pQmfDomain->globalConf.nQmfProcBands_requested = 64; /* always 64 */ +- self->pQmfDomain->globalConf.nQmfProcChannels_requested = +- 1; /* may be overwritten by MPS */ +- } +- +- /* Init SBR channels going to be assigned to a SBR element */ +- { +- int ch; +- for (ch = 0; ch < self->pSbrElement[elementIndex]->nChannels; ch++) { +- int headerIndex = +- getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, +- self->pSbrElement[elementIndex]->useHeaderSlot); +- +- /* and create sbrDec */ +- sbrError = +- createSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch], +- &self->sbrHeader[elementIndex][headerIndex], +- &self->pSbrElement[elementIndex]->transposerSettings, +- synDownsampleFac, qmfFlags, self->flags, overlap, ch, +- self->codecFrameSize); +- +- if (sbrError != SBRDEC_OK) { +- goto bail; +- } +- } +- } +- +- // FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer)); +- +- if (self->numSbrElements == 1) { +- switch (self->coreCodec) { +- case AOT_AAC_LC: +- case AOT_SBR: +- case AOT_PS: +- case AOT_ER_AAC_SCAL: +- case AOT_DRM_AAC: +- case AOT_DRM_SURROUND: +- if (CreatePsDec(&self->hParametricStereoDec, samplesPerFrame)) { +- sbrError = SBRDEC_CREATE_ERROR; +- goto bail; +- } +- break; +- default: +- break; +- } +- } +- +- /* Init frame delay slot handling */ +- self->pSbrElement[elementIndex]->useFrameSlot = 0; +- for (i = 0; i < ((1) + 1); i++) { +- self->pSbrElement[elementIndex]->useHeaderSlot[i] = i; +- } +- +-bail: +- +- return sbrError; +-} +- +-/*! +- \brief Assign QMF domain provided QMF channels to SBR channels. +- +- \return void +-*/ +-static void sbrDecoder_AssignQmfChannels2SbrChannels(HANDLE_SBRDECODER self) { +- int ch, el, absCh_offset = 0; +- for (el = 0; el < self->numSbrElements; el++) { +- if (self->pSbrElement[el] != NULL) { +- for (ch = 0; ch < self->pSbrElement[el]->nChannels; ch++) { +- FDK_ASSERT(((absCh_offset + ch) < ((8) + (1))) && +- ((absCh_offset + ch) < ((8) + (1)))); +- self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainInCh = +- &self->pQmfDomain->QmfDomainIn[absCh_offset + ch]; +- self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainOutCh = +- &self->pQmfDomain->QmfDomainOut[absCh_offset + ch]; +- } +- absCh_offset += self->pSbrElement[el]->nChannels; +- } +- } +-} +- +-SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain) { +- HANDLE_SBRDECODER self = NULL; +- SBR_ERROR sbrError = SBRDEC_OK; +- int elIdx; +- +- if ((pSelf == NULL) || (pQmfDomain == NULL)) { +- return SBRDEC_INVALID_ARGUMENT; +- } +- +- /* Get memory for this instance */ +- self = GetRam_SbrDecoder(); +- if (self == NULL) { +- sbrError = SBRDEC_MEM_ALLOC_FAILED; +- goto bail; +- } +- +- self->pQmfDomain = pQmfDomain; +- +- /* +- Already zero because of calloc +- self->numSbrElements = 0; +- self->numSbrChannels = 0; +- self->codecFrameSize = 0; +- */ +- +- self->numDelayFrames = (1); /* set to the max value by default */ +- +- /* Initialize header sync state */ +- for (elIdx = 0; elIdx < (8); elIdx += 1) { +- int i; +- for (i = 0; i < (1) + 1; i += 1) { +- self->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED; +- } +- } +- +- *pSelf = self; +- +-bail: +- return sbrError; +-} +- +-/** +- * \brief determine if the given core codec AOT can be processed or not. +- * \param coreCodec core codec audio object type. +- * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied. +- */ +-static int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) { +- switch (coreCodec) { +- case AOT_AAC_LC: +- case AOT_SBR: +- case AOT_PS: +- case AOT_ER_AAC_SCAL: +- case AOT_ER_AAC_ELD: +- case AOT_DRM_AAC: +- case AOT_DRM_SURROUND: +- case AOT_USAC: +- return 1; +- default: +- return 0; +- } +-} +- +-static void sbrDecoder_DestroyElement(HANDLE_SBRDECODER self, +- const int elementIndex) { +- if (self->pSbrElement[elementIndex] != NULL) { +- int ch; +- +- for (ch = 0; ch < SBRDEC_MAX_CH_PER_ELEMENT; ch++) { +- if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { +- deleteSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch]); +- FreeRam_SbrDecChannel( +- &self->pSbrElement[elementIndex]->pSbrChannel[ch]); +- self->numSbrChannels -= 1; +- } +- } +- FreeRam_SbrDecElement(&self->pSbrElement[elementIndex]); +- self->numSbrElements -= 1; +- } +-} +- +-SBR_ERROR sbrDecoder_InitElement( +- HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, +- const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, const int elementIndex, +- const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor) { +- SBR_ERROR sbrError = SBRDEC_OK; +- int chCnt = 0; +- int nSbrElementsStart; +- int nSbrChannelsStart; +- if (self == NULL) { +- return SBRDEC_INVALID_ARGUMENT; +- } +- +- nSbrElementsStart = self->numSbrElements; +- nSbrChannelsStart = self->numSbrChannels; +- +- /* Check core codec AOT */ +- if (!sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- if (elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE) { +- sbrError = SBRDEC_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- if (self->sampleRateIn == sampleRateIn && +- self->codecFrameSize == samplesPerFrame && self->coreCodec == coreCodec && +- self->pSbrElement[elementIndex] != NULL && +- self->pSbrElement[elementIndex]->elementID == elementID && +- !(self->flags & SBRDEC_FORCE_RESET) && +- ((sampleRateOut == 0) ? 1 : (self->sampleRateOut == sampleRateOut)) && +- ((harmonicSBR == 2) ? 1 +- : (self->harmonicSBR == +- harmonicSBR)) /* The value 2 signalizes that +- harmonicSBR shall be ignored in +- the config change detection */ +- ) { +- /* Nothing to do */ +- return SBRDEC_OK; +- } else { +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- *configChanged = 1; +- } +- } +- +- /* reaching this point the SBR-decoder gets (re-)configured */ +- +- /* The flags field is used for all elements! */ +- self->flags &= +- (SBRDEC_FORCE_RESET | SBRDEC_FLUSH); /* Keep the global flags. They will +- be reset after decoding. */ +- self->flags |= (downscaleFactor > 1) ? SBRDEC_ELD_DOWNSCALE : 0; +- self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0; +- self->flags |= (coreCodec == AOT_ER_AAC_SCAL) ? SBRDEC_SYNTAX_SCAL : 0; +- self->flags |= +- (coreCodec == AOT_DRM_AAC) ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM : 0; +- self->flags |= (coreCodec == AOT_DRM_SURROUND) +- ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM +- : 0; +- self->flags |= (coreCodec == AOT_USAC) ? SBRDEC_SYNTAX_USAC : 0; +- /* Robustness: Take integer division rounding into consideration. E.g. 22050 +- * Hz with 4:1 SBR => 5512 Hz core sampling rate. */ +- self->flags |= (sampleRateIn == sampleRateOut / 4) ? SBRDEC_QUAD_RATE : 0; +- self->flags |= (harmonicSBR == 1) ? SBRDEC_USAC_HARMONICSBR : 0; +- +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- return SBRDEC_OK; +- } +- +- self->sampleRateIn = sampleRateIn; +- self->codecFrameSize = samplesPerFrame; +- self->coreCodec = coreCodec; +- self->harmonicSBR = harmonicSBR; +- self->downscaleFactor = downscaleFactor; +- +- /* Init SBR elements */ +- { +- int elChannels, ch; +- +- if (self->pSbrElement[elementIndex] == NULL) { +- self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex); +- if (self->pSbrElement[elementIndex] == NULL) { +- sbrError = SBRDEC_MEM_ALLOC_FAILED; +- goto bail; +- } +- self->numSbrElements++; +- } else { +- self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels; +- } +- +- /* Save element ID for sanity checks and to have a fallback for concealment. +- */ +- self->pSbrElement[elementIndex]->elementID = elementID; +- +- /* Determine amount of channels for this element */ +- switch (elementID) { +- case ID_NONE: +- case ID_CPE: +- elChannels = 2; +- break; +- case ID_LFE: +- case ID_SCE: +- elChannels = 1; +- break; +- default: +- elChannels = 0; +- break; +- } +- +- /* Handle case of Parametric Stereo */ +- if (elementIndex == 0 && elementID == ID_SCE) { +- switch (coreCodec) { +- case AOT_AAC_LC: +- case AOT_SBR: +- case AOT_PS: +- case AOT_ER_AAC_SCAL: +- case AOT_DRM_AAC: +- case AOT_DRM_SURROUND: +- elChannels = 2; +- break; +- default: +- break; +- } +- } +- +- /* Sanity check to avoid memory leaks */ +- if (elChannels < self->pSbrElement[elementIndex]->nChannels) { +- self->numSbrChannels += self->pSbrElement[elementIndex]->nChannels; +- sbrError = SBRDEC_PARSE_ERROR; +- goto bail; +- } +- +- self->pSbrElement[elementIndex]->nChannels = elChannels; +- +- for (ch = 0; ch < elChannels; ch++) { +- if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { +- self->pSbrElement[elementIndex]->pSbrChannel[ch] = +- GetRam_SbrDecChannel(chCnt); +- if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { +- sbrError = SBRDEC_MEM_ALLOC_FAILED; +- goto bail; +- } +- } +- self->numSbrChannels++; +- +- sbrDecoder_drcInitChannel(&self->pSbrElement[elementIndex] +- ->pSbrChannel[ch] +- ->SbrDec.sbrDrcChannel); +- +- chCnt++; +- } +- } +- +- if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) { +- self->pQmfDomain->globalConf.nInputChannels_requested = +- self->numSbrChannels; +- self->pQmfDomain->globalConf.nOutputChannels_requested = +- fMax((INT)self->numSbrChannels, +- (INT)self->pQmfDomain->globalConf.nOutputChannels_requested); +- } +- +- /* Make sure each SBR channel has one QMF channel assigned even if +- * numSbrChannels or element set-up has changed. */ +- sbrDecoder_AssignQmfChannels2SbrChannels(self); +- +- /* clear error flags for all delay slots */ +- FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, +- ((1) + 1) * sizeof(UCHAR)); +- +- { +- int overlap; +- +- if (coreCodec == AOT_ER_AAC_ELD) { +- overlap = 0; +- } else if (self->flags & SBRDEC_QUAD_RATE) { +- overlap = (3 * 4); +- } else { +- overlap = (3 * 2); +- } +- /* Initialize this instance */ +- sbrError = sbrDecoder_ResetElement(self, sampleRateIn, sampleRateOut, +- samplesPerFrame, elementID, elementIndex, +- overlap); +- } +- +-bail: +- if (sbrError != SBRDEC_OK) { +- if ((nSbrElementsStart < self->numSbrElements) || +- (nSbrChannelsStart < self->numSbrChannels)) { +- /* Free the memory allocated for this element */ +- sbrDecoder_DestroyElement(self, elementIndex); +- } else if ((elementIndex < (8)) && +- (self->pSbrElement[elementIndex] != +- NULL)) { /* Set error flag to trigger concealment */ +- setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); +- } +- } +- +- return sbrError; +-} +- +-/** +- * \brief Free config dependent SBR memory. +- * \param self SBR decoder instance handle +- */ +-SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self) { +- int i; +- int elIdx; +- +- if (self != NULL && *self != NULL) { +- for (i = 0; i < (8); i++) { +- sbrDecoder_DestroyElement(*self, i); +- } +- +- for (elIdx = 0; elIdx < (8); elIdx += 1) { +- for (i = 0; i < (1) + 1; i += 1) { +- (*self)->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED; +- } +- } +- } +- +- return SBRDEC_OK; +-} +- +-/** +- * \brief Apply decoded SBR header for one element. +- * \param self SBR decoder instance handle +- * \param hSbrHeader SBR header handle to be processed. +- * \param hSbrChannel pointer array to the SBR element channels corresponding to +- * the SBR header. +- * \param headerStatus header status value returned from SBR header parser. +- * \param numElementChannels amount of channels for the SBR element whos header +- * is to be processed. +- */ +-static SBR_ERROR sbrDecoder_HeaderUpdate(HANDLE_SBRDECODER self, +- HANDLE_SBR_HEADER_DATA hSbrHeader, +- SBR_HEADER_STATUS headerStatus, +- HANDLE_SBR_CHANNEL hSbrChannel[], +- const int numElementChannels) { +- SBR_ERROR errorStatus = SBRDEC_OK; +- +- /* +- change of control data, reset decoder +- */ +- errorStatus = resetFreqBandTables(hSbrHeader, self->flags); +- +- if (errorStatus == SBRDEC_OK) { +- if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET) { +-#if (SBRDEC_MAX_HB_FADE_FRAMES > 0) +- int ch; +- for (ch = 0; ch < numElementChannels; ch += 1) { +- hSbrChannel[ch]->SbrDec.highBandFadeCnt = SBRDEC_MAX_HB_FADE_FRAMES; +- } +- +-#endif +- /* As the default header would limit the frequency range, +- lowSubband and highSubband must be patched. */ +- hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands; +- hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands; +- } +- +- /* Trigger a reset before processing this slot */ +- hSbrHeader->status |= SBRDEC_HDR_STAT_RESET; +- } +- +- return errorStatus; +-} +- +-INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, +- const INT sampleRateIn, const INT sampleRateOut, +- const INT samplesPerFrame, +- const AUDIO_OBJECT_TYPE coreCodec, +- const MP4_ELEMENT_ID elementID, const INT elementIndex, +- const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, +- const UCHAR configMode, UCHAR *configChanged, +- const INT downscaleFactor) { +- SBR_HEADER_STATUS headerStatus; +- HANDLE_SBR_HEADER_DATA hSbrHeader; +- SBR_ERROR sbrError = SBRDEC_OK; +- int headerIndex; +- UINT flagsSaved = +- 0; /* flags should not be changed in AC_CM_DET_CFG_CHANGE - mode after +- parsing */ +- +- if (self == NULL || elementIndex >= (8)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- if (!sbrDecoder_isCoreCodecValid(coreCodec)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- flagsSaved = self->flags; /* store */ +- } +- +- sbrError = sbrDecoder_InitElement( +- self, sampleRateIn, sampleRateOut, samplesPerFrame, coreCodec, elementID, +- elementIndex, harmonicSBR, stereoConfigIndex, configMode, configChanged, +- downscaleFactor); +- +- if ((sbrError != SBRDEC_OK) || (elementID == ID_LFE)) { +- goto bail; +- } +- +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- hSbrHeader = NULL; +- } else { +- headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, +- self->pSbrElement[elementIndex]->useHeaderSlot); +- +- hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); +- } +- +- headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 0, configMode); +- +- if (coreCodec == AOT_USAC) { +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- self->flags = flagsSaved; /* restore */ +- } +- return sbrError; +- } +- +- if (configMode & AC_CM_ALLOC_MEM) { +- SBR_DECODER_ELEMENT *pSbrElement; +- +- pSbrElement = self->pSbrElement[elementIndex]; +- +- /* Sanity check */ +- if (pSbrElement != NULL) { +- if ((elementID == ID_CPE && pSbrElement->nChannels != 2) || +- (elementID != ID_CPE && pSbrElement->nChannels != 1)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- if (headerStatus == HEADER_RESET) { +- sbrError = sbrDecoder_HeaderUpdate(self, hSbrHeader, headerStatus, +- pSbrElement->pSbrChannel, +- pSbrElement->nChannels); +- +- if (sbrError == SBRDEC_OK) { +- hSbrHeader->syncState = SBR_HEADER; +- hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; +- } +- /* else { +- Since we already have overwritten the old SBR header the only way out +- is UPSAMPLING! This will be prepared in the next step. +- } */ +- } +- } +- } +-bail: +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- self->flags = flagsSaved; /* restore */ +- } +- return sbrError; +-} +- +-SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param, +- const INT value) { +- SBR_ERROR errorStatus = SBRDEC_OK; +- +- /* configure the subsystems */ +- switch (param) { +- case SBR_SYSTEM_BITSTREAM_DELAY: +- if (value < 0 || value > (1)) { +- errorStatus = SBRDEC_SET_PARAM_FAIL; +- break; +- } +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- self->numDelayFrames = (UCHAR)value; +- } +- break; +- case SBR_QMF_MODE: +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- if (value == 1) { +- self->flags |= SBRDEC_LOW_POWER; +- } else { +- self->flags &= ~SBRDEC_LOW_POWER; +- } +- } +- break; +- case SBR_LD_QMF_TIME_ALIGN: +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- if (value == 1) { +- self->flags |= SBRDEC_LD_MPS_QMF; +- } else { +- self->flags &= ~SBRDEC_LD_MPS_QMF; +- } +- } +- break; +- case SBR_FLUSH_DATA: +- if (value != 0) { +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- self->flags |= SBRDEC_FLUSH; +- } +- } +- break; +- case SBR_CLEAR_HISTORY: +- if (value != 0) { +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- self->flags |= SBRDEC_FORCE_RESET; +- } +- } +- break; +- case SBR_BS_INTERRUPTION: { +- int elementIndex; +- +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- break; +- } +- +- /* Loop over SBR elements */ +- for (elementIndex = 0; elementIndex < self->numSbrElements; +- elementIndex++) { +- if (self->pSbrElement[elementIndex] != NULL) { +- HANDLE_SBR_HEADER_DATA hSbrHeader; +- int headerIndex = +- getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, +- self->pSbrElement[elementIndex]->useHeaderSlot); +- +- hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); +- +- /* Set sync state UPSAMPLING for the corresponding slot. +- This switches off bitstream parsing until a new header arrives. */ +- hSbrHeader->syncState = UPSAMPLING; +- hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; +- } +- } +- } break; +- +- case SBR_SKIP_QMF: +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- } else { +- if (value == 1) { +- self->flags |= SBRDEC_SKIP_QMF_ANA; +- } else { +- self->flags &= ~SBRDEC_SKIP_QMF_ANA; +- } +- if (value == 2) { +- self->flags |= SBRDEC_SKIP_QMF_SYN; +- } else { +- self->flags &= ~SBRDEC_SKIP_QMF_SYN; +- } +- } +- break; +- default: +- errorStatus = SBRDEC_SET_PARAM_FAIL; +- break; +- } /* switch(param) */ +- +- return (errorStatus); +-} +- +-static SBRDEC_DRC_CHANNEL *sbrDecoder_drcGetChannel( +- const HANDLE_SBRDECODER self, const INT channel) { +- SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; +- int elementIndex, elChanIdx = 0, numCh = 0; +- +- for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel); +- elementIndex++) { +- SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex]; +- int c, elChannels; +- +- elChanIdx = 0; +- if (pSbrElement == NULL) break; +- +- /* Determine amount of channels for this element */ +- switch (pSbrElement->elementID) { +- case ID_CPE: +- elChannels = 2; +- break; +- case ID_LFE: +- case ID_SCE: +- elChannels = 1; +- break; +- case ID_NONE: +- default: +- elChannels = 0; +- break; +- } +- +- /* Limit with actual allocated element channels */ +- elChannels = fMin(elChannels, pSbrElement->nChannels); +- +- for (c = 0; (c < elChannels) && (numCh <= channel); c++) { +- if (pSbrElement->pSbrChannel[elChanIdx] != NULL) { +- numCh++; +- elChanIdx++; +- } +- } +- } +- elementIndex -= 1; +- elChanIdx -= 1; +- +- if (elChanIdx < 0 || elementIndex < 0) { +- return NULL; +- } +- +- if (self->pSbrElement[elementIndex] != NULL) { +- if (self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL) { +- pSbrDrcChannelData = &self->pSbrElement[elementIndex] +- ->pSbrChannel[elChanIdx] +- ->SbrDec.sbrDrcChannel; +- } +- } +- +- return (pSbrDrcChannelData); +-} +- +-SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch, +- UINT numBands, FIXP_DBL *pNextFact_mag, +- INT nextFact_exp, +- SHORT drcInterpolationScheme, +- UCHAR winSequence, USHORT *pBandTop) { +- SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; +- int band, isValidData = 0; +- +- if (self == NULL) { +- return SBRDEC_NOT_INITIALIZED; +- } +- if (ch > (8) || pNextFact_mag == NULL) { +- return SBRDEC_SET_PARAM_FAIL; +- } +- +- /* Search for gain values different to 1.0f */ +- for (band = 0; band < (int)numBands; band += 1) { +- if (!((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && +- (nextFact_exp == 1)) && +- !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && +- (nextFact_exp == 0))) { +- isValidData = 1; +- break; +- } +- } +- +- /* Find the right SBR channel */ +- pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); +- +- if (pSbrDrcChannelData != NULL) { +- if (pSbrDrcChannelData->enable || +- isValidData) { /* Activate processing only with real and valid data */ +- int i; +- +- pSbrDrcChannelData->enable = 1; +- pSbrDrcChannelData->numBandsNext = numBands; +- +- pSbrDrcChannelData->winSequenceNext = winSequence; +- pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme; +- pSbrDrcChannelData->nextFact_exp = nextFact_exp; +- +- for (i = 0; i < (int)numBands; i++) { +- pSbrDrcChannelData->bandTopNext[i] = pBandTop[i]; +- pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; +- } +- } +- } +- +- return SBRDEC_OK; +-} +- +-void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch) { +- SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; +- +- if ((self == NULL) || (ch > (8)) || (self->numSbrElements == 0) || +- (self->numSbrChannels == 0)) { +- return; +- } +- +- /* Find the right SBR channel */ +- pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch); +- +- if (pSbrDrcChannelData != NULL) { +- sbrDecoder_drcInitChannel(pSbrDrcChannelData); +- } +-} +- +-SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, +- UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize, +- int *count, int bsPayLen, int crcFlag, +- MP4_ELEMENT_ID prevElement, int elementIndex, +- UINT acFlags, UINT acElFlags[]) { +- SBR_DECODER_ELEMENT *hSbrElement = NULL; +- HANDLE_SBR_HEADER_DATA hSbrHeader = NULL; +- HANDLE_SBR_CHANNEL *pSbrChannel; +- +- SBR_FRAME_DATA *hFrameDataLeft = NULL; +- SBR_FRAME_DATA *hFrameDataRight = NULL; +- SBR_FRAME_DATA frameDataLeftCopy; +- SBR_FRAME_DATA frameDataRightCopy; +- +- SBR_ERROR errorStatus = SBRDEC_OK; +- SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; +- +- INT startPos = FDKgetValidBits(hBs); +- INT CRCLen = 0; +- HANDLE_FDK_BITSTREAM hBsOriginal = hBs; +- FDK_BITSTREAM bsBwd; +- +- FDK_CRCINFO crcInfo; +- INT crcReg = 0; +- USHORT drmSbrCrc = 0; +- const int fGlobalIndependencyFlag = acFlags & AC_INDEP; +- const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC; +- const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES; +- int stereo; +- int fDoDecodeSbrData = 1; +- +- int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0; +- +- if (*count <= 0) { +- setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); +- return SBRDEC_OK; +- } +- +- /* SBR sanity checks */ +- if (self == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- goto bail; +- } +- +- /* Reverse bits of DRM SBR payload */ +- if ((self->flags & SBRDEC_SYNTAX_DRM) && *count > 0) { +- int dataBytes, dataBits; +- +- FDK_ASSERT(drmBsBufferSize >= (512)); +- dataBits = *count; +- +- if (dataBits > ((512) * 8)) { +- /* do not flip more data than needed */ +- dataBits = (512) * 8; +- } +- +- dataBytes = (dataBits + 7) >> 3; +- +- int j; +- +- if ((j = (int)FDKgetValidBits(hBs)) != 8) { +- FDKpushBiDirectional(hBs, (j - 8)); +- } +- +- j = 0; +- for (; dataBytes > 0; dataBytes--) { +- int i; +- UCHAR tmpByte; +- UCHAR buffer = 0x00; +- +- tmpByte = (UCHAR)FDKreadBits(hBs, 8); +- for (i = 0; i < 4; i++) { +- int shift = 2 * i + 1; +- buffer |= (tmpByte & (0x08 >> i)) << shift; +- buffer |= (tmpByte & (0x10 << i)) >> shift; +- } +- pDrmBsBuffer[j++] = buffer; +- FDKpushBack(hBs, 16); +- } +- +- FDKinitBitStream(&bsBwd, pDrmBsBuffer, (512), dataBits, BS_READER); +- +- /* Use reversed data */ +- hBs = &bsBwd; +- bsPayLen = *count; +- } +- +- /* Remember start position of SBR element */ +- startPos = FDKgetValidBits(hBs); +- +- /* SBR sanity checks */ +- if (self->pSbrElement[elementIndex] == NULL) { +- errorStatus = SBRDEC_NOT_INITIALIZED; +- goto bail; +- } +- hSbrElement = self->pSbrElement[elementIndex]; +- +- lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot - 1 +- : self->numDelayFrames; +- lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot]; +- thisHdrSlot = getHeaderSlot( +- hSbrElement->useFrameSlot, +- hSbrElement->useHeaderSlot); /* Get a free header slot not used by +- frames not processed yet. */ +- +- /* Assign the free slot to store a new header if there is one. */ +- hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot]; +- +- pSbrChannel = hSbrElement->pSbrChannel; +- stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; +- +- hFrameDataLeft = &self->pSbrElement[elementIndex] +- ->pSbrChannel[0] +- ->frameData[hSbrElement->useFrameSlot]; +- if (stereo) { +- hFrameDataRight = &self->pSbrElement[elementIndex] +- ->pSbrChannel[1] +- ->frameData[hSbrElement->useFrameSlot]; +- } +- +- /* store frameData; new parsed frameData possibly corrupted */ +- FDKmemcpy(&frameDataLeftCopy, hFrameDataLeft, sizeof(SBR_FRAME_DATA)); +- if (stereo) { +- FDKmemcpy(&frameDataRightCopy, hFrameDataRight, sizeof(SBR_FRAME_DATA)); +- } +- +- /* reset PS flag; will be set after PS was found */ +- self->flags &= ~SBRDEC_PS_DECODED; +- +- if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) { +- /* Got a new header from extern (e.g. from an ASC) */ +- headerStatus = HEADER_OK; +- hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE; +- } else if (thisHdrSlot != lastHdrSlot) { +- /* Copy the last header into this slot otherwise the +- header compare will trigger more HEADER_RESETs than needed. */ +- copySbrHeader(hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot]); +- } +- +- /* +- Check if bit stream data is valid and matches the element context +- */ +- if (((prevElement != ID_SCE) && (prevElement != ID_CPE)) || +- prevElement != hSbrElement->elementID) { +- /* In case of LFE we also land here, since there is no LFE SBR element (do +- * upsampling only) */ +- fDoDecodeSbrData = 0; +- } +- +- if (fDoDecodeSbrData) { +- if ((INT)FDKgetValidBits(hBs) <= 0) { +- fDoDecodeSbrData = 0; +- } +- } +- +- /* +- SBR CRC-check +- */ +- if (fDoDecodeSbrData) { +- if (crcFlag) { +- switch (self->coreCodec) { +- case AOT_ER_AAC_ELD: +- FDKpushFor(hBs, 10); +- /* check sbrcrc later: we don't know the payload length now */ +- break; +- case AOT_DRM_AAC: +- case AOT_DRM_SURROUND: +- drmSbrCrc = (USHORT)FDKreadBits(hBs, 8); +- /* Setup CRC decoder */ +- FDKcrcInit(&crcInfo, 0x001d, 0xFFFF, 8); +- /* Start CRC region */ +- crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); +- break; +- default: +- CRCLen = bsPayLen - 10; /* change: 0 => i */ +- if (CRCLen < 0) { +- fDoDecodeSbrData = 0; +- } else { +- fDoDecodeSbrData = SbrCrcCheck(hBs, CRCLen); +- } +- break; +- } +- } +- } /* if (fDoDecodeSbrData) */ +- +- /* +- Read in the header data and issue a reset if change occured +- */ +- if (fDoDecodeSbrData) { +- int sbrHeaderPresent; +- +- if (self->flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) { +- SBR_HEADER_DATA_BS_INFO newSbrInfo; +- int sbrInfoPresent; +- +- if (bs_interTes) { +- self->flags |= SBRDEC_USAC_ITES; +- } else { +- self->flags &= ~SBRDEC_USAC_ITES; +- } +- +- if (fGlobalIndependencyFlag) { +- self->flags |= SBRDEC_USAC_INDEP; +- sbrInfoPresent = 1; +- sbrHeaderPresent = 1; +- } else { +- self->flags &= ~SBRDEC_USAC_INDEP; +- sbrInfoPresent = FDKreadBit(hBs); +- if (sbrInfoPresent) { +- sbrHeaderPresent = FDKreadBit(hBs); +- } else { +- sbrHeaderPresent = 0; +- } +- } +- +- if (sbrInfoPresent) { +- newSbrInfo.ampResolution = FDKreadBit(hBs); +- newSbrInfo.xover_band = FDKreadBits(hBs, 4); +- newSbrInfo.sbr_preprocessing = FDKreadBit(hBs); +- if (bs_pvc) { +- newSbrInfo.pvc_mode = FDKreadBits(hBs, 2); +- /* bs_pvc_mode: 0 -> no PVC, 1 -> PVC mode 1, 2 -> PVC mode 2, 3 -> +- * reserved */ +- if (newSbrInfo.pvc_mode > 2) { +- headerStatus = HEADER_ERROR; +- } +- if (stereo && newSbrInfo.pvc_mode > 0) { +- /* bs_pvc is always transmitted but pvc_mode is set to zero in case +- * of stereo SBR. The config might be wrong but we cannot tell for +- * sure. */ +- newSbrInfo.pvc_mode = 0; +- } +- } else { +- newSbrInfo.pvc_mode = 0; +- } +- if (headerStatus != HEADER_ERROR) { +- if (FDKmemcmp(&hSbrHeader->bs_info, &newSbrInfo, +- sizeof(SBR_HEADER_DATA_BS_INFO))) { +- /* in case of ampResolution and preprocessing change no full reset +- * required */ +- /* HEADER reset would trigger HBE transposer reset which breaks +- * eSbr_3_Eaa.mp4 */ +- if ((hSbrHeader->bs_info.pvc_mode != newSbrInfo.pvc_mode) || +- (hSbrHeader->bs_info.xover_band != newSbrInfo.xover_band)) { +- headerStatus = HEADER_RESET; +- } else { +- headerStatus = HEADER_OK; +- } +- +- hSbrHeader->bs_info = newSbrInfo; +- } else { +- headerStatus = HEADER_OK; +- } +- } +- } +- if (headerStatus == HEADER_ERROR) { +- /* Corrupt SBR info data, do not decode and switch to UPSAMPLING */ +- hSbrHeader->syncState = UPSAMPLING; +- fDoDecodeSbrData = 0; +- sbrHeaderPresent = 0; +- } +- +- if (sbrHeaderPresent && fDoDecodeSbrData) { +- int useDfltHeader; +- +- useDfltHeader = FDKreadBit(hBs); +- +- if (useDfltHeader) { +- sbrHeaderPresent = 0; +- if (FDKmemcmp(&hSbrHeader->bs_data, &hSbrHeader->bs_dflt, +- sizeof(SBR_HEADER_DATA_BS)) || +- hSbrHeader->syncState != SBR_ACTIVE) { +- hSbrHeader->bs_data = hSbrHeader->bs_dflt; +- headerStatus = HEADER_RESET; +- } +- } +- } +- } else { +- sbrHeaderPresent = FDKreadBit(hBs); +- } +- +- if (sbrHeaderPresent) { +- headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 1, 0); +- } +- +- if (headerStatus == HEADER_RESET) { +- errorStatus = sbrDecoder_HeaderUpdate( +- self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels); +- +- if (errorStatus == SBRDEC_OK) { +- hSbrHeader->syncState = SBR_HEADER; +- } else { +- hSbrHeader->syncState = SBR_NOT_INITIALIZED; +- headerStatus = HEADER_ERROR; +- } +- } +- +- if (errorStatus != SBRDEC_OK) { +- fDoDecodeSbrData = 0; +- } +- } /* if (fDoDecodeSbrData) */ +- +- /* +- Print debugging output only if state has changed +- */ +- +- /* read frame data */ +- if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { +- int sbrFrameOk; +- /* read the SBR element data */ +- if (!stereo && (self->hParametricStereoDec != NULL)) { +- /* update slot index for PS bitstream parsing */ +- self->hParametricStereoDec->bsLastSlot = +- self->hParametricStereoDec->bsReadSlot; +- self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot; +- } +- sbrFrameOk = sbrGetChannelElement( +- hSbrHeader, hFrameDataLeft, (stereo) ? hFrameDataRight : NULL, +- &pSbrChannel[0]->prevFrameData, +- pSbrChannel[0]->SbrDec.PvcStaticData.pvc_mode_last, hBs, +- (stereo) ? NULL : self->hParametricStereoDec, self->flags, +- self->pSbrElement[elementIndex]->transposerSettings.overlap); +- +- if (!sbrFrameOk) { +- fDoDecodeSbrData = 0; +- } else { +- INT valBits; +- +- if (bsPayLen > 0) { +- valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs)); +- } else { +- valBits = (INT)FDKgetValidBits(hBs); +- } +- +- if (crcFlag) { +- switch (self->coreCodec) { +- case AOT_ER_AAC_ELD: { +- /* late crc check for eld */ +- INT payloadbits = +- (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; +- INT crcLen = payloadbits - 10; +- FDKpushBack(hBs, payloadbits); +- fDoDecodeSbrData = SbrCrcCheck(hBs, crcLen); +- FDKpushFor(hBs, crcLen); +- } break; +- case AOT_DRM_AAC: +- case AOT_DRM_SURROUND: +- /* End CRC region */ +- FDKcrcEndReg(&crcInfo, hBs, crcReg); +- /* Check CRC */ +- if ((FDKcrcGetCRC(&crcInfo) ^ 0xFF) != drmSbrCrc) { +- fDoDecodeSbrData = 0; +- if (headerStatus != HEADER_NOT_PRESENT) { +- headerStatus = HEADER_ERROR; +- hSbrHeader->syncState = SBR_NOT_INITIALIZED; +- } +- } +- break; +- default: +- break; +- } +- } +- +- /* sanity check of remaining bits */ +- if (valBits < 0) { +- fDoDecodeSbrData = 0; +- } else { +- switch (self->coreCodec) { +- case AOT_SBR: +- case AOT_PS: +- case AOT_AAC_LC: { +- /* This sanity check is only meaningful with General Audio +- * bitstreams */ +- int alignBits = valBits & 0x7; +- +- if (valBits > alignBits) { +- fDoDecodeSbrData = 0; +- } +- } break; +- default: +- /* No sanity check available */ +- break; +- } +- } +- } +- } else { +- /* The returned bit count will not be the actual payload size since we did +- not parse the frame data. Return an error so that the caller can react +- respectively. */ +- errorStatus = SBRDEC_PARSE_ERROR; +- } +- +- if (!fDoDecodeSbrData) { +- /* Set error flag for this slot to trigger concealment */ +- setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); +- /* restore old frameData for concealment */ +- FDKmemcpy(hFrameDataLeft, &frameDataLeftCopy, sizeof(SBR_FRAME_DATA)); +- if (stereo) { +- FDKmemcpy(hFrameDataRight, &frameDataRightCopy, sizeof(SBR_FRAME_DATA)); +- } +- errorStatus = SBRDEC_PARSE_ERROR; +- } else { +- /* Everything seems to be ok so clear the error flag */ +- setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_OK); +- } +- +- if (!stereo) { +- /* Turn coupling off explicitely to avoid access to absent right frame data +- that might occur with corrupt bitstreams. */ +- hFrameDataLeft->coupling = COUPLING_OFF; +- } +- +-bail: +- +- if (self != NULL) { +- if (self->flags & SBRDEC_SYNTAX_DRM) { +- hBs = hBsOriginal; +- } +- +- if (errorStatus != SBRDEC_NOT_INITIALIZED) { +- int useOldHdr = +- ((headerStatus == HEADER_NOT_PRESENT) || +- (headerStatus == HEADER_ERROR) || +- (headerStatus == HEADER_RESET && errorStatus == SBRDEC_PARSE_ERROR)) +- ? 1 +- : 0; +- +- if (!useOldHdr && (thisHdrSlot != lastHdrSlot) && (hSbrHeader != NULL)) { +- useOldHdr |= +- (compareSbrHeader(hSbrHeader, +- &self->sbrHeader[elementIndex][lastHdrSlot]) == 0) +- ? 1 +- : 0; +- } +- +- if (hSbrElement != NULL) { +- if (useOldHdr != 0) { +- /* Use the old header for this frame */ +- hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot; +- } else { +- /* Use the new header for this frame */ +- hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot; +- } +- +- /* Move frame pointer to the next slot which is up to be decoded/applied +- * next */ +- hSbrElement->useFrameSlot = +- (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); +- } +- } +- } +- +- *count -= startPos - (INT)FDKgetValidBits(hBs); +- +- return errorStatus; +-} +- +-/** +- * \brief Render one SBR element into time domain signal. +- * \param self SBR decoder handle +- * \param timeData pointer to output buffer +- * \param channelMapping pointer to UCHAR array where next 2 channel offsets are +- * stored. +- * \param elementIndex enumerating index of the SBR element to render. +- * \param numInChannels number of channels from core coder. +- * \param numOutChannels pointer to a location to return number of output +- * channels. +- * \param psPossible flag indicating if PS is possible or not. +- * \return SBRDEC_OK if successfull, else error code +- */ +-static SBR_ERROR sbrDecoder_DecodeElement( +- HANDLE_SBRDECODER self, QDOM_PCM *input, INT_PCM *timeData, +- const int timeDataSize, const FDK_channelMapDescr *const mapDescr, +- const int mapIdx, int channelIndex, const int elementIndex, +- const int numInChannels, int *numOutChannels, const int psPossible) { +- SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; +- HANDLE_SBR_CHANNEL *pSbrChannel = +- self->pSbrElement[elementIndex]->pSbrChannel; +- HANDLE_SBR_HEADER_DATA hSbrHeader = +- &self->sbrHeader[elementIndex] +- [hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; +- HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec; +- +- /* get memory for frame data from scratch */ +- SBR_FRAME_DATA *hFrameDataLeft = NULL; +- SBR_FRAME_DATA *hFrameDataRight = NULL; +- +- SBR_ERROR errorStatus = SBRDEC_OK; +- +- INT strideOut, offset0 = 255, offset0_block = 0, offset1 = 255, +- offset1_block = 0; +- INT codecFrameSize = self->codecFrameSize; +- +- int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; +- int numElementChannels = +- hSbrElement +- ->nChannels; /* Number of channels of the current SBR element */ +- +- hFrameDataLeft = +- &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; +- if (stereo) { +- hFrameDataRight = +- &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; +- } +- +- if (self->flags & SBRDEC_FLUSH) { +- if (self->numFlushedFrames > self->numDelayFrames) { +- int hdrIdx; +- /* No valid SBR payload available, hence switch to upsampling (in all +- * headers) */ +- for (hdrIdx = 0; hdrIdx < ((1) + 1); hdrIdx += 1) { +- self->sbrHeader[elementIndex][hdrIdx].syncState = UPSAMPLING; +- } +- } else { +- /* Move frame pointer to the next slot which is up to be decoded/applied +- * next */ +- hSbrElement->useFrameSlot = +- (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1); +- /* Update header and frame data pointer because they have already been set +- */ +- hSbrHeader = +- &self->sbrHeader[elementIndex] +- [hSbrElement +- ->useHeaderSlot[hSbrElement->useFrameSlot]]; +- hFrameDataLeft = +- &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; +- if (stereo) { +- hFrameDataRight = +- &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; +- } +- } +- } +- +- /* Update the header error flag */ +- hSbrHeader->frameErrorFlag = +- hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot]; +- +- /* +- Prepare filterbank for upsampling if no valid bit stream data is available. +- */ +- if (hSbrHeader->syncState == SBR_NOT_INITIALIZED) { +- errorStatus = +- initHeaderData(hSbrHeader, self->sampleRateIn, self->sampleRateOut, +- self->downscaleFactor, codecFrameSize, self->flags, +- 1 /* SET_DEFAULT_HDR */ +- ); +- +- if (errorStatus != SBRDEC_OK) { +- return errorStatus; +- } +- +- hSbrHeader->syncState = UPSAMPLING; +- +- errorStatus = sbrDecoder_HeaderUpdate(self, hSbrHeader, HEADER_NOT_PRESENT, +- pSbrChannel, hSbrElement->nChannels); +- +- if (errorStatus != SBRDEC_OK) { +- hSbrHeader->syncState = SBR_NOT_INITIALIZED; +- return errorStatus; +- } +- } +- +- /* reset */ +- if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { +- int ch; +- int applySbrProc = (hSbrHeader->syncState == SBR_ACTIVE || +- (hSbrHeader->frameErrorFlag == 0 && +- hSbrHeader->syncState == SBR_HEADER)); +- for (ch = 0; ch < numElementChannels; ch++) { +- SBR_ERROR errorStatusTmp = SBRDEC_OK; +- +- errorStatusTmp = resetSbrDec( +- &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData, +- self->synDownsampleFac, self->flags, pSbrChannel[ch]->frameData); +- +- if (errorStatusTmp != SBRDEC_OK) { +- hSbrHeader->syncState = UPSAMPLING; +- } +- } +- if (applySbrProc) { +- hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; +- } +- } +- +- /* decoding */ +- if ((hSbrHeader->syncState == SBR_ACTIVE) || +- ((hSbrHeader->syncState == SBR_HEADER) && +- (hSbrHeader->frameErrorFlag == 0))) { +- errorStatus = SBRDEC_OK; +- +- decodeSbrData(hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, +- (stereo) ? hFrameDataRight : NULL, +- (stereo) ? &pSbrChannel[1]->prevFrameData : NULL); +- +- /* Now we have a full parameter set and can do parameter +- based concealment instead of plain upsampling. */ +- hSbrHeader->syncState = SBR_ACTIVE; +- } +- +- if (timeDataSize < +- hSbrHeader->numberTimeSlots * hSbrHeader->timeStep * +- self->pQmfDomain->globalConf.nBandsSynthesis * +- (psPossible ? fMax(2, numInChannels) : numInChannels)) { +- return SBRDEC_OUTPUT_BUFFER_TOO_SMALL; +- } +- +- { +- self->flags &= ~SBRDEC_PS_DECODED; +- C_ALLOC_SCRATCH_START(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) +- +- /* decode PS data if available */ +- if (h_ps_d != NULL && psPossible && (hSbrHeader->syncState == SBR_ACTIVE)) { +- int applyPs = 1; +- +- /* define which frame delay line slot to process */ +- h_ps_d->processSlot = hSbrElement->useFrameSlot; +- +- applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag, pPsScratch); +- self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0; +- } +- +- offset0 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex, mapIdx); +- offset0_block = offset0 * codecFrameSize; +- if (stereo || psPossible) { +- /* the value of offset1 only matters if the condition is true, however if +- it is not true channelIndex+1 may exceed the channel map resutling in an +- error, though the value of offset1 is actually meaningless. This is +- prevented here. */ +- offset1 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex + 1, mapIdx); +- offset1_block = offset1 * codecFrameSize; +- } +- /* Set strides for reading and writing */ +- if (psPossible) +- strideOut = (numInChannels < 2) ? 2 : numInChannels; +- else +- strideOut = numInChannels; +- +- /* use same buffers for left and right channel and apply PS per timeslot */ +- /* Process left channel */ +- sbr_dec(&pSbrChannel[0]->SbrDec, input + offset0_block, timeData + offset0, +- (self->flags & SBRDEC_PS_DECODED) ? &pSbrChannel[1]->SbrDec : NULL, +- timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft, +- &pSbrChannel[0]->prevFrameData, +- (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags, +- codecFrameSize); +- +- if (stereo) { +- /* Process right channel */ +- sbr_dec(&pSbrChannel[1]->SbrDec, input + offset1_block, +- timeData + offset1, NULL, NULL, strideOut, hSbrHeader, +- hFrameDataRight, &pSbrChannel[1]->prevFrameData, +- (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags, +- codecFrameSize); +- } +- +- C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) +- } +- +- if (h_ps_d != NULL) { +- /* save PS status for next run */ +- h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; +- } +- +- if (psPossible && !(self->flags & SBRDEC_SKIP_QMF_SYN)) { +- FDK_ASSERT(strideOut > 1); +- if (!(self->flags & SBRDEC_PS_DECODED)) { +- /* A decoder which is able to decode PS has to produce a stereo output +- * even if no PS data is available. */ +- /* So copy left channel to right channel. */ +- int copyFrameSize = +- codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels; +- copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels; +- INT_PCM *ptr; +- INT i; +- FDK_ASSERT(strideOut == 2); +- +- ptr = timeData; +- for (i = copyFrameSize >> 1; i--;) { +- INT_PCM tmp; /* This temporal variable is required because some +- compilers can't do *ptr++ = *ptr++ correctly. */ +- tmp = *ptr++; +- *ptr++ = tmp; +- tmp = *ptr++; +- *ptr++ = tmp; +- } +- } +- *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */ +- } +- +- return errorStatus; +-} +- +-SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, +- INT_PCM *timeData, const int timeDataSize, +- int *numChannels, int *sampleRate, +- const FDK_channelMapDescr *const mapDescr, +- const int mapIdx, const int coreDecodedOk, +- UCHAR *psDecoded) { +- SBR_ERROR errorStatus = SBRDEC_OK; +- +- int psPossible; +- int sbrElementNum; +- int numCoreChannels; +- int numSbrChannels = 0; +- +- if ((self == NULL) || (timeData == NULL) || (numChannels == NULL) || +- (sampleRate == NULL) || (psDecoded == NULL) || +- !FDK_chMapDescr_isValid(mapDescr)) { +- return SBRDEC_INVALID_ARGUMENT; +- } +- +- psPossible = *psDecoded; +- numCoreChannels = *numChannels; +- if (numCoreChannels <= 0) { +- return SBRDEC_INVALID_ARGUMENT; +- } +- +- if (self->numSbrElements < 1) { +- /* exit immediately to avoid access violations */ +- return SBRDEC_NOT_INITIALIZED; +- } +- +- /* Sanity check of allocated SBR elements. */ +- for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; +- sbrElementNum++) { +- if (self->pSbrElement[sbrElementNum] == NULL) { +- return SBRDEC_NOT_INITIALIZED; +- } +- } +- +- if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) { +- psPossible = 0; +- } +- +- /* Make sure that even if no SBR data was found/parsed *psDecoded is returned +- * 1 if psPossible was 0. */ +- if (psPossible == 0) { +- self->flags &= ~SBRDEC_PS_DECODED; +- } +- +- /* replaces channel based reset inside sbr_dec() */ +- if (((self->flags & SBRDEC_LOW_POWER) ? 1 : 0) != +- ((self->pQmfDomain->globalConf.flags & QMF_FLAG_LP) ? 1 : 0)) { +- if (self->flags & SBRDEC_LOW_POWER) { +- self->pQmfDomain->globalConf.flags |= QMF_FLAG_LP; +- self->pQmfDomain->globalConf.flags_requested |= QMF_FLAG_LP; +- } else { +- self->pQmfDomain->globalConf.flags &= ~QMF_FLAG_LP; +- self->pQmfDomain->globalConf.flags_requested &= ~QMF_FLAG_LP; +- } +- if (FDK_QmfDomain_InitFilterBank(self->pQmfDomain, QMF_FLAG_KEEP_STATES)) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- } +- if (self->numSbrChannels > self->pQmfDomain->globalConf.nInputChannels) { +- return SBRDEC_UNSUPPORTED_CONFIG; +- } +- +- if (self->flags & SBRDEC_FLUSH) { +- /* flushing is signalized, hence increment the flush frame counter */ +- self->numFlushedFrames++; +- } else { +- /* no flushing is signalized, hence reset the flush frame counter */ +- self->numFlushedFrames = 0; +- } +- +- /* Loop over SBR elements */ +- for (sbrElementNum = 0; sbrElementNum < self->numSbrElements; +- sbrElementNum++) { +- int numElementChan; +- +- if (psPossible && +- self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) { +- /* Disable PS and try decoding SBR mono. */ +- psPossible = 0; +- } +- +- numElementChan = +- (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1; +- +- /* If core signal is bad then force upsampling */ +- if (!coreDecodedOk) { +- setFrameErrorFlag(self->pSbrElement[sbrElementNum], FRAME_ERROR_ALLSLOTS); +- } +- +- errorStatus = sbrDecoder_DecodeElement( +- self, input, timeData, timeDataSize, mapDescr, mapIdx, numSbrChannels, +- sbrElementNum, +- numCoreChannels, /* is correct even for USC SCI==2 case */ +- &numElementChan, psPossible); +- +- if (errorStatus != SBRDEC_OK) { +- goto bail; +- } +- +- numSbrChannels += numElementChan; +- +- if (numSbrChannels >= numCoreChannels) { +- break; +- } +- } +- +- /* Update numChannels and samplerate */ +- /* Do not mess with output channels in case of USAC. numSbrChannels != +- * numChannels for stereoConfigIndex == 2 */ +- if (!(self->flags & SBRDEC_SYNTAX_USAC)) { +- *numChannels = numSbrChannels; +- } +- *sampleRate = self->sampleRateOut; +- *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; +- +- /* Clear reset and flush flag because everything seems to be done +- * successfully. */ +- self->flags &= ~SBRDEC_FORCE_RESET; +- self->flags &= ~SBRDEC_FLUSH; +- +-bail: +- +- return errorStatus; +-} +- +-SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *pSelf) { +- HANDLE_SBRDECODER self = *pSelf; +- int i; +- +- if (self != NULL) { +- if (self->hParametricStereoDec != NULL) { +- DeletePsDec(&self->hParametricStereoDec); +- } +- +- for (i = 0; i < (8); i++) { +- sbrDecoder_DestroyElement(self, i); +- } +- +- FreeRam_SbrDecoder(pSelf); +- } +- +- return SBRDEC_OK; +-} +- +-INT sbrDecoder_GetLibInfo(LIB_INFO *info) { +- int i; +- +- if (info == NULL) { +- return -1; +- } +- +- /* search for next free tab */ +- for (i = 0; i < FDK_MODULE_LAST; i++) { +- if (info[i].module_id == FDK_NONE) break; +- } +- if (i == FDK_MODULE_LAST) return -1; +- info += i; +- +- info->module_id = FDK_SBRDEC; +- info->version = +- LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2); +- LIB_VERSION_STRING(info); +- info->build_date = SBRDECODER_LIB_BUILD_DATE; +- info->build_time = SBRDECODER_LIB_BUILD_TIME; +- info->title = SBRDECODER_LIB_TITLE; +- +- /* Set flags */ +- info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_LP | CAPF_SBR_PS_MPEG | +- CAPF_SBR_DRM_BS | CAPF_SBR_CONCEALMENT | CAPF_SBR_DRC | +- CAPF_SBR_ELD_DOWNSCALE | CAPF_SBR_HBEHQ; +- /* End of flags */ +- +- return 0; +-} +- +-UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self) { +- UINT outputDelay = 0; +- +- if (self != NULL) { +- UINT flags = self->flags; +- +- /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */ +- +- /* Are we initialized? */ +- if ((self->numSbrChannels > 0) && (self->numSbrElements > 0)) { +- /* Add QMF synthesis delay */ +- if ((flags & SBRDEC_ELD_GRID) && IS_LOWDELAY(self->coreCodec)) { +- /* Low delay SBR: */ +- if (!(flags & SBRDEC_SKIP_QMF_SYN)) { +- outputDelay += +- (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */ +- if (flags & SBRDEC_LD_MPS_QMF) { +- outputDelay += 32; +- } +- } +- } else if (!IS_USAC(self->coreCodec)) { +- /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) +- * branch: */ +- outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962; +- if (flags & SBRDEC_SKIP_QMF_SYN) { +- outputDelay -= 257; /* QMF synthesis */ +- } +- } +- } +- } +- +- return (outputDelay); +-} +diff --git a/libSBRdec/src/transcendent.h b/libSBRdec/src/transcendent.h +deleted file mode 100644 +index 0e815c2..0000000 +--- a/libSBRdec/src/transcendent.h ++++ /dev/null +@@ -1,372 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief FDK Fixed Point Arithmetic Library Interface +-*/ +- +-#ifndef TRANSCENDENT_H +-#define TRANSCENDENT_H +- +-#include "sbrdecoder.h" +-#include "sbr_rom.h" +- +-/************************************************************************/ +-/*! +- \brief Get number of octaves between frequencies a and b +- +- The Result is scaled with 1/8. +- The valid range for a and b is 1 to LOG_DUALIS_TABLE_SIZE. +- +- \return ld(a/b) / 8 +-*/ +-/************************************************************************/ +-static inline FIXP_SGL FDK_getNumOctavesDiv8(INT a, /*!< lower band */ +- INT b) /*!< upper band */ +-{ +- return ((SHORT)((LONG)(CalcLdInt(b) - CalcLdInt(a)) >> (FRACT_BITS - 3))); +-} +- +-/************************************************************************/ +-/*! +- \brief Add two values given by mantissa and exponent. +- +- Mantissas are in fract format with values between 0 and 1.
+- The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+-*/ +-/************************************************************************/ +-inline void FDK_add_MantExp(FIXP_SGL a_m, /*!< Mantissa of 1st operand a */ +- SCHAR a_e, /*!< Exponent of 1st operand a */ +- FIXP_SGL b_m, /*!< Mantissa of 2nd operand b */ +- SCHAR b_e, /*!< Exponent of 2nd operand b */ +- FIXP_SGL *ptrSum_m, /*!< Mantissa of result */ +- SCHAR *ptrSum_e) /*!< Exponent of result */ +-{ +- FIXP_DBL accu; +- int shift; +- int shiftAbs; +- +- FIXP_DBL shiftedMantissa; +- FIXP_DBL otherMantissa; +- +- /* Equalize exponents of the summands. +- For the smaller summand, the exponent is adapted and +- for compensation, the mantissa is shifted right. */ +- +- shift = (int)(a_e - b_e); +- +- shiftAbs = (shift > 0) ? shift : -shift; +- shiftAbs = (shiftAbs < DFRACT_BITS - 1) ? shiftAbs : DFRACT_BITS - 1; +- shiftedMantissa = (shift > 0) ? (FX_SGL2FX_DBL(b_m) >> shiftAbs) +- : (FX_SGL2FX_DBL(a_m) >> shiftAbs); +- otherMantissa = (shift > 0) ? FX_SGL2FX_DBL(a_m) : FX_SGL2FX_DBL(b_m); +- *ptrSum_e = (shift > 0) ? a_e : b_e; +- +- accu = (shiftedMantissa >> 1) + (otherMantissa >> 1); +- /* shift by 1 bit to avoid overflow */ +- +- if ((accu >= (FL2FXCONST_DBL(0.5f) - (FIXP_DBL)1)) || +- (accu <= FL2FXCONST_DBL(-0.5f))) +- *ptrSum_e += 1; +- else +- accu = (shiftedMantissa + otherMantissa); +- +- *ptrSum_m = FX_DBL2FX_SGL(accu); +-} +- +-inline void FDK_add_MantExp(FIXP_DBL a, /*!< Mantissa of 1st operand a */ +- SCHAR a_e, /*!< Exponent of 1st operand a */ +- FIXP_DBL b, /*!< Mantissa of 2nd operand b */ +- SCHAR b_e, /*!< Exponent of 2nd operand b */ +- FIXP_DBL *ptrSum, /*!< Mantissa of result */ +- SCHAR *ptrSum_e) /*!< Exponent of result */ +-{ +- FIXP_DBL accu; +- int shift; +- int shiftAbs; +- +- FIXP_DBL shiftedMantissa; +- FIXP_DBL otherMantissa; +- +- /* Equalize exponents of the summands. +- For the smaller summand, the exponent is adapted and +- for compensation, the mantissa is shifted right. */ +- +- shift = (int)(a_e - b_e); +- +- shiftAbs = (shift > 0) ? shift : -shift; +- shiftAbs = (shiftAbs < DFRACT_BITS - 1) ? shiftAbs : DFRACT_BITS - 1; +- shiftedMantissa = (shift > 0) ? (b >> shiftAbs) : (a >> shiftAbs); +- otherMantissa = (shift > 0) ? a : b; +- *ptrSum_e = (shift > 0) ? a_e : b_e; +- +- accu = (shiftedMantissa >> 1) + (otherMantissa >> 1); +- /* shift by 1 bit to avoid overflow */ +- +- if ((accu >= (FL2FXCONST_DBL(0.5f) - (FIXP_DBL)1)) || +- (accu <= FL2FXCONST_DBL(-0.5f))) +- *ptrSum_e += 1; +- else +- accu = (shiftedMantissa + otherMantissa); +- +- *ptrSum = accu; +-} +- +-/************************************************************************/ +-/*! +- \brief Divide two values given by mantissa and exponent. +- +- Mantissas are in fract format with values between 0 and 1.
+- The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+- +- For performance reasons, the division is based on a table lookup +- which limits accuracy. +-*/ +-/************************************************************************/ +-static inline void FDK_divide_MantExp( +- FIXP_SGL a_m, /*!< Mantissa of dividend a */ +- SCHAR a_e, /*!< Exponent of dividend a */ +- FIXP_SGL b_m, /*!< Mantissa of divisor b */ +- SCHAR b_e, /*!< Exponent of divisor b */ +- FIXP_SGL *ptrResult_m, /*!< Mantissa of quotient a/b */ +- SCHAR *ptrResult_e) /*!< Exponent of quotient a/b */ +- +-{ +- int preShift, postShift, index, shift; +- FIXP_DBL ratio_m; +- FIXP_SGL bInv_m = FL2FXCONST_SGL(0.0f); +- +- preShift = CntLeadingZeros(FX_SGL2FX_DBL(b_m)); +- +- /* +- Shift b into the range from 0..INV_TABLE_SIZE-1, +- +- E.g. 10 bits must be skipped for INV_TABLE_BITS 8: +- - leave 8 bits as index for table +- - skip sign bit, +- - skip first bit of mantissa, because this is always the same (>0.5) +- +- We are dealing with energies, so we need not care +- about negative numbers +- */ +- +- /* +- The first interval has half width so the lowest bit of the index is +- needed for a doubled resolution. +- */ +- shift = (FRACT_BITS - 2 - INV_TABLE_BITS - preShift); +- +- index = (shift < 0) ? (LONG)b_m << (-shift) : (LONG)b_m >> shift; +- +- /* The index has INV_TABLE_BITS +1 valid bits here. Clear the other bits. */ +- index &= (1 << (INV_TABLE_BITS + 1)) - 1; +- +- /* Remove offset of half an interval */ +- index--; +- +- /* Now the lowest bit is shifted out */ +- index = index >> 1; +- +- /* Fetch inversed mantissa from table: */ +- bInv_m = (index < 0) ? bInv_m : FDK_sbrDecoder_invTable[index]; +- +- /* Multiply a with the inverse of b: */ +- ratio_m = (index < 0) ? FX_SGL2FX_DBL(a_m >> 1) : fMultDiv2(bInv_m, a_m); +- +- postShift = CntLeadingZeros(ratio_m) - 1; +- +- *ptrResult_m = FX_DBL2FX_SGL(ratio_m << postShift); +- *ptrResult_e = a_e - b_e + 1 + preShift - postShift; +-} +- +-static inline void FDK_divide_MantExp( +- FIXP_DBL a_m, /*!< Mantissa of dividend a */ +- SCHAR a_e, /*!< Exponent of dividend a */ +- FIXP_DBL b_m, /*!< Mantissa of divisor b */ +- SCHAR b_e, /*!< Exponent of divisor b */ +- FIXP_DBL *ptrResult_m, /*!< Mantissa of quotient a/b */ +- SCHAR *ptrResult_e) /*!< Exponent of quotient a/b */ +- +-{ +- int preShift, postShift, index, shift; +- FIXP_DBL ratio_m; +- FIXP_SGL bInv_m = FL2FXCONST_SGL(0.0f); +- +- preShift = CntLeadingZeros(b_m); +- +- /* +- Shift b into the range from 0..INV_TABLE_SIZE-1, +- +- E.g. 10 bits must be skipped for INV_TABLE_BITS 8: +- - leave 8 bits as index for table +- - skip sign bit, +- - skip first bit of mantissa, because this is always the same (>0.5) +- +- We are dealing with energies, so we need not care +- about negative numbers +- */ +- +- /* +- The first interval has half width so the lowest bit of the index is +- needed for a doubled resolution. +- */ +- shift = (DFRACT_BITS - 2 - INV_TABLE_BITS - preShift); +- +- index = (shift < 0) ? (LONG)b_m << (-shift) : (LONG)b_m >> shift; +- +- /* The index has INV_TABLE_BITS +1 valid bits here. Clear the other bits. */ +- index &= (1 << (INV_TABLE_BITS + 1)) - 1; +- +- /* Remove offset of half an interval */ +- index--; +- +- /* Now the lowest bit is shifted out */ +- index = index >> 1; +- +- /* Fetch inversed mantissa from table: */ +- bInv_m = (index < 0) ? bInv_m : FDK_sbrDecoder_invTable[index]; +- +- /* Multiply a with the inverse of b: */ +- ratio_m = (index < 0) ? (a_m >> 1) : fMultDiv2(bInv_m, a_m); +- +- postShift = CntLeadingZeros(ratio_m) - 1; +- +- *ptrResult_m = ratio_m << postShift; +- *ptrResult_e = a_e - b_e + 1 + preShift - postShift; +-} +- +-/*! +- \brief Calculate the squareroot of a number given by mantissa and exponent +- +- Mantissa is in fract format with values between 0 and 1.
+- The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
+- The operand is addressed via pointers and will be overwritten with the result. +- +- For performance reasons, the square root is based on a table lookup +- which limits accuracy. +-*/ +-static inline void FDK_sqrt_MantExp( +- FIXP_DBL *mantissa, /*!< Pointer to mantissa */ +- SCHAR *exponent, const SCHAR *destScale) { +- FIXP_DBL input_m = *mantissa; +- int input_e = (int)*exponent; +- FIXP_DBL result = FL2FXCONST_DBL(0.0f); +- int result_e = -FRACT_BITS; +- +- /* Call lookup square root, which does internally normalization. */ +- result = sqrtFixp_lookup(input_m, &input_e); +- result_e = input_e; +- +- /* Write result */ +- if (exponent == destScale) { +- *mantissa = result; +- *exponent = result_e; +- } else { +- int shift = result_e - *destScale; +- *mantissa = (shift >= 0) ? result << (INT)fixMin(DFRACT_BITS - 1, shift) +- : result >> (INT)fixMin(DFRACT_BITS - 1, -shift); +- *exponent = *destScale; +- } +-} +- +-#endif +diff --git a/libSBRenc/include/sbr_encoder.h b/libSBRenc/include/sbr_encoder.h +deleted file mode 100644 +index d979ba6..0000000 +--- a/libSBRenc/include/sbr_encoder.h ++++ /dev/null +@@ -1,483 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: SBR encoder top level processing prototype +- +-*******************************************************************************/ +- +-#ifndef SBR_ENCODER_H +-#define SBR_ENCODER_H +- +-#include "common_fix.h" +-#include "FDK_audio.h" +- +-#include "FDK_bitstream.h" +- +-/* core coder helpers */ +-#define MAX_TRANS_FAC 8 +-#define MAX_CODEC_FRAME_RATIO 2 +-#define MAX_PAYLOAD_SIZE 256 +- +-typedef enum codecType { +- CODEC_AAC = 0, +- CODEC_AACLD = 1, +- CODEC_UNSPECIFIED = 99 +-} CODEC_TYPE; +- +-typedef struct { +- INT bitRate; +- INT nChannels; +- INT sampleFreq; +- INT transFac; +- INT standardBitrate; +-} CODEC_PARAM; +- +-typedef enum { +- SBR_MONO, +- SBR_LEFT_RIGHT, +- SBR_COUPLING, +- SBR_SWITCH_LRC +-} SBR_STEREO_MODE; +- +-/* bitstream syntax flags */ +-enum { +- SBR_SYNTAX_LOW_DELAY = 0x0001, +- SBR_SYNTAX_SCALABLE = 0x0002, +- SBR_SYNTAX_CRC = 0x0004, +- SBR_SYNTAX_DRM_CRC = 0x0008, +- SBR_SYNTAX_ELD_REDUCED_DELAY = 0x0010 +-}; +- +-typedef enum { FREQ_RES_LOW = 0, FREQ_RES_HIGH } FREQ_RES; +- +-typedef struct { +- CODEC_TYPE coreCoder; /*!< LC or ELD */ +- UINT bitrateFrom; /*!< inclusive */ +- UINT bitrateTo; /*!< exclusive */ +- +- UINT sampleRate; /*!< */ +- UCHAR numChannels; /*!< */ +- +- UCHAR startFreq; /*!< bs_start_freq */ +- UCHAR startFreqSpeech; /*!< bs_start_freq for speech config flag */ +- UCHAR stopFreq; /*!< bs_stop_freq */ +- UCHAR stopFreqSpeech; /*!< bs_stop_freq for speech config flag */ +- +- UCHAR numNoiseBands; /*!< */ +- UCHAR noiseFloorOffset; /*!< */ +- SCHAR noiseMaxLevel; /*!< */ +- SBR_STEREO_MODE stereoMode; /*!< */ +- UCHAR freqScale; /*!< */ +-} sbrTuningTable_t; +- +-typedef struct sbrConfiguration { +- /* +- core coder dependent configurations +- */ +- CODEC_PARAM +- codecSettings; /*!< Core coder settings. To be set from core coder. */ +- INT SendHeaderDataTime; /*!< SBR header send update frequency in ms. */ +- INT useWaveCoding; /*!< Flag: usage of wavecoding tool. */ +- INT crcSbr; /*!< Flag: usage of SBR-CRC. */ +- INT dynBwSupported; /*!< Flag: support for dynamic bandwidth in this +- combination. */ +- INT parametricCoding; /*!< Flag: usage of parametric coding tool. */ +- INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core +- encoder. */ +- FREQ_RES freq_res_fixfix[2]; /*!< Frequency resolution of envelopes in frame +- class FIXFIX, for non-split case and split +- case */ +- UCHAR fResTransIsLow; /*!< Frequency resolution of envelopes in transient +- frames: low (0) or variable (1) */ +- +- /* +- core coder dependent tuning parameters +- */ +- INT tran_thr; /*!< SBR transient detector threshold (* 100). */ +- INT noiseFloorOffset; /*!< Noise floor offset. */ +- UINT useSpeechConfig; /*!< Flag: adapt tuning parameters according to speech. +- */ +- +- /* +- core coder independent configurations +- */ +- INT sbrFrameSize; /*!< SBR frame size in samples. Will be calculated from core +- coder settings. */ +- INT sbr_data_extra; /*!< Flag usage of data extra. */ +- INT amp_res; /*!< Amplitude resolution. */ +- INT ana_max_level; /*!< Noise insertion maximum level. */ +- INT tran_fc; /*!< Transient detector start frequency. */ +- INT tran_det_mode; /*!< Transient detector mode. */ +- INT spread; /*!< Flag: usage of SBR spread. */ +- INT stat; /*!< Flag: usage of static framing. */ +- INT e; /*!< Number of envelopes when static framing is chosen. */ +- SBR_STEREO_MODE stereoMode; /*!< SBR stereo mode. */ +- INT deltaTAcrossFrames; /*!< Flag: allow time-delta coding. */ +- FIXP_DBL dF_edge_1stEnv; /*!< Extra fraction delta-F coding is allowed to be +- more expensive. */ +- FIXP_DBL dF_edge_incr; /*!< Increment dF_edge_1stEnv this much if dT-coding +- was used this frame. */ +- INT sbr_invf_mode; /*!< Inverse filtering mode. */ +- INT sbr_xpos_mode; /*!< Transposer mode. */ +- INT sbr_xpos_ctrl; /*!< Transposer control. */ +- INT sbr_xpos_level; /*!< Transposer 3rd order level. */ +- INT startFreq; /*!< The start frequency table index. */ +- INT stopFreq; /*!< The stop frequency table index. */ +- INT useSaPan; /*!< Flag: usage of SAPAN stereo. */ +- INT dynBwEnabled; /*!< Flag: usage of dynamic bandwidth. */ +- INT bParametricStereo; /*!< Flag: usage of parametric stereo coding tool. */ +- +- /* +- header_extra1 configuration +- */ +- UCHAR freqScale; /*!< Frequency grouping. */ +- INT alterScale; /*!< Scale resolution. */ +- INT sbr_noise_bands; /*!< Number of noise bands. */ +- +- /* +- header_extra2 configuration +- */ +- INT sbr_limiter_bands; /*!< Number of limiter bands. */ +- INT sbr_limiter_gains; /*!< Gain of limiter. */ +- INT sbr_interpol_freq; /*!< Flag: use interpolation in freq. direction. */ +- INT sbr_smoothing_length; /*!< Flag: choose length 4 or 0 (=on, off). */ +- UCHAR init_amp_res_FF; +- FIXP_DBL threshold_AmpRes_FF_m; +- SCHAR threshold_AmpRes_FF_e; +-} sbrConfiguration, *sbrConfigurationPtr; +- +-typedef struct SBR_CONFIG_DATA { +- UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */ +- INT nChannels; /**< Number of channels. */ +- +- INT nSfb[2]; /**< Number of SBR scalefactor bands for LO_RES and HI_RES (?) */ +- INT num_Master; /**< Number of elements in v_k_master. */ +- INT sampleFreq; /**< SBR sampling frequency. */ +- INT frameSize; +- INT xOverFreq; /**< The SBR start frequency. */ +- INT dynXOverFreq; /**< Used crossover frequency when dynamic bandwidth is +- enabled. */ +- +- INT noQmfBands; /**< Number of QMF frequency bands. */ +- INT noQmfSlots; /**< Number of QMF slots. */ +- +- UCHAR *freqBandTable[2]; /**< Frequency table for low and hires, only +- MAX_FREQ_COEFFS/2 +1 coeffs actually needed for +- lowres. */ +- UCHAR +- *v_k_master; /**< Master BandTable where freqBandTable is derived from. */ +- +- SBR_STEREO_MODE stereoMode; +- INT noEnvChannels; /**< Number of envelope channels. */ +- +- INT useWaveCoding; /**< Flag indicates whether to use wave coding at all. */ +- INT useParametricCoding; /**< Flag indicates whether to use para coding at +- all. */ +- INT xposCtrlSwitch; /**< Flag indicates whether to switch xpos ctrl on the +- fly. */ +- INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly . +- */ +- UCHAR initAmpResFF; +- FIXP_DBL thresholdAmpResFF_m; +- SCHAR thresholdAmpResFF_e; +-} SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA; +- +-typedef struct { +- MP4_ELEMENT_ID elType; +- INT bitRate; +- int instanceTag; +- UCHAR fParametricStereo; +- UCHAR fDualMono; /**< This flags allows to disable coupling in sbr channel +- pair element */ +- UCHAR nChannelsInEl; +- UCHAR ChannelIndex[2]; +-} SBR_ELEMENT_INFO; +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-typedef struct SBR_ENCODER *HANDLE_SBR_ENCODER; +- +-/** +- * \brief Get the max required input buffer size including delay balancing +- * space for N audio channels. +- * \param noChannels Number of audio channels. +- * \return Max required input buffer size in bytes. +- */ +-INT sbrEncoder_GetInBufferSize(int noChannels); +- +-INT sbrEncoder_Open(HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, +- INT nChannels, INT supportPS); +- +-/** +- * \brief Get closest working bitrate to specified desired +- * bitrate for a single SBR element. +- * \param bitRate The desired target bit rate +- * \param numChannels The amount of audio channels +- * \param coreSampleRate The sample rate of the core coder +- * \param aot The current Audio Object Type +- * \return Closest working bit rate to bitRate value +- */ +-UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, +- UINT coreSampleRate, AUDIO_OBJECT_TYPE aot); +- +-/** +- * \brief Check whether downsampled SBR single rate is possible +- * with given audio object type. +- * \param aot The Audio object type. +- * \return 0 when downsampled SBR is not possible, +- * 1 when downsampled SBR is possible. +- */ +-UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot); +- +-/** +- * \brief Initialize SBR Encoder instance. +- * \param phSbrEncoder Pointer to a SBR Encoder instance. +- * \param elInfo Structure that describes the element/channel +- * arrangement. +- * \param noElements Amount of elements described in elInfo. +- * \param inputBuffer Pointer to the encoder audio buffer +- * \param inputBufferBufSize Buffer offset of one channel (frameSize + delay) +- * \param bandwidth Returns the core audio encoder bandwidth (output) +- * \param bufferOffset Returns the offset for the audio input data in order +- * to do delay balancing. +- * \param numChannels Input: Encoder input channels. output: core encoder +- * channels. +- * \param sampleRate Input: Encoder samplerate. output core encoder +- * samplerate. +- * \param downSampleFactor Input: Relation between SBR and core coder sampling +- * rate; +- * \param frameLength Input: Encoder frameLength. output core encoder +- * frameLength. +- * \param aot Input: AOT.. +- * \param delay Input: core encoder delay. Output: total delay +- * because of SBR. +- * \param transformFactor The core encoder transform factor (blockswitching). +- * \param headerPeriod Repetition rate of the SBR header: +- * - (-1) means intern configuration. +- * - (1-10) corresponds to header repetition rate in +- * frames. +- * \return 0 on success, and non-zero if failed. +- */ +-INT sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder, +- SBR_ELEMENT_INFO elInfo[(8)], int noElements, +- INT_PCM *inputBuffer, UINT inputBufferBufSize, +- INT *coreBandwidth, INT *inputBufferOffset, +- INT *numChannels, const UINT syntaxFlags, INT *sampleRate, +- UINT *downSampleFactor, INT *frameLength, +- AUDIO_OBJECT_TYPE aot, int *delay, int transformFactor, +- const int headerPeriod, ULONG statesInitFlag); +- +-/** +- * \brief Do delay line buffers housekeeping. To be called after +- * each encoded audio frame. +- * \param hEnvEnc SBR Encoder handle. +- * \param timeBuffer Pointer to the encoder audio buffer. +- * \param timeBufferBufSIze buffer size for one channel +- * \return 0 on success, and non-zero if failed. +- */ +-INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hEnvEnc, INT_PCM *timeBuffer, +- UINT timeBufferBufSIze); +- +-/** +- * \brief Close SBR encoder instance. +- * \param phEbrEncoder Handle of SBR encoder instance to be closed. +- * \return void +- */ +-void sbrEncoder_Close(HANDLE_SBR_ENCODER *phEbrEncoder); +- +-/** +- * \brief Encode SBR data of one complete audio frame. +- * \param hEnvEncoder Handle of SBR encoder instance. +- * \param samples Time samples, not interleaved. +- * \param timeInStride Channel offset of samples buffer. +- * \param sbrDataBits Size of SBR payload in bits. +- * \param sbrData SBR payload. +- * \return 0 on success, and non-zero if failed. +- */ +-INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, INT_PCM *samples, +- UINT samplesBufSize, UINT sbrDataBits[(8)], +- UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]); +- +-/** +- * \brief Write SBR headers of one SBR element. +- * \param sbrEncoder Handle of the SBR encoder instance. +- * \param hBs Handle of bit stream handle to write SBR header to. +- * \param element_index Index of the SBR element which header should be written. +- * \param fSendHeaders Flag indicating that the SBR encoder should send more +- * headers in the SBR payload or not. +- * \return void +- */ +-void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder, +- HANDLE_FDK_BITSTREAM hBs, INT element_index, +- int fSendHeaders); +- +-/** +- * \brief Request to write SBR header. +- * \param hSbrEncoder SBR encoder handle. +- * \return 0 on success, and non-zero if failed. +- */ +-INT sbrEncoder_SendHeader(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Request if last sbr payload contains an SBR header. +- * \param hSbrEncoder SBR encoder handle. +- * \return 1 contains sbr header, 0 without sbr header. +- */ +-INT sbrEncoder_ContainsHeader(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief SBR header delay in frames. +- * \param hSbrEncoder SBR encoder handle. +- * \return Delay in frames, -1 on failure. +- */ +-INT sbrEncoder_GetHeaderDelay(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Bitstrem delay in SBR frames. +- * \param hSbrEncoder SBR encoder handle. +- * \return Delay in frames, -1 on failure. +- */ +-INT sbrEncoder_GetBsDelay(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Prepare SBR payload for SAP. +- * \param hSbrEncoder SBR encoder handle. +- * \return 0 on success, and non-zero if failed. +- */ +-INT sbrEncoder_SAPPrepare(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief SBR encoder bitrate estimation. +- * \param hSbrEncoder SBR encoder handle. +- * \return Estimated bitrate. +- */ +-INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Delay between input data and downsampled output data. +- * \param hSbrEncoder SBR encoder handle. +- * \return Delay. +- */ +-INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Delay caused by the SBR decoder. +- * \param hSbrEncoder SBR encoder handle. +- * \return Delay. +- */ +-INT sbrEncoder_GetSbrDecDelay(HANDLE_SBR_ENCODER hSbrEncoder); +- +-/** +- * \brief Get decoder library version info. +- * \param info Pointer to an allocated LIB_INFO struct, where library info is +- * written to. +- * \return 0 on sucess. +- */ +-INT sbrEncoder_GetLibInfo(LIB_INFO *info); +- +-void sbrPrintRAM(void); +- +-void sbrPrintROM(void); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif /* ifndef __SBR_MAIN_H */ +diff --git a/libSBRenc/src/bit_sbr.cpp b/libSBRenc/src/bit_sbr.cpp +deleted file mode 100644 +index 5a65e98..0000000 +--- a/libSBRenc/src/bit_sbr.cpp ++++ /dev/null +@@ -1,1049 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief SBR bit writing routines $Revision: 93300 $ +-*/ +- +-#include "bit_sbr.h" +- +-#include "code_env.h" +-#include "cmondata.h" +-#include "sbr.h" +- +-#include "ps_main.h" +- +-typedef enum { SBR_ID_SCE = 1, SBR_ID_CPE } SBR_ELEMENT_TYPE; +- +-static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft, +- HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem, +- INT coupling, UINT sbrSyntaxFlags); +- +-static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_COMMON_DATA cmonData); +- +-static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_FDK_BITSTREAM hBitStream); +- +-static INT encodeSbrSingleChannelElement( +- HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags); +- +-static INT encodeSbrChannelPairElement( +- HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream, +- const INT coupling, const UINT sbrSyntaxFlags); +- +-static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream); +- +-static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, +- const int transmitFreqs, +- const UINT sbrSyntaxFlags); +- +-static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream); +- +-static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, INT coupling); +- +-static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, INT coupling); +- +-static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream); +- +-static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_FDK_BITSTREAM hBitStream); +- +-static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo); +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_WriteEnvSingleChannelElement +- description: writes pure SBR single channel data element +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-INT FDKsbrEnc_WriteEnvSingleChannelElement( +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) +- +-{ +- INT payloadBits = 0; +- +- cmonData->sbrHdrBits = 0; +- cmonData->sbrDataBits = 0; +- +- /* write pure sbr data */ +- if (sbrEnvData != NULL) { +- /* write header */ +- payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData); +- +- /* write data */ +- payloadBits += encodeSbrData(sbrEnvData, NULL, hParametricStereo, cmonData, +- SBR_ID_SCE, 0, sbrSyntaxFlags); +- } +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_WriteEnvChannelPairElement +- description: writes pure SBR channel pair data element +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-INT FDKsbrEnc_WriteEnvChannelPairElement( +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) +- +-{ +- INT payloadBits = 0; +- cmonData->sbrHdrBits = 0; +- cmonData->sbrDataBits = 0; +- +- /* write pure sbr data */ +- if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) { +- /* write header */ +- payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData); +- +- /* write data */ +- payloadBits += encodeSbrData(sbrEnvDataLeft, sbrEnvDataRight, +- hParametricStereo, cmonData, SBR_ID_CPE, +- sbrHeaderData->coupling, sbrSyntaxFlags); +- } +- return payloadBits; +-} +- +-INT FDKsbrEnc_CountSbrChannelPairElement( +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) { +- INT payloadBits; +- INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf); +- +- payloadBits = FDKsbrEnc_WriteEnvChannelPairElement( +- sbrHeaderData, hParametricStereo, sbrBitstreamData, sbrEnvDataLeft, +- sbrEnvDataRight, cmonData, sbrSyntaxFlags); +- +- FDKpushBack(&cmonData->sbrBitbuf, +- (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos)); +- +- return payloadBits; +-} +- +-void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, HANDLE_FDK_BITSTREAM hBs, +- INT element_index, int fSendHeaders) { +- encodeSbrHeaderData(&sbrEncoder->sbrElement[element_index]->sbrHeaderData, +- hBs); +- +- if (fSendHeaders == 0) { +- /* Prevent header being embedded into the SBR payload. */ +- sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData = +- -1; +- sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0; +- sbrEncoder->sbrElement[element_index] +- ->sbrBitstreamData.CountSendHeaderData = -1; +- } +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrHeader +- description: encodes SBR Header information +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_COMMON_DATA cmonData) { +- INT payloadBits = 0; +- +- if (sbrBitstreamData->HeaderActive) { +- payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 1, 1); +- payloadBits += encodeSbrHeaderData(sbrHeaderData, &cmonData->sbrBitbuf); +- } else { +- payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 0, 1); +- } +- +- cmonData->sbrHdrBits = payloadBits; +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrHeaderData +- description: writes sbr_header() +- bs_protocol_version through bs_header_extra_2 +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_FDK_BITSTREAM hBitStream) +- +-{ +- INT payloadBits = 0; +- if (sbrHeaderData != NULL) { +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_amp_res, +- SI_SBR_AMP_RES_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_start_frequency, +- SI_SBR_START_FREQ_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_stop_frequency, +- SI_SBR_STOP_FREQ_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_xover_band, +- SI_SBR_XOVER_BAND_BITS); +- +- payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_RESERVED_BITS); +- +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_1, +- SI_SBR_HEADER_EXTRA_1_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_2, +- SI_SBR_HEADER_EXTRA_2_BITS); +- +- if (sbrHeaderData->header_extra_1) { +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->freqScale, +- SI_SBR_FREQ_SCALE_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->alterScale, +- SI_SBR_ALTER_SCALE_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_noise_bands, +- SI_SBR_NOISE_BANDS_BITS); +- } /* sbrHeaderData->header_extra_1 */ +- +- if (sbrHeaderData->header_extra_2) { +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_bands, +- SI_SBR_LIMITER_BANDS_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_gains, +- SI_SBR_LIMITER_GAINS_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_interpol_freq, +- SI_SBR_INTERPOL_FREQ_BITS); +- payloadBits += +- FDKwriteBits(hBitStream, sbrHeaderData->sbr_smoothing_length, +- SI_SBR_SMOOTHING_LENGTH_BITS); +- +- } /* sbrHeaderData->header_extra_2 */ +- } /* sbrHeaderData != NULL */ +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrData +- description: encodes sbr Data information +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft, +- HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem, +- INT coupling, UINT sbrSyntaxFlags) { +- INT payloadBits = 0; +- +- switch (sbrElem) { +- case SBR_ID_SCE: +- payloadBits += +- encodeSbrSingleChannelElement(sbrEnvDataLeft, &cmonData->sbrBitbuf, +- hParametricStereo, sbrSyntaxFlags); +- break; +- case SBR_ID_CPE: +- payloadBits += encodeSbrChannelPairElement( +- sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo, +- &cmonData->sbrBitbuf, coupling, sbrSyntaxFlags); +- break; +- default: +- /* we never should apply SBR to any other element type */ +- FDK_ASSERT(0); +- } +- +- cmonData->sbrDataBits = payloadBits; +- +- return payloadBits; +-} +- +-#define MODE_FREQ_TANS 1 +-#define MODE_NO_FREQ_TRAN 0 +-#define LD_TRANSMISSION MODE_FREQ_TANS +-static int encodeFreqs(int mode) { return ((mode & MODE_FREQ_TANS) ? 1 : 0); } +- +-/***************************************************************************** +- +- functionname: encodeSbrSingleChannelElement +- description: encodes sbr SCE information +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrSingleChannelElement( +- HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags) { +- INT i, payloadBits = 0; +- +- payloadBits += FDKwriteBits(hBitStream, 0, +- SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ +- +- if (sbrEnvData->ldGrid) { +- if (sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly) { +- /* encode normal SbrGrid */ +- payloadBits += encodeSbrGrid(sbrEnvData, hBitStream); +- } else { +- /* use FIXFIXonly frame Grid */ +- payloadBits += encodeLowDelaySbrGrid( +- sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags); +- } +- } else { +- if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) { +- payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_COUPLING_BITS); +- } +- payloadBits += encodeSbrGrid(sbrEnvData, hBitStream); +- } +- +- payloadBits += encodeSbrDtdf(sbrEnvData, hBitStream); +- +- for (i = 0; i < sbrEnvData->noOfnoisebands; i++) { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->sbr_invf_mode_vec[i], +- SI_SBR_INVF_MODE_BITS); +- } +- +- payloadBits += writeEnvelopeData(sbrEnvData, hBitStream, 0); +- payloadBits += writeNoiseLevelData(sbrEnvData, hBitStream, 0); +- +- payloadBits += writeSyntheticCodingData(sbrEnvData, hBitStream); +- +- payloadBits += encodeExtendedData(hParametricStereo, hBitStream); +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrChannelPairElement +- description: encodes sbr CPE information +- returns: +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrChannelPairElement( +- HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream, +- const INT coupling, const UINT sbrSyntaxFlags) { +- INT payloadBits = 0; +- INT i = 0; +- +- payloadBits += FDKwriteBits(hBitStream, 0, +- SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ +- +- payloadBits += FDKwriteBits(hBitStream, coupling, SI_SBR_COUPLING_BITS); +- +- if (coupling) { +- if (sbrEnvDataLeft->ldGrid) { +- if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) { +- /* normal SbrGrid */ +- payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream); +- +- } else { +- /* FIXFIXonly frame Grid */ +- payloadBits += +- encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream, +- encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags); +- } +- } else +- payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream); +- +- payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream); +- payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream); +- +- for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], +- SI_SBR_INVF_MODE_BITS); +- } +- +- payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 1); +- payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 1); +- payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 1); +- payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 1); +- +- payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream); +- payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream); +- +- } else { /* no coupling */ +- FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid); +- +- if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) { +- /* sbrEnvDataLeft (left channel) */ +- if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) { +- /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ +- /* normal SbrGrid */ +- payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream); +- +- } else { +- /* FIXFIXonly frame Grid */ +- payloadBits += +- encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream, +- encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags); +- } +- +- /* sbrEnvDataRight (right channel) */ +- if (sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) { +- /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ +- /* normal SbrGrid */ +- payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream); +- +- } else { +- /* FIXFIXonly frame Grid */ +- payloadBits += +- encodeLowDelaySbrGrid(sbrEnvDataRight, hBitStream, +- encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags); +- } +- } else { +- payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream); +- payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream); +- } +- payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream); +- payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream); +- +- for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], +- SI_SBR_INVF_MODE_BITS); +- } +- for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) { +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i], +- SI_SBR_INVF_MODE_BITS); +- } +- +- payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 0); +- payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 0); +- payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 0); +- payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 0); +- +- payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream); +- payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream); +- +- } /* coupling */ +- +- payloadBits += encodeExtendedData(hParametricStereo, hBitStream); +- +- return payloadBits; +-} +- +-static INT ceil_ln2(INT x) { +- INT tmp = -1; +- while ((1 << ++tmp) < x) +- ; +- return (tmp); +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrGrid +- description: if hBitStream != NULL writes bits that describes the +- time/frequency grouping of a frame; else counts them only +- returns: number of bits written or counted +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream) { +- INT payloadBits = 0; +- INT i, temp; +- INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart; +- INT numberTimeSlots = sbrEnvData->hSbrBSGrid->numberTimeSlots; +- +- if (sbrEnvData->ldGrid) +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass, +- SBR_CLA_BITS_LD); +- else +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass, +- SBR_CLA_BITS); +- +- switch (sbrEnvData->hSbrBSGrid->frameClass) { +- case FIXFIXonly: +- FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */); +- break; +- case FIXFIX: +- temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env); +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_ENV_BITS); +- if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env == 1)) +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF, +- SI_SBR_AMP_RES_BITS); +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[0], +- SBR_RES_BITS); +- +- break; +- +- case FIXVAR: +- case VARFIX: +- if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR) +- temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - +- (bufferFrameStart + numberTimeSlots); +- else +- temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart; +- +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS); +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS); +- +- for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) { +- temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1; +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS); +- } +- +- temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2); +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp); +- +- for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], +- SBR_RES_BITS); +- } +- break; +- +- case VARVAR: +- temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart; +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS); +- temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 - +- (bufferFrameStart + numberTimeSlots); +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS); +- +- payloadBits += FDKwriteBits( +- hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS); +- payloadBits += FDKwriteBits( +- hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS); +- +- for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) { +- temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1; +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS); +- } +- +- for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) { +- temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1; +- payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS); +- } +- +- temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 + +- sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2); +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp); +- +- temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 + +- sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1; +- +- for (i = 0; i < temp; i++) { +- payloadBits += FDKwriteBits( +- hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], SBR_RES_BITS); +- } +- break; +- } +- +- return payloadBits; +-} +- +-#define SBR_CLA_BITS_LD 1 +-/***************************************************************************** +- +- functionname: encodeLowDelaySbrGrid +- description: if hBitStream != NULL writes bits that describes the +- time/frequency grouping of a frame; +- else counts them only +- (this function only write the FIXFIXonly Bitstream data) +- returns: number of bits written or counted +- input: +- output: +- +-*****************************************************************************/ +-static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, +- const int transmitFreqs, +- const UINT sbrSyntaxFlags) { +- int payloadBits = 0; +- int i; +- +- /* write FIXFIXonly Grid */ +- /* write frameClass [1 bit] for FIXFIXonly Grid */ +- payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD); +- +- /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit +- * them */ +- /* only transmit the transient position! */ +- /* with this info (b1) we can reconstruct the Frame on Decoder side : */ +- /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */ +- +- /* use 3 or 4bits for transient border (border) */ +- if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8) +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3); +- else +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4); +- +- if (transmitFreqs) { +- /* write FreqRes grid */ +- for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], +- SBR_RES_BITS); +- } +- } +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: encodeSbrDtdf +- description: writes bits that describes the direction of the envelopes of a +-frame returns: number of bits written input: output: +- +-*****************************************************************************/ +-static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream) { +- INT i, payloadBits = 0, noOfNoiseEnvelopes; +- +- noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; +- +- for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) { +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS); +- } +- for (i = 0; i < noOfNoiseEnvelopes; ++i) { +- payloadBits += +- FDKwriteBits(hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS); +- } +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: writeNoiseLevelData +- description: writes bits corresponding to the noise-floor-level +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, INT coupling) { +- INT j, i, payloadBits = 0; +- INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; +- +- for (i = 0; i < nNoiseEnvelopes; i++) { +- switch (sbrEnvData->domain_vec_noise[i]) { +- case FREQ: +- if (coupling && sbrEnvData->balance) { +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], +- sbrEnvData->si_sbr_start_noise_bits_balance); +- } else { +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], +- sbrEnvData->si_sbr_start_noise_bits); +- } +- +- for (j = 1 + i * sbrEnvData->noOfnoisebands; +- j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { +- if (coupling) { +- if (sbrEnvData->balance) { +- /* coupling && balance */ +- payloadBits += FDKwriteBits(hBitStream, +- sbrEnvData->hufftableNoiseBalanceFreqC +- [sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV_BALANCE11], +- sbrEnvData->hufftableNoiseBalanceFreqL +- [sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV_BALANCE11]); +- } else { +- /* coupling && !balance */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->hufftableNoiseLevelFreqC +- [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], +- sbrEnvData->hufftableNoiseLevelFreqL +- [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); +- } +- } else { +- /* !coupling */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV11], +- sbrEnvData +- ->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV11]); +- } +- } +- break; +- +- case TIME: +- for (j = i * sbrEnvData->noOfnoisebands; +- j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { +- if (coupling) { +- if (sbrEnvData->balance) { +- /* coupling && balance */ +- payloadBits += FDKwriteBits(hBitStream, +- sbrEnvData->hufftableNoiseBalanceTimeC +- [sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV_BALANCE11], +- sbrEnvData->hufftableNoiseBalanceTimeL +- [sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV_BALANCE11]); +- } else { +- /* coupling && !balance */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->hufftableNoiseLevelTimeC +- [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], +- sbrEnvData->hufftableNoiseLevelTimeL +- [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); +- } +- } else { +- /* !coupling */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV11], +- sbrEnvData +- ->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] + +- CODE_BOOK_SCF_LAV11]); +- } +- } +- break; +- } +- } +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: writeEnvelopeData +- description: writes bits corresponding to the envelope +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream, INT coupling) { +- INT payloadBits = 0, j, i, delta; +- +- for (j = 0; j < sbrEnvData->noOfEnvelopes; +- j++) { /* loop over all envelopes */ +- if (sbrEnvData->domain_vec[j] == FREQ) { +- if (coupling && sbrEnvData->balance) { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0], +- sbrEnvData->si_sbr_start_env_bits_balance); +- } else { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0], +- sbrEnvData->si_sbr_start_env_bits); +- } +- } +- +- for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j]; +- i++) { +- delta = sbrEnvData->ienvelope[j][i]; +- if (coupling && sbrEnvData->balance) { +- FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLavBalance); +- } else { +- FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLav); +- } +- if (coupling) { +- if (sbrEnvData->balance) { +- if (sbrEnvData->domain_vec[j]) { +- /* coupling && balance && TIME */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableBalanceTimeC[delta + +- sbrEnvData->codeBookScfLavBalance], +- sbrEnvData +- ->hufftableBalanceTimeL[delta + +- sbrEnvData->codeBookScfLavBalance]); +- } else { +- /* coupling && balance && FREQ */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableBalanceFreqC[delta + +- sbrEnvData->codeBookScfLavBalance], +- sbrEnvData +- ->hufftableBalanceFreqL[delta + +- sbrEnvData->codeBookScfLavBalance]); +- } +- } else { +- if (sbrEnvData->domain_vec[j]) { +- /* coupling && !balance && TIME */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav], +- sbrEnvData +- ->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]); +- } else { +- /* coupling && !balance && FREQ */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData +- ->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav], +- sbrEnvData +- ->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]); +- } +- } +- } else { +- if (sbrEnvData->domain_vec[j]) { +- /* !coupling && TIME */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav], +- sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]); +- } else { +- /* !coupling && FREQ */ +- payloadBits += FDKwriteBits( +- hBitStream, +- sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav], +- sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]); +- } +- } +- } +- } +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: encodeExtendedData +- description: writes bits corresponding to the extended data +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_FDK_BITSTREAM hBitStream) { +- INT extDataSize; +- INT payloadBits = 0; +- +- extDataSize = getSbrExtendedDataSize(hParametricStereo); +- +- if (extDataSize != 0) { +- INT maxExtSize = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1; +- INT writtenNoBits = 0; /* needed to byte align the extended data */ +- +- payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_EXTENDED_DATA_BITS); +- FDK_ASSERT(extDataSize <= SBR_EXTENDED_DATA_MAX_CNT); +- +- if (extDataSize < maxExtSize) { +- payloadBits += +- FDKwriteBits(hBitStream, extDataSize, SI_SBR_EXTENSION_SIZE_BITS); +- } else { +- payloadBits += +- FDKwriteBits(hBitStream, maxExtSize, SI_SBR_EXTENSION_SIZE_BITS); +- payloadBits += FDKwriteBits(hBitStream, extDataSize - maxExtSize, +- SI_SBR_EXTENSION_ESC_COUNT_BITS); +- } +- +- /* parametric coding signalled here? */ +- if (hParametricStereo) { +- writtenNoBits += FDKwriteBits(hBitStream, EXTENSION_ID_PS_CODING, +- SI_SBR_EXTENSION_ID_BITS); +- writtenNoBits += +- FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, hBitStream); +- } +- +- payloadBits += writtenNoBits; +- +- /* byte alignment */ +- writtenNoBits = writtenNoBits % 8; +- if (writtenNoBits) +- payloadBits += FDKwriteBits(hBitStream, 0, (8 - writtenNoBits)); +- } else { +- payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_EXTENDED_DATA_BITS); +- } +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: writeSyntheticCodingData +- description: writes bits corresponding to the "synthetic-coding"-extension +- returns: number of bits written +- input: +- output: +- +-*****************************************************************************/ +-static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_FDK_BITSTREAM hBitStream) +- +-{ +- INT i; +- INT payloadBits = 0; +- +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonicFlag, 1); +- +- if (sbrEnvData->addHarmonicFlag) { +- for (i = 0; i < sbrEnvData->noHarmonics; i++) { +- payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonic[i], 1); +- } +- } +- +- return payloadBits; +-} +- +-/***************************************************************************** +- +- functionname: getSbrExtendedDataSize +- description: counts the number of bits needed for encoding the +- extended data (including extension id) +- +- returns: number of bits needed for the extended data +- input: +- output: +- +-*****************************************************************************/ +-static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo) { +- INT extDataBits = 0; +- +- /* add your new extended data counting methods here */ +- +- /* +- no extended data +- */ +- +- if (hParametricStereo) { +- /* PS extended data */ +- extDataBits += SI_SBR_EXTENSION_ID_BITS; +- extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL); +- } +- +- return (extDataBits + 7) >> 3; +-} +diff --git a/libSBRenc/src/bit_sbr.h b/libSBRenc/src/bit_sbr.h +deleted file mode 100644 +index e90f52c..0000000 +--- a/libSBRenc/src/bit_sbr.h ++++ /dev/null +@@ -1,267 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief SBR bit writing $Revision: 92790 $ +-*/ +-#ifndef BIT_SBR_H +-#define BIT_SBR_H +- +-#include "sbr_def.h" +-#include "cmondata.h" +-#include "fram_gen.h" +- +-struct SBR_ENV_DATA; +- +-struct SBR_BITSTREAM_DATA { +- INT TotalBits; +- INT PayloadBits; +- INT FillBits; +- INT HeaderActive; +- INT HeaderActiveDelay; /**< sbr payload and its header is delayed depending on +- encoder configuration*/ +- INT NrSendHeaderData; /**< input from commandline */ +- INT CountSendHeaderData; /**< modulo count. If < 0 then no counting is done +- (no SBR headers) */ +- INT rightBorderFIX; /**< force VARFIX or FIXFIX frames */ +-}; +- +-typedef struct SBR_BITSTREAM_DATA *HANDLE_SBR_BITSTREAM_DATA; +- +-struct SBR_HEADER_DATA { +- AMP_RES sbr_amp_res; +- INT sbr_start_frequency; +- INT sbr_stop_frequency; +- INT sbr_xover_band; +- INT sbr_noise_bands; +- INT sbr_data_extra; +- INT header_extra_1; +- INT header_extra_2; +- INT sbr_lc_stereo_mode; +- INT sbr_limiter_bands; +- INT sbr_limiter_gains; +- INT sbr_interpol_freq; +- INT sbr_smoothing_length; +- INT alterScale; +- INT freqScale; +- +- /* +- element of channelpairelement +- */ +- INT coupling; +- INT prev_coupling; +- +- /* +- element of singlechannelelement +- */ +-}; +-typedef struct SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; +- +-struct SBR_ENV_DATA { +- INT sbr_xpos_ctrl; +- FREQ_RES freq_res_fixfix[2]; +- UCHAR fResTransIsLow; +- +- INVF_MODE sbr_invf_mode; +- INVF_MODE sbr_invf_mode_vec[MAX_NUM_NOISE_VALUES]; +- +- XPOS_MODE sbr_xpos_mode; +- +- INT ienvelope[MAX_ENVELOPES][MAX_FREQ_COEFFS]; +- +- INT codeBookScfLavBalance; +- INT codeBookScfLav; +- const INT *hufftableTimeC; +- const INT *hufftableFreqC; +- const UCHAR *hufftableTimeL; +- const UCHAR *hufftableFreqL; +- +- const INT *hufftableLevelTimeC; +- const INT *hufftableBalanceTimeC; +- const INT *hufftableLevelFreqC; +- const INT *hufftableBalanceFreqC; +- const UCHAR *hufftableLevelTimeL; +- const UCHAR *hufftableBalanceTimeL; +- const UCHAR *hufftableLevelFreqL; +- const UCHAR *hufftableBalanceFreqL; +- +- const UCHAR *hufftableNoiseTimeL; +- const INT *hufftableNoiseTimeC; +- const UCHAR *hufftableNoiseFreqL; +- const INT *hufftableNoiseFreqC; +- +- const UCHAR *hufftableNoiseLevelTimeL; +- const INT *hufftableNoiseLevelTimeC; +- const UCHAR *hufftableNoiseBalanceTimeL; +- const INT *hufftableNoiseBalanceTimeC; +- const UCHAR *hufftableNoiseLevelFreqL; +- const INT *hufftableNoiseLevelFreqC; +- const UCHAR *hufftableNoiseBalanceFreqL; +- const INT *hufftableNoiseBalanceFreqC; +- +- HANDLE_SBR_GRID hSbrBSGrid; +- +- INT noHarmonics; +- INT addHarmonicFlag; +- UCHAR addHarmonic[MAX_FREQ_COEFFS]; +- +- /* calculated helper vars */ +- INT si_sbr_start_env_bits_balance; +- INT si_sbr_start_env_bits; +- INT si_sbr_start_noise_bits_balance; +- INT si_sbr_start_noise_bits; +- +- INT noOfEnvelopes; +- INT noScfBands[MAX_ENVELOPES]; +- INT domain_vec[MAX_ENVELOPES]; +- INT domain_vec_noise[MAX_ENVELOPES]; +- SCHAR sbr_noise_levels[MAX_FREQ_COEFFS]; +- INT noOfnoisebands; +- +- INT balance; +- AMP_RES init_sbr_amp_res; +- AMP_RES currentAmpResFF; +- FIXP_DBL +- ton_HF[SBR_GLOBAL_TONALITY_VALUES]; /* tonality is scaled by +- 2^19/0.524288f (fract part of +- RELAXATION) */ +- FIXP_DBL global_tonality; +- +- /* extended data */ +- INT extended_data; +- INT extension_size; +- INT extension_id; +- UCHAR extended_data_buffer[SBR_EXTENDED_DATA_MAX_CNT]; +- +- UCHAR ldGrid; +-}; +-typedef struct SBR_ENV_DATA *HANDLE_SBR_ENV_DATA; +- +-INT FDKsbrEnc_WriteEnvSingleChannelElement( +- struct SBR_HEADER_DATA *sbrHeaderData, +- struct T_PARAMETRIC_STEREO *hParametricStereo, +- struct SBR_BITSTREAM_DATA *sbrBitstreamData, +- struct SBR_ENV_DATA *sbrEnvData, struct COMMON_DATA *cmonData, +- UINT sbrSyntaxFlags); +- +-INT FDKsbrEnc_WriteEnvChannelPairElement( +- struct SBR_HEADER_DATA *sbrHeaderData, +- struct T_PARAMETRIC_STEREO *hParametricStereo, +- struct SBR_BITSTREAM_DATA *sbrBitstreamData, +- struct SBR_ENV_DATA *sbrEnvDataLeft, struct SBR_ENV_DATA *sbrEnvDataRight, +- struct COMMON_DATA *cmonData, UINT sbrSyntaxFlags); +- +-INT FDKsbrEnc_CountSbrChannelPairElement( +- struct SBR_HEADER_DATA *sbrHeaderData, +- struct T_PARAMETRIC_STEREO *hParametricStereo, +- struct SBR_BITSTREAM_DATA *sbrBitstreamData, +- struct SBR_ENV_DATA *sbrEnvDataLeft, struct SBR_ENV_DATA *sbrEnvDataRight, +- struct COMMON_DATA *cmonData, UINT sbrSyntaxFlags); +- +-/* debugging and tuning functions */ +- +-/*#define SBR_ENV_STATISTICS */ +- +-/*#define SBR_PAYLOAD_MONITOR*/ +- +-#endif +diff --git a/libSBRenc/src/cmondata.h b/libSBRenc/src/cmondata.h +deleted file mode 100644 +index 0779b4d..0000000 +--- a/libSBRenc/src/cmondata.h ++++ /dev/null +@@ -1,127 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Core Coder's and SBR's shared data structure definition $Revision: +- 92790 $ +-*/ +-#ifndef CMONDATA_H +-#define CMONDATA_H +- +-#include "FDK_bitstream.h" +- +-struct COMMON_DATA { +- INT sbrHdrBits; /**< number of SBR header bits */ +- INT sbrDataBits; /**< number of SBR data bits */ +- INT sbrFillBits; /**< number of SBR fill bits */ +- FDK_BITSTREAM sbrBitbuf; /**< the SBR data bitbuffer */ +- FDK_BITSTREAM tmpWriteBitbuf; /**< helper var for writing header*/ +- INT xOverFreq; /**< the SBR crossover frequency */ +- INT dynBwEnabled; /**< indicates if dynamic bandwidth is enabled */ +- INT sbrNumChannels; /**< number of channels (meaning mono or stereo) */ +- INT dynXOverFreqEnc; /**< encoder dynamic crossover frequency */ +-}; +- +-typedef struct COMMON_DATA *HANDLE_COMMON_DATA; +- +-#endif +diff --git a/libSBRenc/src/code_env.cpp b/libSBRenc/src/code_env.cpp +deleted file mode 100644 +index fb0f6a4..0000000 +--- a/libSBRenc/src/code_env.cpp ++++ /dev/null +@@ -1,602 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "code_env.h" +-#include "sbrenc_rom.h" +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_InitSbrHuffmanTables +- description: initializes Huffman Tables dependent on chosen amp_res +- returns: error handle +- input: +- output: +- +-*****************************************************************************/ +-INT FDKsbrEnc_InitSbrHuffmanTables(HANDLE_SBR_ENV_DATA sbrEnvData, +- HANDLE_SBR_CODE_ENVELOPE henv, +- HANDLE_SBR_CODE_ENVELOPE hnoise, +- AMP_RES amp_res) { +- if ((!henv) || (!hnoise) || (!sbrEnvData)) return (1); /* not init. */ +- +- sbrEnvData->init_sbr_amp_res = amp_res; +- +- switch (amp_res) { +- case SBR_AMP_RES_3_0: +- /*envelope data*/ +- +- /*Level/Pan - coding */ +- sbrEnvData->hufftableLevelTimeC = v_Huff_envelopeLevelC11T; +- sbrEnvData->hufftableLevelTimeL = v_Huff_envelopeLevelL11T; +- sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC11T; +- sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL11T; +- +- sbrEnvData->hufftableLevelFreqC = v_Huff_envelopeLevelC11F; +- sbrEnvData->hufftableLevelFreqL = v_Huff_envelopeLevelL11F; +- sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC11F; +- sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL11F; +- +- /*Right/Left - coding */ +- sbrEnvData->hufftableTimeC = v_Huff_envelopeLevelC11T; +- sbrEnvData->hufftableTimeL = v_Huff_envelopeLevelL11T; +- sbrEnvData->hufftableFreqC = v_Huff_envelopeLevelC11F; +- sbrEnvData->hufftableFreqL = v_Huff_envelopeLevelL11F; +- +- sbrEnvData->codeBookScfLavBalance = CODE_BOOK_SCF_LAV_BALANCE11; +- sbrEnvData->codeBookScfLav = CODE_BOOK_SCF_LAV11; +- +- sbrEnvData->si_sbr_start_env_bits = SI_SBR_START_ENV_BITS_AMP_RES_3_0; +- sbrEnvData->si_sbr_start_env_bits_balance = +- SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0; +- break; +- +- case SBR_AMP_RES_1_5: +- /*envelope data*/ +- +- /*Level/Pan - coding */ +- sbrEnvData->hufftableLevelTimeC = v_Huff_envelopeLevelC10T; +- sbrEnvData->hufftableLevelTimeL = v_Huff_envelopeLevelL10T; +- sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC10T; +- sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL10T; +- +- sbrEnvData->hufftableLevelFreqC = v_Huff_envelopeLevelC10F; +- sbrEnvData->hufftableLevelFreqL = v_Huff_envelopeLevelL10F; +- sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC10F; +- sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL10F; +- +- /*Right/Left - coding */ +- sbrEnvData->hufftableTimeC = v_Huff_envelopeLevelC10T; +- sbrEnvData->hufftableTimeL = v_Huff_envelopeLevelL10T; +- sbrEnvData->hufftableFreqC = v_Huff_envelopeLevelC10F; +- sbrEnvData->hufftableFreqL = v_Huff_envelopeLevelL10F; +- +- sbrEnvData->codeBookScfLavBalance = CODE_BOOK_SCF_LAV_BALANCE10; +- sbrEnvData->codeBookScfLav = CODE_BOOK_SCF_LAV10; +- +- sbrEnvData->si_sbr_start_env_bits = SI_SBR_START_ENV_BITS_AMP_RES_1_5; +- sbrEnvData->si_sbr_start_env_bits_balance = +- SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5; +- break; +- +- default: +- return (1); /* undefined amp_res mode */ +- } +- +- /* these are common to both amp_res values */ +- /*Noise data*/ +- +- /*Level/Pan - coding */ +- sbrEnvData->hufftableNoiseLevelTimeC = v_Huff_NoiseLevelC11T; +- sbrEnvData->hufftableNoiseLevelTimeL = v_Huff_NoiseLevelL11T; +- sbrEnvData->hufftableNoiseBalanceTimeC = bookSbrNoiseBalanceC11T; +- sbrEnvData->hufftableNoiseBalanceTimeL = bookSbrNoiseBalanceL11T; +- +- sbrEnvData->hufftableNoiseLevelFreqC = v_Huff_envelopeLevelC11F; +- sbrEnvData->hufftableNoiseLevelFreqL = v_Huff_envelopeLevelL11F; +- sbrEnvData->hufftableNoiseBalanceFreqC = bookSbrEnvBalanceC11F; +- sbrEnvData->hufftableNoiseBalanceFreqL = bookSbrEnvBalanceL11F; +- +- /*Right/Left - coding */ +- sbrEnvData->hufftableNoiseTimeC = v_Huff_NoiseLevelC11T; +- sbrEnvData->hufftableNoiseTimeL = v_Huff_NoiseLevelL11T; +- sbrEnvData->hufftableNoiseFreqC = v_Huff_envelopeLevelC11F; +- sbrEnvData->hufftableNoiseFreqL = v_Huff_envelopeLevelL11F; +- +- sbrEnvData->si_sbr_start_noise_bits = SI_SBR_START_NOISE_BITS_AMP_RES_3_0; +- sbrEnvData->si_sbr_start_noise_bits_balance = +- SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0; +- +- /* init envelope tables and codebooks */ +- henv->codeBookScfLavBalanceTime = sbrEnvData->codeBookScfLavBalance; +- henv->codeBookScfLavBalanceFreq = sbrEnvData->codeBookScfLavBalance; +- henv->codeBookScfLavLevelTime = sbrEnvData->codeBookScfLav; +- henv->codeBookScfLavLevelFreq = sbrEnvData->codeBookScfLav; +- henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; +- henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; +- +- henv->hufftableLevelTimeL = sbrEnvData->hufftableLevelTimeL; +- henv->hufftableBalanceTimeL = sbrEnvData->hufftableBalanceTimeL; +- henv->hufftableTimeL = sbrEnvData->hufftableTimeL; +- henv->hufftableLevelFreqL = sbrEnvData->hufftableLevelFreqL; +- henv->hufftableBalanceFreqL = sbrEnvData->hufftableBalanceFreqL; +- henv->hufftableFreqL = sbrEnvData->hufftableFreqL; +- +- henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; +- henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; +- +- henv->start_bits = sbrEnvData->si_sbr_start_env_bits; +- henv->start_bits_balance = sbrEnvData->si_sbr_start_env_bits_balance; +- +- /* init noise tables and codebooks */ +- +- hnoise->codeBookScfLavBalanceTime = CODE_BOOK_SCF_LAV_BALANCE11; +- hnoise->codeBookScfLavBalanceFreq = CODE_BOOK_SCF_LAV_BALANCE11; +- hnoise->codeBookScfLavLevelTime = CODE_BOOK_SCF_LAV11; +- hnoise->codeBookScfLavLevelFreq = CODE_BOOK_SCF_LAV11; +- hnoise->codeBookScfLavTime = CODE_BOOK_SCF_LAV11; +- hnoise->codeBookScfLavFreq = CODE_BOOK_SCF_LAV11; +- +- hnoise->hufftableLevelTimeL = sbrEnvData->hufftableNoiseLevelTimeL; +- hnoise->hufftableBalanceTimeL = sbrEnvData->hufftableNoiseBalanceTimeL; +- hnoise->hufftableTimeL = sbrEnvData->hufftableNoiseTimeL; +- hnoise->hufftableLevelFreqL = sbrEnvData->hufftableNoiseLevelFreqL; +- hnoise->hufftableBalanceFreqL = sbrEnvData->hufftableNoiseBalanceFreqL; +- hnoise->hufftableFreqL = sbrEnvData->hufftableNoiseFreqL; +- +- hnoise->start_bits = sbrEnvData->si_sbr_start_noise_bits; +- hnoise->start_bits_balance = sbrEnvData->si_sbr_start_noise_bits_balance; +- +- /* No delta coding in time from the previous frame due to 1.5dB FIx-FIX rule +- */ +- henv->upDate = 0; +- hnoise->upDate = 0; +- return (0); +-} +- +-/******************************************************************************* +- Functionname: indexLow2High +- ******************************************************************************* +- +- Description: Nice small patch-functions in order to cope with non-factor-2 +- ratios between high-res and low-res +- +- Arguments: INT offset, INT index, FREQ_RES res +- +- Return: INT +- +-*******************************************************************************/ +-static INT indexLow2High(INT offset, INT index, FREQ_RES res) { +- if (res == FREQ_RES_LOW) { +- if (offset >= 0) { +- if (index < offset) +- return (index); +- else +- return (2 * index - offset); +- } else { +- offset = -offset; +- if (index < offset) +- return (2 * index + index); +- else +- return (2 * index + offset); +- } +- } else +- return (index); +-} +- +-/******************************************************************************* +- Functionname: mapLowResEnergyVal +- ******************************************************************************* +- +- Description: +- +- Arguments: INT currVal,INT* prevData, INT offset, INT index, FREQ_RES res +- +- Return: none +- +-*******************************************************************************/ +-static void mapLowResEnergyVal(SCHAR currVal, SCHAR *prevData, INT offset, +- INT index, FREQ_RES res) { +- if (res == FREQ_RES_LOW) { +- if (offset >= 0) { +- if (index < offset) +- prevData[index] = currVal; +- else { +- prevData[2 * index - offset] = currVal; +- prevData[2 * index + 1 - offset] = currVal; +- } +- } else { +- offset = -offset; +- if (index < offset) { +- prevData[3 * index] = currVal; +- prevData[3 * index + 1] = currVal; +- prevData[3 * index + 2] = currVal; +- } else { +- prevData[2 * index + offset] = currVal; +- prevData[2 * index + 1 + offset] = currVal; +- } +- } +- } else +- prevData[index] = currVal; +-} +- +-/******************************************************************************* +- Functionname: computeBits +- ******************************************************************************* +- +- Description: +- +- Arguments: INT delta, +- INT codeBookScfLavLevel, +- INT codeBookScfLavBalance, +- const UCHAR * hufftableLevel, +- const UCHAR * hufftableBalance, INT coupling, INT channel) +- +- Return: INT +- +-*******************************************************************************/ +-static INT computeBits(SCHAR *delta, INT codeBookScfLavLevel, +- INT codeBookScfLavBalance, const UCHAR *hufftableLevel, +- const UCHAR *hufftableBalance, INT coupling, +- INT channel) { +- INT index; +- INT delta_bits = 0; +- +- if (coupling) { +- if (channel == 1) { +- if (*delta < 0) +- index = fixMax(*delta, -codeBookScfLavBalance); +- else +- index = fixMin(*delta, codeBookScfLavBalance); +- +- if (index != *delta) { +- *delta = index; +- return (10000); +- } +- +- delta_bits = hufftableBalance[index + codeBookScfLavBalance]; +- } else { +- if (*delta < 0) +- index = fixMax(*delta, -codeBookScfLavLevel); +- else +- index = fixMin(*delta, codeBookScfLavLevel); +- +- if (index != *delta) { +- *delta = index; +- return (10000); +- } +- delta_bits = hufftableLevel[index + codeBookScfLavLevel]; +- } +- } else { +- if (*delta < 0) +- index = fixMax(*delta, -codeBookScfLavLevel); +- else +- index = fixMin(*delta, codeBookScfLavLevel); +- +- if (index != *delta) { +- *delta = index; +- return (10000); +- } +- delta_bits = hufftableLevel[index + codeBookScfLavLevel]; +- } +- +- return (delta_bits); +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_codeEnvelope +- ******************************************************************************* +- +- Description: +- +- Arguments: INT *sfb_nrg, +- const FREQ_RES *freq_res, +- SBR_CODE_ENVELOPE * h_sbrCodeEnvelope, +- INT *directionVec, INT scalable, INT nEnvelopes, INT channel, +- INT headerActive) +- +- Return: none +- h_sbrCodeEnvelope->sfb_nrg_prev is modified ! +- sfb_nrg is modified +- h_sbrCodeEnvelope->update is modfied ! +- *directionVec is modified +- +-*******************************************************************************/ +-void FDKsbrEnc_codeEnvelope(SCHAR *sfb_nrg, const FREQ_RES *freq_res, +- SBR_CODE_ENVELOPE *h_sbrCodeEnvelope, +- INT *directionVec, INT coupling, INT nEnvelopes, +- INT channel, INT headerActive) { +- INT i, no_of_bands, band; +- FIXP_DBL tmp1, tmp2, tmp3, dF_edge_1stEnv; +- SCHAR *ptr_nrg; +- +- INT codeBookScfLavLevelTime; +- INT codeBookScfLavLevelFreq; +- INT codeBookScfLavBalanceTime; +- INT codeBookScfLavBalanceFreq; +- const UCHAR *hufftableLevelTimeL; +- const UCHAR *hufftableBalanceTimeL; +- const UCHAR *hufftableLevelFreqL; +- const UCHAR *hufftableBalanceFreqL; +- +- INT offset = h_sbrCodeEnvelope->offset; +- INT envDataTableCompFactor; +- +- INT delta_F_bits = 0, delta_T_bits = 0; +- INT use_dT; +- +- SCHAR delta_F[MAX_FREQ_COEFFS]; +- SCHAR delta_T[MAX_FREQ_COEFFS]; +- SCHAR last_nrg, curr_nrg; +- +- tmp1 = FL2FXCONST_DBL(0.5f) >> (DFRACT_BITS - 16 - 1); +- tmp2 = h_sbrCodeEnvelope->dF_edge_1stEnv >> (DFRACT_BITS - 16); +- tmp3 = (FIXP_DBL)fMult(h_sbrCodeEnvelope->dF_edge_incr, +- ((FIXP_DBL)h_sbrCodeEnvelope->dF_edge_incr_fac) << 15); +- +- dF_edge_1stEnv = tmp1 + tmp2 + tmp3; +- +- if (coupling) { +- codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavLevelTime; +- codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavLevelFreq; +- codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavBalanceTime; +- codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavBalanceFreq; +- hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableLevelTimeL; +- hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableBalanceTimeL; +- hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableLevelFreqL; +- hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableBalanceFreqL; +- } else { +- codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavTime; +- codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; +- codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavTime; +- codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; +- hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableTimeL; +- hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableTimeL; +- hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableFreqL; +- hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableFreqL; +- } +- +- if (coupling == 1 && channel == 1) +- envDataTableCompFactor = +- 1; /*should be one when the new huffman-tables are ready*/ +- else +- envDataTableCompFactor = 0; +- +- if (h_sbrCodeEnvelope->deltaTAcrossFrames == 0) h_sbrCodeEnvelope->upDate = 0; +- +- /* no delta coding in time in case of a header */ +- if (headerActive) h_sbrCodeEnvelope->upDate = 0; +- +- for (i = 0; i < nEnvelopes; i++) { +- if (freq_res[i] == FREQ_RES_HIGH) +- no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; +- else +- no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW]; +- +- ptr_nrg = sfb_nrg; +- curr_nrg = *ptr_nrg; +- +- delta_F[0] = curr_nrg >> envDataTableCompFactor; +- +- if (coupling && channel == 1) +- delta_F_bits = h_sbrCodeEnvelope->start_bits_balance; +- else +- delta_F_bits = h_sbrCodeEnvelope->start_bits; +- +- if (h_sbrCodeEnvelope->upDate != 0) { +- delta_T[0] = (curr_nrg - h_sbrCodeEnvelope->sfb_nrg_prev[0]) >> +- envDataTableCompFactor; +- +- delta_T_bits = computeBits(&delta_T[0], codeBookScfLavLevelTime, +- codeBookScfLavBalanceTime, hufftableLevelTimeL, +- hufftableBalanceTimeL, coupling, channel); +- } +- +- mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, 0, +- freq_res[i]); +- +- /* ensure that nrg difference is not higher than codeBookScfLavXXXFreq */ +- if (coupling && channel == 1) { +- for (band = no_of_bands - 1; band > 0; band--) { +- if (ptr_nrg[band] - ptr_nrg[band - 1] > codeBookScfLavBalanceFreq) { +- ptr_nrg[band - 1] = ptr_nrg[band] - codeBookScfLavBalanceFreq; +- } +- } +- for (band = 1; band < no_of_bands; band++) { +- if (ptr_nrg[band - 1] - ptr_nrg[band] > codeBookScfLavBalanceFreq) { +- ptr_nrg[band] = ptr_nrg[band - 1] - codeBookScfLavBalanceFreq; +- } +- } +- } else { +- for (band = no_of_bands - 1; band > 0; band--) { +- if (ptr_nrg[band] - ptr_nrg[band - 1] > codeBookScfLavLevelFreq) { +- ptr_nrg[band - 1] = ptr_nrg[band] - codeBookScfLavLevelFreq; +- } +- } +- for (band = 1; band < no_of_bands; band++) { +- if (ptr_nrg[band - 1] - ptr_nrg[band] > codeBookScfLavLevelFreq) { +- ptr_nrg[band] = ptr_nrg[band - 1] - codeBookScfLavLevelFreq; +- } +- } +- } +- +- /* Coding loop*/ +- for (band = 1; band < no_of_bands; band++) { +- last_nrg = (*ptr_nrg); +- ptr_nrg++; +- curr_nrg = (*ptr_nrg); +- +- delta_F[band] = (curr_nrg - last_nrg) >> envDataTableCompFactor; +- +- delta_F_bits += computeBits( +- &delta_F[band], codeBookScfLavLevelFreq, codeBookScfLavBalanceFreq, +- hufftableLevelFreqL, hufftableBalanceFreqL, coupling, channel); +- +- if (h_sbrCodeEnvelope->upDate != 0) { +- delta_T[band] = +- curr_nrg - +- h_sbrCodeEnvelope +- ->sfb_nrg_prev[indexLow2High(offset, band, freq_res[i])]; +- delta_T[band] = delta_T[band] >> envDataTableCompFactor; +- } +- +- mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, +- band, freq_res[i]); +- +- if (h_sbrCodeEnvelope->upDate != 0) { +- delta_T_bits += computeBits( +- &delta_T[band], codeBookScfLavLevelTime, codeBookScfLavBalanceTime, +- hufftableLevelTimeL, hufftableBalanceTimeL, coupling, channel); +- } +- } +- +- /* Replace sfb_nrg with deltacoded samples and set flag */ +- if (i == 0) { +- INT tmp_bits; +- tmp_bits = (((delta_T_bits * dF_edge_1stEnv) >> (DFRACT_BITS - 18)) + +- (FIXP_DBL)1) >> +- 1; +- use_dT = (h_sbrCodeEnvelope->upDate != 0 && (delta_F_bits > tmp_bits)); +- } else +- use_dT = (delta_T_bits < delta_F_bits && h_sbrCodeEnvelope->upDate != 0); +- +- if (use_dT) { +- directionVec[i] = TIME; +- FDKmemcpy(sfb_nrg, delta_T, no_of_bands * sizeof(SCHAR)); +- } else { +- h_sbrCodeEnvelope->upDate = 0; +- directionVec[i] = FREQ; +- FDKmemcpy(sfb_nrg, delta_F, no_of_bands * sizeof(SCHAR)); +- } +- sfb_nrg += no_of_bands; +- h_sbrCodeEnvelope->upDate = 1; +- } +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_InitSbrCodeEnvelope +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-INT FDKsbrEnc_InitSbrCodeEnvelope(HANDLE_SBR_CODE_ENVELOPE h_sbrCodeEnvelope, +- INT *nSfb, INT deltaTAcrossFrames, +- FIXP_DBL dF_edge_1stEnv, +- FIXP_DBL dF_edge_incr) { +- FDKmemclear(h_sbrCodeEnvelope, sizeof(SBR_CODE_ENVELOPE)); +- +- h_sbrCodeEnvelope->deltaTAcrossFrames = deltaTAcrossFrames; +- h_sbrCodeEnvelope->dF_edge_1stEnv = dF_edge_1stEnv; +- h_sbrCodeEnvelope->dF_edge_incr = dF_edge_incr; +- h_sbrCodeEnvelope->dF_edge_incr_fac = 0; +- h_sbrCodeEnvelope->upDate = 0; +- h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] = nSfb[FREQ_RES_LOW]; +- h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH] = nSfb[FREQ_RES_HIGH]; +- h_sbrCodeEnvelope->offset = 2 * h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] - +- h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; +- +- return (0); +-} +diff --git a/libSBRenc/src/code_env.h b/libSBRenc/src/code_env.h +deleted file mode 100644 +index 673a783..0000000 +--- a/libSBRenc/src/code_env.h ++++ /dev/null +@@ -1,161 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief DPCM Envelope coding $Revision: 92790 $ +-*/ +- +-#ifndef CODE_ENV_H +-#define CODE_ENV_H +- +-#include "sbr_def.h" +-#include "bit_sbr.h" +-#include "fram_gen.h" +- +-typedef struct { +- INT offset; +- INT upDate; +- INT nSfb[2]; +- SCHAR sfb_nrg_prev[MAX_FREQ_COEFFS]; +- INT deltaTAcrossFrames; +- FIXP_DBL dF_edge_1stEnv; +- FIXP_DBL dF_edge_incr; +- INT dF_edge_incr_fac; +- +- INT codeBookScfLavTime; +- INT codeBookScfLavFreq; +- +- INT codeBookScfLavLevelTime; +- INT codeBookScfLavLevelFreq; +- INT codeBookScfLavBalanceTime; +- INT codeBookScfLavBalanceFreq; +- +- INT start_bits; +- INT start_bits_balance; +- +- const UCHAR *hufftableTimeL; +- const UCHAR *hufftableFreqL; +- +- const UCHAR *hufftableLevelTimeL; +- const UCHAR *hufftableBalanceTimeL; +- const UCHAR *hufftableLevelFreqL; +- const UCHAR *hufftableBalanceFreqL; +-} SBR_CODE_ENVELOPE; +-typedef SBR_CODE_ENVELOPE *HANDLE_SBR_CODE_ENVELOPE; +- +-void FDKsbrEnc_codeEnvelope(SCHAR *sfb_nrg, const FREQ_RES *freq_res, +- SBR_CODE_ENVELOPE *h_sbrCodeEnvelope, +- INT *directionVec, INT coupling, INT nEnvelopes, +- INT channel, INT headerActive); +- +-INT FDKsbrEnc_InitSbrCodeEnvelope(HANDLE_SBR_CODE_ENVELOPE h_sbrCodeEnvelope, +- INT *nSfb, INT deltaTAcrossFrames, +- FIXP_DBL dF_edge_1stEnv, +- FIXP_DBL dF_edge_incr); +- +-INT FDKsbrEnc_InitSbrHuffmanTables(struct SBR_ENV_DATA *sbrEnvData, +- HANDLE_SBR_CODE_ENVELOPE henv, +- HANDLE_SBR_CODE_ENVELOPE hnoise, +- AMP_RES amp_res); +- +-#endif +diff --git a/libSBRenc/src/env_bit.cpp b/libSBRenc/src/env_bit.cpp +deleted file mode 100644 +index 41812ac..0000000 +--- a/libSBRenc/src/env_bit.cpp ++++ /dev/null +@@ -1,257 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Remaining SBR Bit Writing Routines +-*/ +- +-#include "env_bit.h" +-#include "cmondata.h" +- +-#ifndef min +-#define min(a, b) (a < b ? a : b) +-#endif +- +-#ifndef max +-#define max(a, b) (a > b ? a : b) +-#endif +- +-/* ***************************** crcAdvance **********************************/ +-/** +- * @fn +- * @brief updates crc data register +- * @return none +- * +- * This function updates the crc register +- * +- */ +-static void crcAdvance(USHORT crcPoly, USHORT crcMask, USHORT *crc, +- ULONG bValue, INT bBits) { +- INT i; +- USHORT flag; +- +- for (i = bBits - 1; i >= 0; i--) { +- flag = ((*crc) & crcMask) ? (1) : (0); +- flag ^= (bValue & (1 << i)) ? (1) : (0); +- +- (*crc) <<= 1; +- if (flag) (*crc) ^= crcPoly; +- } +-} +- +-/* ***************************** FDKsbrEnc_InitSbrBitstream +- * **********************************/ +-/** +- * @fn +- * @brief Inittialisation of sbr bitstream, write of dummy header and CRC +- * @return none +- * +- * +- * +- */ +- +-INT FDKsbrEnc_InitSbrBitstream( +- HANDLE_COMMON_DATA hCmonData, +- UCHAR *memoryBase, /*!< Pointer to bitstream buffer */ +- INT memorySize, /*!< Length of bitstream buffer in bytes */ +- HANDLE_FDK_CRCINFO hCrcInfo, UINT sbrSyntaxFlags) /*!< SBR syntax flags */ +-{ +- INT crcRegion = 0; +- +- /* reset bit buffer */ +- FDKresetBitbuffer(&hCmonData->sbrBitbuf, BS_WRITER); +- +- FDKinitBitStream(&hCmonData->tmpWriteBitbuf, memoryBase, memorySize, 0, +- BS_WRITER); +- +- if (sbrSyntaxFlags & SBR_SYNTAX_CRC) { +- if (sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC) { /* Init and start CRC region */ +- FDKwriteBits(&hCmonData->sbrBitbuf, 0x0, SI_SBR_DRM_CRC_BITS); +- FDKcrcInit(hCrcInfo, 0x001d, 0xFFFF, SI_SBR_DRM_CRC_BITS); +- crcRegion = FDKcrcStartReg(hCrcInfo, &hCmonData->sbrBitbuf, 0); +- } else { +- FDKwriteBits(&hCmonData->sbrBitbuf, 0x0, SI_SBR_CRC_BITS); +- } +- } +- +- return (crcRegion); +-} +- +-/* ************************** FDKsbrEnc_AssembleSbrBitstream +- * *******************************/ +-/** +- * @fn +- * @brief Formats the SBR payload +- * @return nothing +- * +- * Also the CRC will be calculated here. +- * +- */ +- +-void FDKsbrEnc_AssembleSbrBitstream(HANDLE_COMMON_DATA hCmonData, +- HANDLE_FDK_CRCINFO hCrcInfo, INT crcRegion, +- UINT sbrSyntaxFlags) { +- USHORT crcReg = SBR_CRCINIT; +- INT numCrcBits, i; +- +- /* check if SBR is present */ +- if (hCmonData == NULL) return; +- +- hCmonData->sbrFillBits = 0; /* Fill bits are written only for GA streams */ +- +- if (sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC) { +- /* +- * Calculate and write DRM CRC +- */ +- FDKcrcEndReg(hCrcInfo, &hCmonData->sbrBitbuf, crcRegion); +- FDKwriteBits(&hCmonData->tmpWriteBitbuf, FDKcrcGetCRC(hCrcInfo) ^ 0xFF, +- SI_SBR_DRM_CRC_BITS); +- } else { +- if (!(sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY)) { +- /* Do alignment here, because its defined as part of the +- * sbr_extension_data */ +- int sbrLoad = hCmonData->sbrHdrBits + hCmonData->sbrDataBits; +- +- if (sbrSyntaxFlags & SBR_SYNTAX_CRC) { +- sbrLoad += SI_SBR_CRC_BITS; +- } +- +- sbrLoad += 4; /* Do byte Align with 4 bit offset. ISO/IEC 14496-3:2005(E) +- page 39. */ +- +- hCmonData->sbrFillBits = (8 - (sbrLoad % 8)) % 8; +- +- /* +- append fill bits +- */ +- FDKwriteBits(&hCmonData->sbrBitbuf, 0, hCmonData->sbrFillBits); +- +- FDK_ASSERT(FDKgetValidBits(&hCmonData->sbrBitbuf) % 8 == 4); +- } +- +- /* +- calculate crc +- */ +- if (sbrSyntaxFlags & SBR_SYNTAX_CRC) { +- FDK_BITSTREAM tmpCRCBuf = hCmonData->sbrBitbuf; +- FDKresetBitbuffer(&tmpCRCBuf, BS_READER); +- +- numCrcBits = hCmonData->sbrHdrBits + hCmonData->sbrDataBits + +- hCmonData->sbrFillBits; +- +- for (i = 0; i < numCrcBits; i++) { +- INT bit; +- bit = FDKreadBits(&tmpCRCBuf, 1); +- crcAdvance(SBR_CRC_POLY, SBR_CRC_MASK, &crcReg, bit, 1); +- } +- crcReg &= (SBR_CRC_RANGE); +- +- /* +- * Write CRC data. +- */ +- FDKwriteBits(&hCmonData->tmpWriteBitbuf, crcReg, SI_SBR_CRC_BITS); +- } +- } +- +- FDKsyncCache(&hCmonData->tmpWriteBitbuf); +-} +diff --git a/libSBRenc/src/env_bit.h b/libSBRenc/src/env_bit.h +deleted file mode 100644 +index b91802c..0000000 +--- a/libSBRenc/src/env_bit.h ++++ /dev/null +@@ -1,135 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Remaining SBR Bit Writing Routines +-*/ +- +-#ifndef ENV_BIT_H +-#define ENV_BIT_H +- +-#include "sbr_encoder.h" +-#include "FDK_crc.h" +- +-/* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ +-#define SBR_CRC_POLY (0x0233) +-#define SBR_CRC_MASK (0x0200) +-#define SBR_CRC_RANGE (0x03FF) +-#define SBR_CRC_MAXREGS 1 +-#define SBR_CRCINIT (0x0) +- +-#define SI_SBR_CRC_ENABLE_BITS 0 +-#define SI_SBR_CRC_BITS 10 +-#define SI_SBR_DRM_CRC_BITS 8 +- +-struct COMMON_DATA; +- +-INT FDKsbrEnc_InitSbrBitstream(struct COMMON_DATA *hCmonData, UCHAR *memoryBase, +- INT memorySize, HANDLE_FDK_CRCINFO hCrcInfo, +- UINT sbrSyntaxFlags); +- +-void FDKsbrEnc_AssembleSbrBitstream(struct COMMON_DATA *hCmonData, +- HANDLE_FDK_CRCINFO hCrcInfo, INT crcRegion, +- UINT sbrSyntaxFlags); +- +-#endif /* #ifndef ENV_BIT_H */ +diff --git a/libSBRenc/src/env_est.cpp b/libSBRenc/src/env_est.cpp +deleted file mode 100644 +index 0eb8425..0000000 +--- a/libSBRenc/src/env_est.cpp ++++ /dev/null +@@ -1,1985 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "env_est.h" +-#include "tran_det.h" +- +-#include "qmf.h" +- +-#include "fram_gen.h" +-#include "bit_sbr.h" +-#include "cmondata.h" +-#include "sbrenc_ram.h" +- +-#include "genericStds.h" +- +-#define QUANT_ERROR_THRES 200 +-#define Y_NRG_SCALE 5 /* noCols = 32 -> shift(5) */ +-#define MAX_NRG_SLOTS_LD 16 +- +-static const UCHAR panTable[2][10] = {{0, 2, 4, 6, 8, 12, 16, 20, 24}, +- {0, 2, 4, 8, 12, 0, 0, 0, 0}}; +-static const UCHAR maxIndex[2] = {9, 5}; +- +-/****************************************************************************** +- Functionname: FDKsbrEnc_GetTonality +-******************************************************************************/ +-/***************************************************************************/ +-/*! +- +- \brief Calculates complete energy per band from the energy values +- of the QMF subsamples. +- +- \brief quotaMatrix - calculated in FDKsbrEnc_CalculateTonalityQuotas() +- \brief noEstPerFrame - number of estimations per frame +- \brief startIndex - start index for the quota matrix +- \brief Energies - energy matrix +- \brief startBand - start band +- \brief stopBand - number of QMF bands +- \brief numberCols - number of QMF subsamples +- +- \return mean tonality of the 5 bands with the highest energy +- scaled by 2^(RELAXATION_SHIFT+2)*RELAXATION_FRACT +- +-****************************************************************************/ +-static FIXP_DBL FDKsbrEnc_GetTonality(const FIXP_DBL *const *quotaMatrix, +- const INT noEstPerFrame, +- const INT startIndex, +- const FIXP_DBL *const *Energies, +- const UCHAR startBand, const INT stopBand, +- const INT numberCols) { +- UCHAR b, e, k; +- INT no_enMaxBand[SBR_MAX_ENERGY_VALUES] = {-1, -1, -1, -1, -1}; +- FIXP_DBL energyMax[SBR_MAX_ENERGY_VALUES] = { +- FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f), +- FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL energyMaxMin = MAXVAL_DBL; /* min. energy in energyMax array */ +- UCHAR posEnergyMaxMin = 0; /* min. energy in energyMax array position */ +- FIXP_DBL tonalityBand[SBR_MAX_ENERGY_VALUES] = { +- FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f), +- FL2FXCONST_DBL(0.0f), FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL globalTonality = FL2FXCONST_DBL(0.0f); +- FIXP_DBL energyBand[64]; +- INT maxNEnergyValues; /* max. number of max. energy values */ +- +- /*** Sum up energies for each band ***/ +- FDK_ASSERT(numberCols == 15 || numberCols == 16); +- /* numberCols is always 15 or 16 for ELD. In case of 16 bands, the +- energyBands are initialized with the [15]th column. +- The rest of the column energies are added in the next step. */ +- if (numberCols == 15) { +- for (b = startBand; b < stopBand; b++) { +- energyBand[b] = FL2FXCONST_DBL(0.0f); +- } +- } else { +- for (b = startBand; b < stopBand; b++) { +- energyBand[b] = Energies[15][b] >> 4; +- } +- } +- +- for (k = 0; k < 15; k++) { +- for (b = startBand; b < stopBand; b++) { +- energyBand[b] += Energies[k][b] >> 4; +- } +- } +- +- /*** Determine 5 highest band-energies ***/ +- maxNEnergyValues = fMin(SBR_MAX_ENERGY_VALUES, stopBand - startBand); +- +- /* Get min. value in energyMax array */ +- energyMaxMin = energyMax[0] = energyBand[startBand]; +- no_enMaxBand[0] = startBand; +- posEnergyMaxMin = 0; +- for (k = 1; k < maxNEnergyValues; k++) { +- energyMax[k] = energyBand[startBand + k]; +- no_enMaxBand[k] = startBand + k; +- if (energyMaxMin > energyMax[k]) { +- energyMaxMin = energyMax[k]; +- posEnergyMaxMin = k; +- } +- } +- +- for (b = startBand + maxNEnergyValues; b < stopBand; b++) { +- if (energyBand[b] > energyMaxMin) { +- energyMax[posEnergyMaxMin] = energyBand[b]; +- no_enMaxBand[posEnergyMaxMin] = b; +- +- /* Again, get min. value in energyMax array */ +- energyMaxMin = energyMax[0]; +- posEnergyMaxMin = 0; +- for (k = 1; k < maxNEnergyValues; k++) { +- if (energyMaxMin > energyMax[k]) { +- energyMaxMin = energyMax[k]; +- posEnergyMaxMin = k; +- } +- } +- } +- } +- /*** End determine 5 highest band-energies ***/ +- +- /* Get tonality values for 5 highest energies */ +- for (e = 0; e < maxNEnergyValues; e++) { +- tonalityBand[e] = FL2FXCONST_DBL(0.0f); +- for (k = 0; k < noEstPerFrame; k++) { +- tonalityBand[e] += quotaMatrix[startIndex + k][no_enMaxBand[e]] >> 1; +- } +- globalTonality += +- tonalityBand[e] >> 2; /* headroom of 2+1 (max. 5 additions) */ +- } +- +- return globalTonality; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Calculates energy form real and imaginary part of +- the QMF subsamples +- +- \return none +- +-****************************************************************************/ +-LNK_SECTION_CODE_L1 +-static void FDKsbrEnc_getEnergyFromCplxQmfData( +- FIXP_DBL **RESTRICT energyValues, /*!< the result of the operation */ +- FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ +- FIXP_DBL **RESTRICT +- imagValues, /*!< the imaginary part of the QMF subsamples */ +- INT numberBands, /*!< number of QMF bands */ +- INT numberCols, /*!< number of QMF subsamples */ +- INT *qmfScale, /*!< sclefactor of QMF subsamples */ +- INT *energyScale) /*!< scalefactor of energies */ +-{ +- int j, k; +- int scale; +- FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); +- +- /* Get Scratch buffer */ +- C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, 32 * 64 / 2) +- +- /* Get max possible scaling of QMF data */ +- scale = DFRACT_BITS; +- for (k = 0; k < numberCols; k++) { +- scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), +- getScalefactor(imagValues[k], numberBands))); +- } +- +- /* Tweak scaling stability for zero signal to non-zero signal transitions */ +- if (scale >= DFRACT_BITS - 1) { +- scale = (FRACT_BITS - 1 - *qmfScale); +- } +- /* prevent scaling of QMF values to -1.f */ +- scale = fixMax(0, scale - 1); +- +- /* Update QMF scale */ +- *qmfScale += scale; +- +- /* +- Calculate energy of each time slot pair, max energy +- and shift QMF values as far as possible to the left. +- */ +- { +- FIXP_DBL *nrgValues = tmpNrg; +- for (k = 0; k < numberCols; k += 2) { +- /* Load band vector addresses of 2 consecutive timeslots */ +- FIXP_DBL *RESTRICT r0 = realValues[k]; +- FIXP_DBL *RESTRICT i0 = imagValues[k]; +- FIXP_DBL *RESTRICT r1 = realValues[k + 1]; +- FIXP_DBL *RESTRICT i1 = imagValues[k + 1]; +- for (j = 0; j < numberBands; j++) { +- FIXP_DBL energy; +- FIXP_DBL tr0, tr1, ti0, ti1; +- +- /* Read QMF values of 2 timeslots */ +- tr0 = r0[j]; +- tr1 = r1[j]; +- ti0 = i0[j]; +- ti1 = i1[j]; +- +- /* Scale QMF Values and Calc Energy average of both timeslots */ +- tr0 <<= scale; +- ti0 <<= scale; +- energy = fPow2AddDiv2(fPow2Div2(tr0), ti0) >> 1; +- +- tr1 <<= scale; +- ti1 <<= scale; +- energy += fPow2AddDiv2(fPow2Div2(tr1), ti1) >> 1; +- +- /* Write timeslot pair energy to scratch */ +- *nrgValues++ = energy; +- max_val = fixMax(max_val, energy); +- +- /* Write back scaled QMF values */ +- r0[j] = tr0; +- r1[j] = tr1; +- i0[j] = ti0; +- i1[j] = ti1; +- } +- } +- } +- /* energyScale: scalefactor energies of current frame */ +- *energyScale = +- 2 * (*qmfScale) - +- 1; /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ +- +- /* Scale timeslot pair energies and write to output buffer */ +- scale = CountLeadingBits(max_val); +- { +- FIXP_DBL *nrgValues = tmpNrg; +- for (k = 0; k> 1; k++) { +- scaleValues(energyValues[k], nrgValues, numberBands, scale); +- nrgValues += numberBands; +- } +- *energyScale += scale; +- } +- +- /* Free Scratch buffer */ +- C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, 32 * 64 / 2) +-} +- +-LNK_SECTION_CODE_L1 +-static void FDKsbrEnc_getEnergyFromCplxQmfDataFull( +- FIXP_DBL **RESTRICT energyValues, /*!< the result of the operation */ +- FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ +- FIXP_DBL **RESTRICT +- imagValues, /*!< the imaginary part of the QMF subsamples */ +- int numberBands, /*!< number of QMF bands */ +- int numberCols, /*!< number of QMF subsamples */ +- int *qmfScale, /*!< scalefactor of QMF subsamples */ +- int *energyScale) /*!< scalefactor of energies */ +-{ +- int j, k; +- int scale; +- FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); +- +- /* Get Scratch buffer */ +- C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, MAX_NRG_SLOTS_LD * 64) +- +- FDK_ASSERT(numberCols <= MAX_NRG_SLOTS_LD); +- FDK_ASSERT(numberBands <= 64); +- +- /* Get max possible scaling of QMF data */ +- scale = DFRACT_BITS; +- for (k = 0; k < numberCols; k++) { +- scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), +- getScalefactor(imagValues[k], numberBands))); +- } +- +- /* Tweak scaling stability for zero signal to non-zero signal transitions */ +- if (scale >= DFRACT_BITS - 1) { +- scale = (FRACT_BITS - 1 - *qmfScale); +- } +- /* prevent scaling of QFM values to -1.f */ +- scale = fixMax(0, scale - 1); +- +- /* Update QMF scale */ +- *qmfScale += scale; +- +- /* +- Calculate energy of each time slot pair, max energy +- and shift QMF values as far as possible to the left. +- */ +- { +- FIXP_DBL *nrgValues = tmpNrg; +- for (k = 0; k < numberCols; k++) { +- /* Load band vector addresses of 1 timeslot */ +- FIXP_DBL *RESTRICT r0 = realValues[k]; +- FIXP_DBL *RESTRICT i0 = imagValues[k]; +- for (j = 0; j < numberBands; j++) { +- FIXP_DBL energy; +- FIXP_DBL tr0, ti0; +- +- /* Read QMF values of 1 timeslot */ +- tr0 = r0[j]; +- ti0 = i0[j]; +- +- /* Scale QMF Values and Calc Energy */ +- tr0 <<= scale; +- ti0 <<= scale; +- energy = fPow2AddDiv2(fPow2Div2(tr0), ti0); +- *nrgValues++ = energy; +- +- max_val = fixMax(max_val, energy); +- +- /* Write back scaled QMF values */ +- r0[j] = tr0; +- i0[j] = ti0; +- } +- } +- } +- /* energyScale: scalefactor energies of current frame */ +- *energyScale = +- 2 * (*qmfScale) - +- 1; /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ +- +- /* Scale timeslot pair energies and write to output buffer */ +- scale = CountLeadingBits(max_val); +- { +- FIXP_DBL *nrgValues = tmpNrg; +- for (k = 0; k < numberCols; k++) { +- scaleValues(energyValues[k], nrgValues, numberBands, scale); +- nrgValues += numberBands; +- } +- *energyScale += scale; +- } +- +- /* Free Scratch buffer */ +- C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, MAX_NRG_SLOTS_LD * 64) +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Quantisation of the panorama value (balance) +- +- \return the quantized pan value +- +-****************************************************************************/ +-static INT mapPanorama(INT nrgVal, /*! integer value of the energy */ +- INT ampRes, /*! amplitude resolution [1.5/3dB] */ +- INT *quantError /*! quantization error of energy val*/ +-) { +- int i; +- INT min_val, val; +- UCHAR panIndex; +- INT sign; +- +- sign = nrgVal > 0 ? 1 : -1; +- +- nrgVal *= sign; +- +- min_val = FDK_INT_MAX; +- panIndex = 0; +- for (i = 0; i < maxIndex[ampRes]; i++) { +- val = fixp_abs((nrgVal - (INT)panTable[ampRes][i])); +- +- if (val < min_val) { +- min_val = val; +- panIndex = i; +- } +- } +- +- *quantError = min_val; +- +- return panTable[ampRes][maxIndex[ampRes] - 1] + +- sign * panTable[ampRes][panIndex]; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Quantisation of the noise floor levels +- +- \return void +- +-****************************************************************************/ +-static void sbrNoiseFloorLevelsQuantisation( +- SCHAR *RESTRICT iNoiseLevels, /*! quantized noise levels */ +- FIXP_DBL *RESTRICT +- NoiseLevels, /*! the noise levels. Exponent = LD_DATA_SHIFT */ +- INT coupling /*! the coupling flag */ +-) { +- INT i; +- INT tmp, dummy; +- +- /* Quantisation, similar to sfb quant... */ +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { +- /* tmp = NoiseLevels[i] > (PFLOAT)30.0f ? 30: (INT) (NoiseLevels[i] + +- * (PFLOAT)0.5); */ +- /* 30>>LD_DATA_SHIFT = 0.46875 */ +- if ((FIXP_DBL)NoiseLevels[i] > FL2FXCONST_DBL(0.46875f)) { +- tmp = 30; +- } else { +- /* tmp = (INT)((FIXP_DBL)NoiseLevels[i] + (FL2FXCONST_DBL(0.5f)>>(*/ +- /* FRACT_BITS+ */ /* 6-1)));*/ +- /* tmp = tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT); */ /* conversion to integer +- happens here */ +- /* rounding is done by shifting one bit less than necessary to the right, +- * adding '1' and then shifting the final bit */ +- tmp = ((((INT)NoiseLevels[i]) >> +- (DFRACT_BITS - 1 - LD_DATA_SHIFT))); /* conversion to integer */ +- if (tmp != 0) tmp += 1; +- } +- +- if (coupling) { +- tmp = tmp < -30 ? -30 : tmp; +- tmp = mapPanorama(tmp, 1, &dummy); +- } +- iNoiseLevels[i] = tmp; +- } +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Calculation of noise floor for coupling +- +- \return void +- +-****************************************************************************/ +-static void coupleNoiseFloor( +- FIXP_DBL *RESTRICT noise_level_left, /*! noise level left (modified)*/ +- FIXP_DBL *RESTRICT noise_level_right /*! noise level right (modified)*/ +-) { +- FIXP_DBL cmpValLeft, cmpValRight; +- INT i; +- FIXP_DBL temp1, temp2; +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { +- /* Calculation of the power function using ld64: +- z = x^y; +- z' = CalcLd64(z) = y*CalcLd64(x)/64; +- z = CalcInvLd64(z'); +- */ +- cmpValLeft = NOISE_FLOOR_OFFSET_64 - noise_level_left[i]; +- cmpValRight = NOISE_FLOOR_OFFSET_64 - noise_level_right[i]; +- +- if (cmpValRight < FL2FXCONST_DBL(0.0f)) { +- temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); +- } else { +- temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); +- temp1 = temp1 << (DFRACT_BITS - 1 - LD_DATA_SHIFT - +- 1); /* INT to fract conversion of result, if input of +- CalcInvLdData is positiv */ +- } +- +- if (cmpValLeft < FL2FXCONST_DBL(0.0f)) { +- temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); +- } else { +- temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); +- temp2 = temp2 << (DFRACT_BITS - 1 - LD_DATA_SHIFT - +- 1); /* INT to fract conversion of result, if input of +- CalcInvLdData is positiv */ +- } +- +- if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && +- (cmpValRight < FL2FXCONST_DBL(0.0f))) { +- noise_level_left[i] = +- NOISE_FLOOR_OFFSET_64 - +- (CalcLdData( +- ((temp1 >> 1) + +- (temp2 >> 1)))); /* no scaling needed! both values are dfract */ +- noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); +- } +- +- if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && +- (cmpValRight >= FL2FXCONST_DBL(0.0f))) { +- noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - +- (CalcLdData(((temp1 >> 1) + (temp2 >> 1))) + +- FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ +- noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); +- } +- +- if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && +- (cmpValRight < FL2FXCONST_DBL(0.0f))) { +- noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - +- (CalcLdData(((temp1 >> (7 + 1)) + (temp2 >> 1))) + +- FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ +- noise_level_right[i] = +- (CalcLdData(temp2) + FL2FXCONST_DBL(0.109375f)) - CalcLdData(temp1); +- } +- +- if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && +- (cmpValRight >= FL2FXCONST_DBL(0.0f))) { +- noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - +- (CalcLdData(((temp1 >> 1) + (temp2 >> (7 + 1)))) + +- FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ +- noise_level_right[i] = CalcLdData(temp2) - +- (CalcLdData(temp1) + +- FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ +- } +- } +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Calculation of energy starting in lower band (li) up to upper band +-(ui) over slots (start_pos) to (stop_pos) +- +- \return void +- +-****************************************************************************/ +- +-static FIXP_DBL getEnvSfbEnergy( +- INT li, /*! lower band */ +- INT ui, /*! upper band */ +- INT start_pos, /*! start slot */ +- INT stop_pos, /*! stop slot */ +- INT border_pos, /*! slots scaling border */ +- FIXP_DBL **YBuffer, /*! sfb energy buffer */ +- INT YBufferSzShift, /*! Energy buffer index scale */ +- INT scaleNrg0, /*! scaling of lower slots */ +- INT scaleNrg1) /*! scaling of upper slots */ +-{ +- /* use dynamic scaling for outer energy loop; +- energies are critical and every bit is important */ +- int sc0, sc1, k, l; +- +- FIXP_DBL nrgSum, nrg1, nrg2, accu1, accu2; +- INT dynScale, dynScale1, dynScale2; +- if (ui - li == 0) +- dynScale = DFRACT_BITS - 1; +- else +- dynScale = CalcLdInt(ui - li) >> (DFRACT_BITS - 1 - LD_DATA_SHIFT); +- +- sc0 = fixMin(scaleNrg0, Y_NRG_SCALE); +- sc1 = fixMin(scaleNrg1, Y_NRG_SCALE); +- /* dynScale{1,2} is set such that the right shift below is positive */ +- dynScale1 = fixMin((scaleNrg0 - sc0), dynScale); +- dynScale2 = fixMin((scaleNrg1 - sc1), dynScale); +- nrgSum = accu1 = accu2 = (FIXP_DBL)0; +- +- for (k = li; k < ui; k++) { +- nrg1 = nrg2 = (FIXP_DBL)0; +- for (l = start_pos; l < border_pos; l++) { +- nrg1 += YBuffer[l >> YBufferSzShift][k] >> sc0; +- } +- for (; l < stop_pos; l++) { +- nrg2 += YBuffer[l >> YBufferSzShift][k] >> sc1; +- } +- accu1 += (nrg1 >> dynScale1); +- accu2 += (nrg2 >> dynScale2); +- } +- /* This shift factor is always positive. See comment above. */ +- nrgSum += +- (accu1 >> fixMin((scaleNrg0 - sc0 - dynScale1), (DFRACT_BITS - 1))) + +- (accu2 >> fixMin((scaleNrg1 - sc1 - dynScale2), (DFRACT_BITS - 1))); +- +- return nrgSum; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Energy compensation in missing harmonic mode +- +- \return void +- +-****************************************************************************/ +-static FIXP_DBL mhLoweringEnergy(FIXP_DBL nrg, INT M) { +- /* +- Compensating for the fact that we in the decoder map the "average energy to +- every QMF band, and use this when we calculate the boost-factor. Since the +- mapped energy isn't the average energy but the maximum energy in case of +- missing harmonic creation, we will in the boost function calculate that too +- much limiting has been applied and hence we will boost the signal although +- it isn't called for. Hence we need to compensate for this by lowering the +- transmitted energy values for the sines so they will get the correct level +- after the boost is applied. +- */ +- if (M > 2) { +- INT tmpScale; +- tmpScale = CountLeadingBits(nrg); +- nrg <<= tmpScale; +- nrg = fMult(nrg, FL2FXCONST_DBL(0.398107267f)); /* The maximum boost +- is 1.584893, so the +- maximum attenuation +- should be +- square(1/1.584893) = +- 0.398107267 */ +- nrg >>= tmpScale; +- } else { +- if (M > 1) { +- nrg >>= 1; +- } +- } +- +- return nrg; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Energy compensation in none missing harmonic mode +- +- \return void +- +-****************************************************************************/ +-static FIXP_DBL nmhLoweringEnergy(FIXP_DBL nrg, const FIXP_DBL nrgSum, +- const INT nrgSum_scale, const INT M) { +- if (nrg > FL2FXCONST_DBL(0)) { +- int sc = 0; +- /* gain = nrgSum / (nrg*(M+1)) */ +- FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M + 1)); +- sc += nrgSum_scale; +- +- /* reduce nrg if gain smaller 1.f */ +- if (!((sc >= 0) && (gain > ((FIXP_DBL)MAXVAL_DBL >> sc)))) { +- nrg = fMult(scaleValue(gain, sc), nrg); +- } +- } +- return nrg; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief calculates the envelope values from the energies, depending on +- framing and stereo mode +- +- \return void +- +-****************************************************************************/ +-static void calculateSbrEnvelope( +- FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left */ +- FIXP_DBL **RESTRICT YBufferRight, /*! energy buffer right */ +- int *RESTRICT YBufferScaleLeft, /*! scale energy buffer left */ +- int *RESTRICT YBufferScaleRight, /*! scale energy buffer right */ +- const SBR_FRAME_INFO *frame_info, /*! frame info vector */ +- SCHAR *RESTRICT sfb_nrgLeft, /*! sfb energy buffer left */ +- SCHAR *RESTRICT sfb_nrgRight, /*! sfb energy buffer right */ +- HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ +- HANDLE_ENV_CHANNEL h_sbr, /*! envelope channel handle */ +- SBR_STEREO_MODE stereoMode, /*! stereo coding mode */ +- INT *maxQuantError, /*! maximum quantization error, for panorama. */ +- int YBufferSzShift) /*! Energy buffer index scale */ +- +-{ +- int env, j, m = 0; +- INT no_of_bands, start_pos, stop_pos, li, ui; +- FREQ_RES freq_res; +- +- INT ca = 2 - h_sbr->encEnvData.init_sbr_amp_res; +- INT oneBitLess = 0; +- if (ca == 2) +- oneBitLess = +- 1; /* LD_DATA_SHIFT => ld64 scaling; one bit less for rounding */ +- +- INT quantError; +- INT nEnvelopes = frame_info->nEnvelopes; +- INT short_env = frame_info->shortEnv - 1; +- INT timeStep = h_sbr->sbrExtractEnvelope.time_step; +- INT commonScale, scaleLeft0, scaleLeft1; +- INT scaleRight0 = 0, scaleRight1 = 0; +- +- commonScale = fixMin(YBufferScaleLeft[0], YBufferScaleLeft[1]); +- +- if (stereoMode == SBR_COUPLING) { +- commonScale = fixMin(commonScale, YBufferScaleRight[0]); +- commonScale = fixMin(commonScale, YBufferScaleRight[1]); +- } +- +- commonScale = commonScale - 7; +- +- scaleLeft0 = YBufferScaleLeft[0] - commonScale; +- scaleLeft1 = YBufferScaleLeft[1] - commonScale; +- FDK_ASSERT((scaleLeft0 >= 0) && (scaleLeft1 >= 0)); +- +- if (stereoMode == SBR_COUPLING) { +- scaleRight0 = YBufferScaleRight[0] - commonScale; +- scaleRight1 = YBufferScaleRight[1] - commonScale; +- FDK_ASSERT((scaleRight0 >= 0) && (scaleRight1 >= 0)); +- *maxQuantError = 0; +- } +- +- for (env = 0; env < nEnvelopes; env++) { +- FIXP_DBL pNrgLeft[32]; +- FIXP_DBL pNrgRight[32]; +- int envNrg_scale; +- FIXP_DBL envNrgLeft = FL2FXCONST_DBL(0.0f); +- FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f); +- int missingHarmonic[32]; +- int count[32]; +- +- start_pos = timeStep * frame_info->borders[env]; +- stop_pos = timeStep * frame_info->borders[env + 1]; +- freq_res = frame_info->freqRes[env]; +- no_of_bands = h_con->nSfb[freq_res]; +- envNrg_scale = DFRACT_BITS - fNormz((FIXP_DBL)no_of_bands); +- if (env == short_env) { +- j = fMax(2, timeStep); /* consider at least 2 QMF slots less for short +- envelopes (envelopes just before transients) */ +- if ((stop_pos - start_pos - j) > 0) { +- stop_pos = stop_pos - j; +- } +- } +- for (j = 0; j < no_of_bands; j++) { +- FIXP_DBL nrgLeft = FL2FXCONST_DBL(0.0f); +- FIXP_DBL nrgRight = FL2FXCONST_DBL(0.0f); +- +- li = h_con->freqBandTable[freq_res][j]; +- ui = h_con->freqBandTable[freq_res][j + 1]; +- +- if (freq_res == FREQ_RES_HIGH) { +- if (j == 0 && ui - li > 1) { +- li++; +- } +- } else { +- if (j == 0 && ui - li > 2) { +- li++; +- } +- } +- +- /* +- Find out whether a sine will be missing in the scale-factor +- band that we're currently processing. +- */ +- missingHarmonic[j] = 0; +- +- if (h_sbr->encEnvData.addHarmonicFlag) { +- if (freq_res == FREQ_RES_HIGH) { +- if (h_sbr->encEnvData +- .addHarmonic[j]) { /*A missing sine in the current band*/ +- missingHarmonic[j] = 1; +- } +- } else { +- INT i; +- INT startBandHigh = 0; +- INT stopBandHigh = 0; +- +- while (h_con->freqBandTable[FREQ_RES_HIGH][startBandHigh] < +- h_con->freqBandTable[FREQ_RES_LOW][j]) +- startBandHigh++; +- while (h_con->freqBandTable[FREQ_RES_HIGH][stopBandHigh] < +- h_con->freqBandTable[FREQ_RES_LOW][j + 1]) +- stopBandHigh++; +- +- for (i = startBandHigh; i < stopBandHigh; i++) { +- if (h_sbr->encEnvData.addHarmonic[i]) { +- missingHarmonic[j] = 1; +- } +- } +- } +- } +- +- /* +- If a sine is missing in a scalefactorband, with more than one qmf +- channel use the nrg from the channel with the largest nrg rather than +- the mean. Compensate for the boost calculation in the decdoder. +- */ +- int border_pos = +- fixMin(stop_pos, h_sbr->sbrExtractEnvelope.YBufferWriteOffset +- << YBufferSzShift); +- +- if (missingHarmonic[j]) { +- int k; +- count[j] = stop_pos - start_pos; +- nrgLeft = FL2FXCONST_DBL(0.0f); +- +- for (k = li; k < ui; k++) { +- FIXP_DBL tmpNrg; +- tmpNrg = getEnvSfbEnergy(k, k + 1, start_pos, stop_pos, border_pos, +- YBufferLeft, YBufferSzShift, scaleLeft0, +- scaleLeft1); +- +- nrgLeft = fixMax(nrgLeft, tmpNrg); +- } +- +- /* Energy lowering compensation */ +- nrgLeft = mhLoweringEnergy(nrgLeft, ui - li); +- +- if (stereoMode == SBR_COUPLING) { +- nrgRight = FL2FXCONST_DBL(0.0f); +- +- for (k = li; k < ui; k++) { +- FIXP_DBL tmpNrg; +- tmpNrg = getEnvSfbEnergy(k, k + 1, start_pos, stop_pos, border_pos, +- YBufferRight, YBufferSzShift, scaleRight0, +- scaleRight1); +- +- nrgRight = fixMax(nrgRight, tmpNrg); +- } +- +- /* Energy lowering compensation */ +- nrgRight = mhLoweringEnergy(nrgRight, ui - li); +- } +- } /* end missingHarmonic */ +- else { +- count[j] = (stop_pos - start_pos) * (ui - li); +- +- nrgLeft = getEnvSfbEnergy(li, ui, start_pos, stop_pos, border_pos, +- YBufferLeft, YBufferSzShift, scaleLeft0, +- scaleLeft1); +- +- if (stereoMode == SBR_COUPLING) { +- nrgRight = getEnvSfbEnergy(li, ui, start_pos, stop_pos, border_pos, +- YBufferRight, YBufferSzShift, scaleRight0, +- scaleRight1); +- } +- } /* !missingHarmonic */ +- +- /* save energies */ +- pNrgLeft[j] = nrgLeft; +- pNrgRight[j] = nrgRight; +- envNrgLeft += (nrgLeft >> envNrg_scale); +- envNrgRight += (nrgRight >> envNrg_scale); +- } /* j */ +- +- for (j = 0; j < no_of_bands; j++) { +- FIXP_DBL nrgLeft2 = FL2FXCONST_DBL(0.0f); +- FIXP_DBL nrgLeft = pNrgLeft[j]; +- FIXP_DBL nrgRight = pNrgRight[j]; +- +- /* None missing harmonic Energy lowering compensation */ +- if (!missingHarmonic[j] && h_sbr->fLevelProtect) { +- /* in case of missing energy in base band, +- reduce reference energy to prevent overflows in decoder output */ +- nrgLeft = +- nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands); +- if (stereoMode == SBR_COUPLING) { +- nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, +- no_of_bands); +- } +- } +- +- if (stereoMode == SBR_COUPLING) { +- /* calc operation later with log */ +- nrgLeft2 = nrgLeft; +- nrgLeft = (nrgRight + nrgLeft) >> 1; +- } +- +- /* nrgLeft = f20_log2(nrgLeft / (PFLOAT)(count * 64))+(PFLOAT)44; */ +- /* If nrgLeft == 0 then the Log calculations below do fail. */ +- if (nrgLeft > FL2FXCONST_DBL(0.0f)) { +- FIXP_DBL tmp0, tmp1, tmp2, tmp3; +- INT tmpScale; +- +- tmpScale = CountLeadingBits(nrgLeft); +- nrgLeft = nrgLeft << tmpScale; +- +- tmp0 = CalcLdData(nrgLeft); /* scaled by 1/64 */ +- tmp1 = ((FIXP_DBL)(commonScale + tmpScale)) +- << (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1); /* scaled by 1/64 */ +- tmp2 = ((FIXP_DBL)(count[j] * 64)) << (DFRACT_BITS - 1 - 14 - 1); +- tmp2 = CalcLdData(tmp2); /* scaled by 1/64 */ +- tmp3 = FL2FXCONST_DBL(0.6875f - 0.21875f - 0.015625f) >> +- 1; /* scaled by 1/64 */ +- +- nrgLeft = ((tmp0 - tmp2) >> 1) + (tmp3 - tmp1); +- } else { +- nrgLeft = FL2FXCONST_DBL(-1.0f); +- } +- +- /* ld64 to integer conversion */ +- nrgLeft = fixMin(fixMax(nrgLeft, FL2FXCONST_DBL(0.0f)), +- (FL2FXCONST_DBL(0.5f) >> oneBitLess)); +- nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> +- (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1 - oneBitLess - 1); +- sfb_nrgLeft[m] = ((INT)nrgLeft + 1) >> 1; /* rounding */ +- +- if (stereoMode == SBR_COUPLING) { +- FIXP_DBL scaleFract; +- int sc0, sc1; +- +- nrgLeft2 = fixMax((FIXP_DBL)0x1, nrgLeft2); +- nrgRight = fixMax((FIXP_DBL)0x1, nrgRight); +- +- sc0 = CountLeadingBits(nrgLeft2); +- sc1 = CountLeadingBits(nrgRight); +- +- scaleFract = +- ((FIXP_DBL)(sc0 - sc1)) +- << (DFRACT_BITS - 1 - +- LD_DATA_SHIFT); /* scale value in ld64 representation */ +- nrgRight = CalcLdData(nrgLeft2 << sc0) - CalcLdData(nrgRight << sc1) - +- scaleFract; +- +- /* ld64 to integer conversion */ +- nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> +- (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1 - oneBitLess); +- nrgRight = (nrgRight + (FIXP_DBL)1) >> 1; /* rounding */ +- +- sfb_nrgRight[m] = mapPanorama( +- nrgRight, h_sbr->encEnvData.init_sbr_amp_res, &quantError); +- +- *maxQuantError = fixMax(quantError, *maxQuantError); +- } +- +- m++; +- } /* j */ +- +- /* Do energy compensation for sines that are present in two +- QMF-bands in the original, but will only occur in one band in +- the decoder due to the synthetic sine coding.*/ +- if (h_con->useParametricCoding) { +- m -= no_of_bands; +- for (j = 0; j < no_of_bands; j++) { +- if (freq_res == FREQ_RES_HIGH && +- h_sbr->sbrExtractEnvelope.envelopeCompensation[j]) { +- sfb_nrgLeft[m] -= +- (ca * +- fixp_abs( +- (INT)h_sbr->sbrExtractEnvelope.envelopeCompensation[j])); +- } +- sfb_nrgLeft[m] = fixMax(0, sfb_nrgLeft[m]); +- m++; +- } +- } /* useParametricCoding */ +- +- } /* env loop */ +-} +- +-/***************************************************************************/ +-/*! +- +- \brief calculates the noise floor and the envelope values from the +- energies, depending on framing and stereo mode +- +- FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the +- envelope and the noise floor. The function includes the following processes: +- +- -Analysis subband filtering. +- -Encoding SA and pan parameters (if enabled). +- -Transient detection. +- +-****************************************************************************/ +- +-LNK_SECTION_CODE_L1 +-void FDKsbrEnc_extractSbrEnvelope1( +- HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL hEnvChan, +- HANDLE_COMMON_DATA hCmonData, SBR_ENV_TEMP_DATA *eData, +- SBR_FRAME_TEMP_DATA *fData) { +- HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; +- +- if (sbrExtrEnv->YBufferSzShift == 0) +- FDKsbrEnc_getEnergyFromCplxQmfDataFull( +- &sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], +- sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, +- sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, h_con->noQmfBands, +- sbrExtrEnv->no_cols, &hEnvChan->qmfScale, &sbrExtrEnv->YBufferScale[1]); +- else +- FDKsbrEnc_getEnergyFromCplxQmfData( +- &sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], +- sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, +- sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, h_con->noQmfBands, +- sbrExtrEnv->no_cols, &hEnvChan->qmfScale, &sbrExtrEnv->YBufferScale[1]); +- +- /* Energie values = +- * sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset][x].floatVal * +- * (1<<2*7-sbrExtrEnv->YBufferScale[1]) */ +- +- /* +- Precalculation of Tonality Quotas COEFF Transform OK +- */ +- FDKsbrEnc_CalculateTonalityQuotas( +- &hEnvChan->TonCorr, sbrExtrEnv->rBuffer, sbrExtrEnv->iBuffer, +- h_con->freqBandTable[HI][h_con->nSfb[HI]], hEnvChan->qmfScale); +- +- if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- FIXP_DBL tonality = FDKsbrEnc_GetTonality( +- hEnvChan->TonCorr.quotaMatrix, +- hEnvChan->TonCorr.numberOfEstimatesPerFrame, +- hEnvChan->TonCorr.startIndexMatrix, +- sbrExtrEnv->YBuffer + sbrExtrEnv->YBufferWriteOffset, +- h_con->freqBandTable[HI][0] + 1, h_con->noQmfBands, +- sbrExtrEnv->no_cols); +- +- hEnvChan->encEnvData.ton_HF[1] = hEnvChan->encEnvData.ton_HF[0]; +- hEnvChan->encEnvData.ton_HF[0] = tonality; +- +- /* tonality is scaled by 2^19/0.524288f (fract part of RELAXATION) */ +- hEnvChan->encEnvData.global_tonality = +- (hEnvChan->encEnvData.ton_HF[0] >> 1) + +- (hEnvChan->encEnvData.ton_HF[1] >> 1); +- } +- +- /* +- Transient detection COEFF Transform OK +- */ +- +- if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- FDKsbrEnc_fastTransientDetect(&hEnvChan->sbrFastTransientDetector, +- sbrExtrEnv->YBuffer, sbrExtrEnv->YBufferScale, +- sbrExtrEnv->YBufferWriteOffset, +- eData->transient_info); +- +- } else { +- FDKsbrEnc_transientDetect( +- &hEnvChan->sbrTransientDetector, sbrExtrEnv->YBuffer, +- sbrExtrEnv->YBufferScale, eData->transient_info, +- sbrExtrEnv->YBufferWriteOffset, sbrExtrEnv->YBufferSzShift, +- sbrExtrEnv->time_step, hEnvChan->SbrEnvFrame.frameMiddleSlot); +- } +- +- /* +- Generate flags for 2 env in a FIXFIX-frame. +- Remove this function to get always 1 env per FIXFIX-frame. +- */ +- +- /* +- frame Splitter COEFF Transform OK +- */ +- FDKsbrEnc_frameSplitter( +- sbrExtrEnv->YBuffer, sbrExtrEnv->YBufferScale, +- &hEnvChan->sbrTransientDetector, h_con->freqBandTable[1], +- eData->transient_info, sbrExtrEnv->YBufferWriteOffset, +- sbrExtrEnv->YBufferSzShift, h_con->nSfb[1], sbrExtrEnv->time_step, +- sbrExtrEnv->no_cols, &hEnvChan->encEnvData.global_tonality); +-} +- +-/***************************************************************************/ +-/*! +- +- \brief calculates the noise floor and the envelope values from the +- energies, depending on framing and stereo mode +- +- FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the +- envelope and the noise floor. The function includes the following processes: +- +- -Determine time/frequency division of current granule. +- -Sending transient info to bitstream. +- -Set amp_res to 1.5 dB if the current frame contains only one envelope. +- -Lock dynamic bandwidth frequency change if the next envelope not starts on a +- frame boundary. +- -MDCT transposer (needed to detect where harmonics will be missing). +- -Spectrum Estimation (used for pulse train and missing harmonics detection). +- -Pulse train detection. +- -Inverse Filtering detection. +- -Waveform Coding. +- -Missing Harmonics detection. +- -Extract envelope of current frame. +- -Noise floor estimation. +- -Noise floor quantisation and coding. +- -Encode envelope of current frame. +- -Send the encoded data to the bitstream. +- -Write to bitstream. +- +-****************************************************************************/ +- +-LNK_SECTION_CODE_L1 +-void FDKsbrEnc_extractSbrEnvelope2( +- HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL h_envChan0, +- HANDLE_ENV_CHANNEL h_envChan1, HANDLE_COMMON_DATA hCmonData, +- SBR_ENV_TEMP_DATA *eData, SBR_FRAME_TEMP_DATA *fData, int clearOutput) { +- HANDLE_ENV_CHANNEL h_envChan[MAX_NUM_CHANNELS] = {h_envChan0, h_envChan1}; +- int ch, i, j, c, YSzShift = h_envChan[0]->sbrExtractEnvelope.YBufferSzShift; +- +- SBR_STEREO_MODE stereoMode = h_con->stereoMode; +- int nChannels = h_con->nChannels; +- const int *v_tuning; +- static const int v_tuningHEAAC[6] = {0, 2, 4, 0, 0, 0}; +- +- static const int v_tuningELD[6] = {0, 2, 3, 0, 0, 0}; +- +- if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) +- v_tuning = v_tuningELD; +- else +- v_tuning = v_tuningHEAAC; +- +- /* +- Select stereo mode. +- */ +- if (stereoMode == SBR_COUPLING) { +- if (eData[0].transient_info[1] && eData[1].transient_info[1]) { +- eData[0].transient_info[0] = +- fixMin(eData[1].transient_info[0], eData[0].transient_info[0]); +- eData[1].transient_info[0] = eData[0].transient_info[0]; +- } else { +- if (eData[0].transient_info[1] && !eData[1].transient_info[1]) { +- eData[1].transient_info[0] = eData[0].transient_info[0]; +- } else { +- if (!eData[0].transient_info[1] && eData[1].transient_info[1]) +- eData[0].transient_info[0] = eData[1].transient_info[0]; +- else { +- eData[0].transient_info[0] = +- fixMax(eData[1].transient_info[0], eData[0].transient_info[0]); +- eData[1].transient_info[0] = eData[0].transient_info[0]; +- } +- } +- } +- } +- +- /* +- Determine time/frequency division of current granule +- */ +- eData[0].frame_info = FDKsbrEnc_frameInfoGenerator( +- &h_envChan[0]->SbrEnvFrame, eData[0].transient_info, +- sbrBitstreamData->rightBorderFIX, +- h_envChan[0]->sbrExtractEnvelope.pre_transient_info, +- h_envChan[0]->encEnvData.ldGrid, v_tuning); +- +- h_envChan[0]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; +- +- /* AAC LD patch for transient prediction */ +- if (h_envChan[0]->encEnvData.ldGrid && eData[0].transient_info[2]) { +- /* if next frame will start with transient, set shortEnv to +- * numEnvelopes(shortend Envelope = shortEnv-1)*/ +- h_envChan[0]->SbrEnvFrame.SbrFrameInfo.shortEnv = +- h_envChan[0]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; +- } +- +- switch (stereoMode) { +- case SBR_LEFT_RIGHT: +- case SBR_SWITCH_LRC: +- eData[1].frame_info = FDKsbrEnc_frameInfoGenerator( +- &h_envChan[1]->SbrEnvFrame, eData[1].transient_info, +- sbrBitstreamData->rightBorderFIX, +- h_envChan[1]->sbrExtractEnvelope.pre_transient_info, +- h_envChan[1]->encEnvData.ldGrid, v_tuning); +- +- h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[1]->SbrEnvFrame.SbrGrid; +- +- if (h_envChan[1]->encEnvData.ldGrid && eData[1].transient_info[2]) { +- /* if next frame will start with transient, set shortEnv to +- * numEnvelopes(shortend Envelope = shortEnv-1)*/ +- h_envChan[1]->SbrEnvFrame.SbrFrameInfo.shortEnv = +- h_envChan[1]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; +- } +- +- /* compare left and right frame_infos */ +- if (eData[0].frame_info->nEnvelopes != eData[1].frame_info->nEnvelopes) { +- stereoMode = SBR_LEFT_RIGHT; +- } else { +- for (i = 0; i < eData[0].frame_info->nEnvelopes + 1; i++) { +- if (eData[0].frame_info->borders[i] != +- eData[1].frame_info->borders[i]) { +- stereoMode = SBR_LEFT_RIGHT; +- break; +- } +- } +- for (i = 0; i < eData[0].frame_info->nEnvelopes; i++) { +- if (eData[0].frame_info->freqRes[i] != +- eData[1].frame_info->freqRes[i]) { +- stereoMode = SBR_LEFT_RIGHT; +- break; +- } +- } +- if (eData[0].frame_info->shortEnv != eData[1].frame_info->shortEnv) { +- stereoMode = SBR_LEFT_RIGHT; +- } +- } +- break; +- case SBR_COUPLING: +- eData[1].frame_info = eData[0].frame_info; +- h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; +- break; +- case SBR_MONO: +- /* nothing to do */ +- break; +- default: +- FDK_ASSERT(0); +- } +- +- for (ch = 0; ch < nChannels; ch++) { +- HANDLE_ENV_CHANNEL hEnvChan = h_envChan[ch]; +- HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; +- SBR_ENV_TEMP_DATA *ed = &eData[ch]; +- +- /* +- Send transient info to bitstream and store for next call +- */ +- sbrExtrEnv->pre_transient_info[0] = ed->transient_info[0]; /* tran_pos */ +- sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1]; /* tran_flag */ +- hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes = +- ed->frame_info->nEnvelopes; /* number of envelopes of current frame */ +- +- /* +- Check if the current frame is divided into one envelope only. If so, set +- the amplitude resolution to 1.5 dB, otherwise may set back to chosen value +- */ +- if ((hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX) && +- (ed->nEnvelopes == 1)) { +- if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- /* Note: global_tonaliy_float_value == +- ((float)hEnvChan->encEnvData.global_tonality/((INT64)(1)<<(31-(19+2)))/0.524288*(2.0/3.0))); +- threshold_float_value == +- ((float)h_con->thresholdAmpResFF_m/((INT64)(1)<<(31-(h_con->thresholdAmpResFF_e)))/0.524288*(2.0/3.0))); +- */ +- /* decision of SBR_AMP_RES */ +- if (fIsLessThan(/* global_tonality > threshold ? */ +- h_con->thresholdAmpResFF_m, h_con->thresholdAmpResFF_e, +- hEnvChan->encEnvData.global_tonality, +- RELAXATION_SHIFT + 2)) { +- hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5; +- } else { +- hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_3_0; +- } +- } else +- hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5; +- +- if (hEnvChan->encEnvData.currentAmpResFF != +- hEnvChan->encEnvData.init_sbr_amp_res) { +- FDKsbrEnc_InitSbrHuffmanTables( +- &hEnvChan->encEnvData, &hEnvChan->sbrCodeEnvelope, +- &hEnvChan->sbrCodeNoiseFloor, hEnvChan->encEnvData.currentAmpResFF); +- } +- } else { +- if (sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res) { +- FDKsbrEnc_InitSbrHuffmanTables( +- &hEnvChan->encEnvData, &hEnvChan->sbrCodeEnvelope, +- &hEnvChan->sbrCodeNoiseFloor, sbrHeaderData->sbr_amp_res); +- } +- } +- +- if (!clearOutput) { +- /* +- Tonality correction parameter extraction (inverse filtering level, noise +- floor additional sines). +- */ +- FDKsbrEnc_TonCorrParamExtr( +- &hEnvChan->TonCorr, hEnvChan->encEnvData.sbr_invf_mode_vec, +- ed->noiseFloor, &hEnvChan->encEnvData.addHarmonicFlag, +- hEnvChan->encEnvData.addHarmonic, sbrExtrEnv->envelopeCompensation, +- ed->frame_info, ed->transient_info, h_con->freqBandTable[HI], +- h_con->nSfb[HI], hEnvChan->encEnvData.sbr_xpos_mode, +- h_con->sbrSyntaxFlags); +- } +- +- /* Low energy in low band fix */ +- if (hEnvChan->sbrTransientDetector.prevLowBandEnergy < +- hEnvChan->sbrTransientDetector.prevHighBandEnergy && +- hEnvChan->sbrTransientDetector.prevHighBandEnergy > FL2FX_DBL(0.03) +- /* The fix needs the non-fast transient detector running. +- It sets prevLowBandEnergy and prevHighBandEnergy. */ +- && !(h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY)) { +- hEnvChan->fLevelProtect = 1; +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) +- hEnvChan->encEnvData.sbr_invf_mode_vec[i] = INVF_HIGH_LEVEL; +- } else { +- hEnvChan->fLevelProtect = 0; +- } +- +- hEnvChan->encEnvData.sbr_invf_mode = +- hEnvChan->encEnvData.sbr_invf_mode_vec[0]; +- +- hEnvChan->encEnvData.noOfnoisebands = +- hEnvChan->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; +- +- } /* ch */ +- +- /* +- Save number of scf bands per envelope +- */ +- for (ch = 0; ch < nChannels; ch++) { +- for (i = 0; i < eData[ch].nEnvelopes; i++) { +- h_envChan[ch]->encEnvData.noScfBands[i] = +- (eData[ch].frame_info->freqRes[i] == FREQ_RES_HIGH +- ? h_con->nSfb[FREQ_RES_HIGH] +- : h_con->nSfb[FREQ_RES_LOW]); +- } +- } +- +- /* +- Extract envelope of current frame. +- */ +- switch (stereoMode) { +- case SBR_MONO: +- calculateSbrEnvelope(h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, +- h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, +- eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, +- h_envChan[0], SBR_MONO, NULL, YSzShift); +- break; +- case SBR_LEFT_RIGHT: +- calculateSbrEnvelope(h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, +- h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, +- eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, +- h_envChan[0], SBR_MONO, NULL, YSzShift); +- calculateSbrEnvelope(h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, +- h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, +- eData[1].frame_info, eData[1].sfb_nrg, NULL, h_con, +- h_envChan[1], SBR_MONO, NULL, YSzShift); +- break; +- case SBR_COUPLING: +- calculateSbrEnvelope(h_envChan[0]->sbrExtractEnvelope.YBuffer, +- h_envChan[1]->sbrExtractEnvelope.YBuffer, +- h_envChan[0]->sbrExtractEnvelope.YBufferScale, +- h_envChan[1]->sbrExtractEnvelope.YBufferScale, +- eData[0].frame_info, eData[0].sfb_nrg, +- eData[1].sfb_nrg, h_con, h_envChan[0], SBR_COUPLING, +- &fData->maxQuantError, YSzShift); +- break; +- case SBR_SWITCH_LRC: +- calculateSbrEnvelope(h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, +- h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, +- eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, +- h_envChan[0], SBR_MONO, NULL, YSzShift); +- calculateSbrEnvelope(h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, +- h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, +- eData[1].frame_info, eData[1].sfb_nrg, NULL, h_con, +- h_envChan[1], SBR_MONO, NULL, YSzShift); +- calculateSbrEnvelope(h_envChan[0]->sbrExtractEnvelope.YBuffer, +- h_envChan[1]->sbrExtractEnvelope.YBuffer, +- h_envChan[0]->sbrExtractEnvelope.YBufferScale, +- h_envChan[1]->sbrExtractEnvelope.YBufferScale, +- eData[0].frame_info, eData[0].sfb_nrg_coupling, +- eData[1].sfb_nrg_coupling, h_con, h_envChan[0], +- SBR_COUPLING, &fData->maxQuantError, YSzShift); +- break; +- } +- +- /* +- Noise floor quantisation and coding. +- */ +- +- switch (stereoMode) { +- case SBR_MONO: +- sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, +- 0); +- +- FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, +- &h_envChan[0]->sbrCodeNoiseFloor, +- h_envChan[0]->encEnvData.domain_vec_noise, 0, +- (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- break; +- case SBR_LEFT_RIGHT: +- sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, +- 0); +- +- FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, +- &h_envChan[0]->sbrCodeNoiseFloor, +- h_envChan[0]->encEnvData.domain_vec_noise, 0, +- (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- sbrNoiseFloorLevelsQuantisation(eData[1].noise_level, eData[1].noiseFloor, +- 0); +- +- FDKsbrEnc_codeEnvelope(eData[1].noise_level, fData->res, +- &h_envChan[1]->sbrCodeNoiseFloor, +- h_envChan[1]->encEnvData.domain_vec_noise, 0, +- (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- break; +- +- case SBR_COUPLING: +- coupleNoiseFloor(eData[0].noiseFloor, eData[1].noiseFloor); +- +- sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, +- 0); +- +- FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, +- &h_envChan[0]->sbrCodeNoiseFloor, +- h_envChan[0]->encEnvData.domain_vec_noise, 1, +- (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- sbrNoiseFloorLevelsQuantisation(eData[1].noise_level, eData[1].noiseFloor, +- 1); +- +- FDKsbrEnc_codeEnvelope(eData[1].noise_level, fData->res, +- &h_envChan[1]->sbrCodeNoiseFloor, +- h_envChan[1]->encEnvData.domain_vec_noise, 1, +- (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, +- sbrBitstreamData->HeaderActive); +- +- break; +- case SBR_SWITCH_LRC: +- sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, +- 0); +- sbrNoiseFloorLevelsQuantisation(eData[1].noise_level, eData[1].noiseFloor, +- 0); +- coupleNoiseFloor(eData[0].noiseFloor, eData[1].noiseFloor); +- sbrNoiseFloorLevelsQuantisation(eData[0].noise_level_coupling, +- eData[0].noiseFloor, 0); +- sbrNoiseFloorLevelsQuantisation(eData[1].noise_level_coupling, +- eData[1].noiseFloor, 1); +- break; +- } +- +- /* +- Encode envelope of current frame. +- */ +- switch (stereoMode) { +- case SBR_MONO: +- sbrHeaderData->coupling = 0; +- h_envChan[0]->encEnvData.balance = 0; +- FDKsbrEnc_codeEnvelope( +- eData[0].sfb_nrg, eData[0].frame_info->freqRes, +- &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, +- sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- break; +- case SBR_LEFT_RIGHT: +- sbrHeaderData->coupling = 0; +- +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 0; +- +- FDKsbrEnc_codeEnvelope( +- eData[0].sfb_nrg, eData[0].frame_info->freqRes, +- &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, +- sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- FDKsbrEnc_codeEnvelope( +- eData[1].sfb_nrg, eData[1].frame_info->freqRes, +- &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, +- sbrHeaderData->coupling, eData[1].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- break; +- case SBR_COUPLING: +- sbrHeaderData->coupling = 1; +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 1; +- +- FDKsbrEnc_codeEnvelope( +- eData[0].sfb_nrg, eData[0].frame_info->freqRes, +- &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, +- sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- FDKsbrEnc_codeEnvelope( +- eData[1].sfb_nrg, eData[1].frame_info->freqRes, +- &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, +- sbrHeaderData->coupling, eData[1].frame_info->nEnvelopes, 1, +- sbrBitstreamData->HeaderActive); +- break; +- case SBR_SWITCH_LRC: { +- INT payloadbitsLR; +- INT payloadbitsCOUPLING; +- +- SCHAR sfbNrgPrevTemp[MAX_NUM_CHANNELS][MAX_FREQ_COEFFS]; +- SCHAR noisePrevTemp[MAX_NUM_CHANNELS][MAX_NUM_NOISE_COEFFS]; +- INT upDateNrgTemp[MAX_NUM_CHANNELS]; +- INT upDateNoiseTemp[MAX_NUM_CHANNELS]; +- INT domainVecTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; +- INT domainVecNoiseTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; +- +- INT tempFlagRight = 0; +- INT tempFlagLeft = 0; +- +- /* +- Store previous values, in order to be able to "undo" what is being +- done. +- */ +- +- for (ch = 0; ch < nChannels; ch++) { +- FDKmemcpy(sfbNrgPrevTemp[ch], +- h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, +- MAX_FREQ_COEFFS * sizeof(SCHAR)); +- +- FDKmemcpy(noisePrevTemp[ch], +- h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, +- MAX_NUM_NOISE_COEFFS * sizeof(SCHAR)); +- +- upDateNrgTemp[ch] = h_envChan[ch]->sbrCodeEnvelope.upDate; +- upDateNoiseTemp[ch] = h_envChan[ch]->sbrCodeNoiseFloor.upDate; +- +- /* +- forbid time coding in the first envelope in case of a different +- previous stereomode +- */ +- if (sbrHeaderData->prev_coupling) { +- h_envChan[ch]->sbrCodeEnvelope.upDate = 0; +- h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; +- } +- } /* ch */ +- +- /* +- Code ordinary Left/Right stereo +- */ +- FDKsbrEnc_codeEnvelope(eData[0].sfb_nrg, eData[0].frame_info->freqRes, +- &h_envChan[0]->sbrCodeEnvelope, +- h_envChan[0]->encEnvData.domain_vec, 0, +- eData[0].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- FDKsbrEnc_codeEnvelope(eData[1].sfb_nrg, eData[1].frame_info->freqRes, +- &h_envChan[1]->sbrCodeEnvelope, +- h_envChan[1]->encEnvData.domain_vec, 0, +- eData[1].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- +- c = 0; +- for (i = 0; i < eData[0].nEnvelopes; i++) { +- for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { +- h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg[c]; +- h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg[c]; +- c++; +- } +- } +- +- FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, +- &h_envChan[0]->sbrCodeNoiseFloor, +- h_envChan[0]->encEnvData.domain_vec_noise, 0, +- (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) +- h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level[i]; +- +- FDKsbrEnc_codeEnvelope(eData[1].noise_level, fData->res, +- &h_envChan[1]->sbrCodeNoiseFloor, +- h_envChan[1]->encEnvData.domain_vec_noise, 0, +- (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) +- h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level[i]; +- +- sbrHeaderData->coupling = 0; +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 0; +- +- payloadbitsLR = FDKsbrEnc_CountSbrChannelPairElement( +- sbrHeaderData, hParametricStereo, sbrBitstreamData, +- &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, +- h_con->sbrSyntaxFlags); +- +- /* +- swap saved stored with current values +- */ +- for (ch = 0; ch < nChannels; ch++) { +- INT itmp; +- for (i = 0; i < MAX_FREQ_COEFFS; i++) { +- /* +- swap sfb energies +- */ +- itmp = h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]; +- h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i] = +- sfbNrgPrevTemp[ch][i]; +- sfbNrgPrevTemp[ch][i] = itmp; +- } +- for (i = 0; i < MAX_NUM_NOISE_COEFFS; i++) { +- /* +- swap noise energies +- */ +- itmp = h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]; +- h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i] = +- noisePrevTemp[ch][i]; +- noisePrevTemp[ch][i] = itmp; +- } +- /* swap update flags */ +- itmp = h_envChan[ch]->sbrCodeEnvelope.upDate; +- h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch]; +- upDateNrgTemp[ch] = itmp; +- +- itmp = h_envChan[ch]->sbrCodeNoiseFloor.upDate; +- h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch]; +- upDateNoiseTemp[ch] = itmp; +- +- /* +- save domain vecs +- */ +- FDKmemcpy(domainVecTemp[ch], h_envChan[ch]->encEnvData.domain_vec, +- sizeof(INT) * MAX_ENVELOPES); +- FDKmemcpy(domainVecNoiseTemp[ch], +- h_envChan[ch]->encEnvData.domain_vec_noise, +- sizeof(INT) * MAX_ENVELOPES); +- +- /* +- forbid time coding in the first envelope in case of a different +- previous stereomode +- */ +- +- if (!sbrHeaderData->prev_coupling) { +- h_envChan[ch]->sbrCodeEnvelope.upDate = 0; +- h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; +- } +- } /* ch */ +- +- /* +- Coupling +- */ +- +- FDKsbrEnc_codeEnvelope( +- eData[0].sfb_nrg_coupling, eData[0].frame_info->freqRes, +- &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, +- 1, eData[0].frame_info->nEnvelopes, 0, +- sbrBitstreamData->HeaderActive); +- +- FDKsbrEnc_codeEnvelope( +- eData[1].sfb_nrg_coupling, eData[1].frame_info->freqRes, +- &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, +- 1, eData[1].frame_info->nEnvelopes, 1, +- sbrBitstreamData->HeaderActive); +- +- c = 0; +- for (i = 0; i < eData[0].nEnvelopes; i++) { +- for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { +- h_envChan[0]->encEnvData.ienvelope[i][j] = +- eData[0].sfb_nrg_coupling[c]; +- h_envChan[1]->encEnvData.ienvelope[i][j] = +- eData[1].sfb_nrg_coupling[c]; +- c++; +- } +- } +- +- FDKsbrEnc_codeEnvelope(eData[0].noise_level_coupling, fData->res, +- &h_envChan[0]->sbrCodeNoiseFloor, +- h_envChan[0]->encEnvData.domain_vec_noise, 1, +- (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, +- sbrBitstreamData->HeaderActive); +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) +- h_envChan[0]->encEnvData.sbr_noise_levels[i] = +- eData[0].noise_level_coupling[i]; +- +- FDKsbrEnc_codeEnvelope(eData[1].noise_level_coupling, fData->res, +- &h_envChan[1]->sbrCodeNoiseFloor, +- h_envChan[1]->encEnvData.domain_vec_noise, 1, +- (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, +- sbrBitstreamData->HeaderActive); +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) +- h_envChan[1]->encEnvData.sbr_noise_levels[i] = +- eData[1].noise_level_coupling[i]; +- +- sbrHeaderData->coupling = 1; +- +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 1; +- +- tempFlagLeft = h_envChan[0]->encEnvData.addHarmonicFlag; +- tempFlagRight = h_envChan[1]->encEnvData.addHarmonicFlag; +- +- payloadbitsCOUPLING = FDKsbrEnc_CountSbrChannelPairElement( +- sbrHeaderData, hParametricStereo, sbrBitstreamData, +- &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, +- h_con->sbrSyntaxFlags); +- +- h_envChan[0]->encEnvData.addHarmonicFlag = tempFlagLeft; +- h_envChan[1]->encEnvData.addHarmonicFlag = tempFlagRight; +- +- if (payloadbitsCOUPLING < payloadbitsLR) { +- /* +- copy coded coupling envelope and noise data to l/r +- */ +- for (ch = 0; ch < nChannels; ch++) { +- SBR_ENV_TEMP_DATA *ed = &eData[ch]; +- FDKmemcpy(ed->sfb_nrg, ed->sfb_nrg_coupling, +- MAX_NUM_ENVELOPE_VALUES * sizeof(SCHAR)); +- FDKmemcpy(ed->noise_level, ed->noise_level_coupling, +- MAX_NUM_NOISE_VALUES * sizeof(SCHAR)); +- } +- +- sbrHeaderData->coupling = 1; +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 1; +- } else { +- /* +- restore saved l/r items +- */ +- for (ch = 0; ch < nChannels; ch++) { +- FDKmemcpy(h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, +- sfbNrgPrevTemp[ch], MAX_FREQ_COEFFS * sizeof(SCHAR)); +- +- h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch]; +- +- FDKmemcpy(h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, +- noisePrevTemp[ch], MAX_NUM_NOISE_COEFFS * sizeof(SCHAR)); +- +- FDKmemcpy(h_envChan[ch]->encEnvData.domain_vec, domainVecTemp[ch], +- sizeof(INT) * MAX_ENVELOPES); +- FDKmemcpy(h_envChan[ch]->encEnvData.domain_vec_noise, +- domainVecNoiseTemp[ch], sizeof(INT) * MAX_ENVELOPES); +- +- h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch]; +- } +- +- sbrHeaderData->coupling = 0; +- h_envChan[0]->encEnvData.balance = 0; +- h_envChan[1]->encEnvData.balance = 0; +- } +- } break; +- } /* switch */ +- +- /* tell the envelope encoders how long it has been, since we last sent +- a frame starting with a dF-coded envelope */ +- if (stereoMode == SBR_MONO) { +- if (h_envChan[0]->encEnvData.domain_vec[0] == TIME) +- h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; +- else +- h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; +- } else { +- if (h_envChan[0]->encEnvData.domain_vec[0] == TIME || +- h_envChan[1]->encEnvData.domain_vec[0] == TIME) { +- h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; +- h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac++; +- } else { +- h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; +- h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac = 0; +- } +- } +- +- /* +- Send the encoded data to the bitstream +- */ +- for (ch = 0; ch < nChannels; ch++) { +- SBR_ENV_TEMP_DATA *ed = &eData[ch]; +- c = 0; +- for (i = 0; i < ed->nEnvelopes; i++) { +- for (j = 0; j < h_envChan[ch]->encEnvData.noScfBands[i]; j++) { +- h_envChan[ch]->encEnvData.ienvelope[i][j] = ed->sfb_nrg[c]; +- +- c++; +- } +- } +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { +- h_envChan[ch]->encEnvData.sbr_noise_levels[i] = ed->noise_level[i]; +- } +- } /* ch */ +- +- /* +- Write bitstream +- */ +- if (nChannels == 2) { +- FDKsbrEnc_WriteEnvChannelPairElement( +- sbrHeaderData, hParametricStereo, sbrBitstreamData, +- &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, +- h_con->sbrSyntaxFlags); +- } else { +- FDKsbrEnc_WriteEnvSingleChannelElement( +- sbrHeaderData, hParametricStereo, sbrBitstreamData, +- &h_envChan[0]->encEnvData, hCmonData, h_con->sbrSyntaxFlags); +- } +- +- /* +- * Update buffers. +- */ +- for (ch = 0; ch < nChannels; ch++) { +- int YBufferLength = h_envChan[ch]->sbrExtractEnvelope.no_cols >> +- h_envChan[ch]->sbrExtractEnvelope.YBufferSzShift; +- for (i = 0; i < h_envChan[ch]->sbrExtractEnvelope.YBufferWriteOffset; i++) { +- FDKmemcpy(h_envChan[ch]->sbrExtractEnvelope.YBuffer[i], +- h_envChan[ch]->sbrExtractEnvelope.YBuffer[i + YBufferLength], +- sizeof(FIXP_DBL) * 64); +- } +- h_envChan[ch]->sbrExtractEnvelope.YBufferScale[0] = +- h_envChan[ch]->sbrExtractEnvelope.YBufferScale[1]; +- } +- +- sbrHeaderData->prev_coupling = sbrHeaderData->coupling; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief creates an envelope extractor handle +- +- \return error status +- +-****************************************************************************/ +-INT FDKsbrEnc_CreateExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, +- INT channel, INT chInEl, +- UCHAR *dynamic_RAM) { +- INT i; +- FIXP_DBL *rBuffer, *iBuffer; +- INT n; +- FIXP_DBL *YBufferDyn; +- +- FDKmemclear(hSbrCut, sizeof(SBR_EXTRACT_ENVELOPE)); +- +- if (NULL == (hSbrCut->p_YBuffer = GetRam_Sbr_envYBuffer(channel))) { +- goto bail; +- } +- +- for (i = 0; i < (32 >> 1); i++) { +- hSbrCut->YBuffer[i] = hSbrCut->p_YBuffer + (i * 64); +- } +- YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); +- for (n = 0; i < 32; i++, n++) { +- hSbrCut->YBuffer[i] = YBufferDyn + (n * 64); +- } +- +- rBuffer = GetRam_Sbr_envRBuffer(0, dynamic_RAM); +- iBuffer = GetRam_Sbr_envIBuffer(0, dynamic_RAM); +- +- for (i = 0; i < 32; i++) { +- hSbrCut->rBuffer[i] = rBuffer + (i * 64); +- hSbrCut->iBuffer[i] = iBuffer + (i * 64); +- } +- +- return 0; +- +-bail: +- FDKsbrEnc_deleteExtractSbrEnvelope(hSbrCut); +- +- return -1; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Initialize an envelope extractor instance. +- +- \return error status +- +-****************************************************************************/ +-INT FDKsbrEnc_InitExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, +- int no_cols, int no_rows, int start_index, +- int time_slots, int time_step, +- int tran_off, ULONG statesInitFlag, +- int chInEl, UCHAR *dynamic_RAM, +- UINT sbrSyntaxFlags) { +- int YBufferLength, rBufferLength; +- int i; +- +- if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- int off = TRANSIENT_OFFSET_LD; +- hSbrCut->YBufferWriteOffset = (no_cols >> 1) + off * time_step; +- } else { +- hSbrCut->YBufferWriteOffset = tran_off * time_step; +- } +- hSbrCut->rBufferReadOffset = 0; +- +- YBufferLength = hSbrCut->YBufferWriteOffset + no_cols; +- rBufferLength = no_cols; +- +- hSbrCut->pre_transient_info[0] = 0; +- hSbrCut->pre_transient_info[1] = 0; +- +- hSbrCut->no_cols = no_cols; +- hSbrCut->no_rows = no_rows; +- hSbrCut->start_index = start_index; +- +- hSbrCut->time_slots = time_slots; +- hSbrCut->time_step = time_step; +- +- FDK_ASSERT(no_rows <= 64); +- +- /* Use half the Energy values if time step is 2 or greater */ +- if (time_step >= 2) +- hSbrCut->YBufferSzShift = 1; +- else +- hSbrCut->YBufferSzShift = 0; +- +- YBufferLength >>= hSbrCut->YBufferSzShift; +- hSbrCut->YBufferWriteOffset >>= hSbrCut->YBufferSzShift; +- +- FDK_ASSERT(YBufferLength <= 32); +- +- FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); +- INT n = 0; +- for (i = (32 >> 1); i < 32; i++, n++) { +- hSbrCut->YBuffer[i] = YBufferDyn + (n * 64); +- } +- +- if (statesInitFlag) { +- for (i = 0; i < YBufferLength; i++) { +- FDKmemclear(hSbrCut->YBuffer[i], 64 * sizeof(FIXP_DBL)); +- } +- } +- +- for (i = 0; i < rBufferLength; i++) { +- FDKmemclear(hSbrCut->rBuffer[i], 64 * sizeof(FIXP_DBL)); +- FDKmemclear(hSbrCut->iBuffer[i], 64 * sizeof(FIXP_DBL)); +- } +- +- FDKmemclear(hSbrCut->envelopeCompensation, sizeof(UCHAR) * MAX_FREQ_COEFFS); +- +- if (statesInitFlag) { +- hSbrCut->YBufferScale[0] = hSbrCut->YBufferScale[1] = FRACT_BITS - 1; +- } +- +- return (0); +-} +- +-/***************************************************************************/ +-/*! +- +- \brief deinitializes an envelope extractor handle +- +- \return void +- +-****************************************************************************/ +- +-void FDKsbrEnc_deleteExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut) { +- if (hSbrCut) { +- FreeRam_Sbr_envYBuffer(&hSbrCut->p_YBuffer); +- } +-} +- +-INT FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr) { +- return hSbr->no_rows * +- ((hSbr->YBufferWriteOffset) * +- 2 /* mult 2 because nrg's are grouped half */ +- - hSbr->rBufferReadOffset); /* in reference hold half spec and calc +- nrg's on overlapped spec */ +-} +diff --git a/libSBRenc/src/env_est.h b/libSBRenc/src/env_est.h +deleted file mode 100644 +index 006f55b..0000000 +--- a/libSBRenc/src/env_est.h ++++ /dev/null +@@ -1,223 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Envelope estimation structs and prototypes $Revision: 92790 $ +-*/ +-#ifndef ENV_EST_H +-#define ENV_EST_H +- +-#include "sbr_def.h" +-#include "sbr_encoder.h" /* SBR econfig structs */ +-#include "ps_main.h" +-#include "bit_sbr.h" +-#include "fram_gen.h" +-#include "tran_det.h" +-#include "code_env.h" +-#include "ton_corr.h" +- +-typedef struct { +- FIXP_DBL *rBuffer[32]; +- FIXP_DBL *iBuffer[32]; +- +- FIXP_DBL *p_YBuffer; +- +- FIXP_DBL *YBuffer[32]; +- int YBufferScale[2]; +- +- UCHAR envelopeCompensation[MAX_FREQ_COEFFS]; +- UCHAR pre_transient_info[2]; +- +- int YBufferWriteOffset; +- int YBufferSzShift; +- int rBufferReadOffset; +- +- int no_cols; +- int no_rows; +- int start_index; +- +- int time_slots; +- int time_step; +-} SBR_EXTRACT_ENVELOPE; +-typedef SBR_EXTRACT_ENVELOPE *HANDLE_SBR_EXTRACT_ENVELOPE; +- +-struct ENV_CHANNEL { +- FAST_TRAN_DETECTOR sbrFastTransientDetector; +- SBR_TRANSIENT_DETECTOR sbrTransientDetector; +- SBR_CODE_ENVELOPE sbrCodeEnvelope; +- SBR_CODE_ENVELOPE sbrCodeNoiseFloor; +- SBR_EXTRACT_ENVELOPE sbrExtractEnvelope; +- +- SBR_ENVELOPE_FRAME SbrEnvFrame; +- SBR_TON_CORR_EST TonCorr; +- +- struct SBR_ENV_DATA encEnvData; +- +- int qmfScale; +- UCHAR fLevelProtect; +-}; +-typedef struct ENV_CHANNEL *HANDLE_ENV_CHANNEL; +- +-/************ Function Declarations ***************/ +- +-INT FDKsbrEnc_CreateExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, +- INT channel, INT chInEl, +- UCHAR *dynamic_RAM); +- +-INT FDKsbrEnc_InitExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbr, +- int no_cols, int no_rows, int start_index, +- int time_slots, int time_step, +- int tran_off, ULONG statesInitFlag, +- int chInEl, UCHAR *dynamic_RAM, +- UINT sbrSyntaxFlags); +- +-void FDKsbrEnc_deleteExtractSbrEnvelope(HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut); +- +-typedef struct { +- FREQ_RES res[MAX_NUM_NOISE_VALUES]; +- int maxQuantError; +- +-} SBR_FRAME_TEMP_DATA; +- +-typedef struct { +- const SBR_FRAME_INFO *frame_info; +- FIXP_DBL noiseFloor[MAX_NUM_NOISE_VALUES]; +- SCHAR sfb_nrg_coupling +- [MAX_NUM_ENVELOPE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ +- SCHAR sfb_nrg[MAX_NUM_ENVELOPE_VALUES]; +- SCHAR noise_level_coupling +- [MAX_NUM_NOISE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ +- SCHAR noise_level[MAX_NUM_NOISE_VALUES]; +- UCHAR transient_info[3]; +- UCHAR nEnvelopes; +-} SBR_ENV_TEMP_DATA; +- +-/* +- * Extract features from QMF data. Afterwards, the QMF data is not required +- * anymore. +- */ +-void FDKsbrEnc_extractSbrEnvelope1(HANDLE_SBR_CONFIG_DATA h_con, +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_ENV_CHANNEL h_envChan, +- HANDLE_COMMON_DATA cmonData, +- SBR_ENV_TEMP_DATA *eData, +- SBR_FRAME_TEMP_DATA *fData); +- +-/* +- * Process the previously features extracted by FDKsbrEnc_extractSbrEnvelope1 +- * and create/encode SBR envelopes. +- */ +-void FDKsbrEnc_extractSbrEnvelope2(HANDLE_SBR_CONFIG_DATA h_con, +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, +- HANDLE_ENV_CHANNEL sbrEnvChannel0, +- HANDLE_ENV_CHANNEL sbrEnvChannel1, +- HANDLE_COMMON_DATA cmonData, +- SBR_ENV_TEMP_DATA *eData, +- SBR_FRAME_TEMP_DATA *fData, int clearOutput); +- +-INT FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr); +- +-#endif +diff --git a/libSBRenc/src/fram_gen.cpp b/libSBRenc/src/fram_gen.cpp +deleted file mode 100644 +index 7ed6e79..0000000 +--- a/libSBRenc/src/fram_gen.cpp ++++ /dev/null +@@ -1,1965 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "fram_gen.h" +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-static const SBR_FRAME_INFO frameInfo1_2048 = {1, {0, 16}, {FREQ_RES_HIGH}, +- 0, 1, {0, 16}}; +- +-static const SBR_FRAME_INFO frameInfo2_2048 = { +- 2, {0, 8, 16}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 8, 16}}; +- +-static const SBR_FRAME_INFO frameInfo4_2048 = { +- 4, +- {0, 4, 8, 12, 16}, +- {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, +- 0, +- 2, +- {0, 8, 16}}; +- +-static const SBR_FRAME_INFO frameInfo1_2304 = {1, {0, 18}, {FREQ_RES_HIGH}, +- 0, 1, {0, 18}}; +- +-static const SBR_FRAME_INFO frameInfo2_2304 = { +- 2, {0, 9, 18}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 9, 18}}; +- +-static const SBR_FRAME_INFO frameInfo4_2304 = { +- 4, +- {0, 5, 9, 14, 18}, +- {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, +- 0, +- 2, +- {0, 9, 18}}; +- +-static const SBR_FRAME_INFO frameInfo1_1920 = {1, {0, 15}, {FREQ_RES_HIGH}, +- 0, 1, {0, 15}}; +- +-static const SBR_FRAME_INFO frameInfo2_1920 = { +- 2, {0, 8, 15}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 8, 15}}; +- +-static const SBR_FRAME_INFO frameInfo4_1920 = { +- 4, +- {0, 4, 8, 12, 15}, +- {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, +- 0, +- 2, +- {0, 8, 15}}; +- +-static const SBR_FRAME_INFO frameInfo1_1152 = {1, {0, 9}, {FREQ_RES_HIGH}, +- 0, 1, {0, 9}}; +- +-static const SBR_FRAME_INFO frameInfo2_1152 = { +- 2, {0, 5, 9}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 5, 9}}; +- +-static const SBR_FRAME_INFO frameInfo4_1152 = { +- 4, +- {0, 2, 5, 7, 9}, +- {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, +- 0, +- 2, +- {0, 5, 9}}; +- +-/* AACLD frame info */ +-static const SBR_FRAME_INFO frameInfo1_512LD = {1, {0, 8}, {FREQ_RES_HIGH}, +- 0, 1, {0, 8}}; +- +-static const SBR_FRAME_INFO frameInfo2_512LD = { +- 2, {0, 4, 8}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 4, 8}}; +- +-static const SBR_FRAME_INFO frameInfo4_512LD = { +- 4, +- {0, 2, 4, 6, 8}, +- {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, +- 0, +- 2, +- {0, 4, 8}}; +- +-static int calcFillLengthMax( +- int tranPos, /*!< input : transient position (ref: tran det) */ +- int numberTimeSlots /*!< input : number of timeslots */ +-); +- +-static void fillFrameTran( +- const int *v_tuningSegm, /*!< tuning: desired segment lengths */ +- const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */ +- int tran, /*!< input : position of transient */ +- int *v_bord, /*!< memNew: borders */ +- int *length_v_bord, /*!< memNew: # borders */ +- int *v_freq, /*!< memNew: frequency resolutions */ +- int *length_v_freq, /*!< memNew: # frequency resolutions */ +- int *bmin, /*!< hlpNew: first mandatory border */ +- int *bmax /*!< hlpNew: last mandatory border */ +-); +- +-static void fillFramePre(INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, +- INT *length_v_freq, INT bmin, INT rest); +- +-static void fillFramePost(INT *parts, INT *d, INT dmax, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT *length_v_freq, +- INT bmax, INT bufferFrameStart, INT numberTimeSlots, +- INT fmax); +- +-static void fillFrameInter(INT *nL, const int *v_tuningSegm, INT *v_bord, +- INT *length_v_bord, INT bmin, INT *v_freq, +- INT *length_v_freq, INT *v_bordFollow, +- INT *length_v_bordFollow, INT *v_freqFollow, +- INT *length_v_freqFollow, INT i_fillFollow, INT dmin, +- INT dmax, INT numberTimeSlots); +- +-static void calcFrameClass(FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, +- INT tranFlag, INT *spreadFlag); +- +-static void specialCase(INT *spreadFlag, INT allowSpread, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT *length_v_freq, +- INT *parts, INT d); +- +-static void calcCmonBorder(INT *i_cmon, INT *i_tran, INT *v_bord, +- INT *length_v_bord, INT tran, INT bufferFrameStart, +- INT numberTimeSlots); +- +-static void keepForFollowUp(INT *v_bordFollow, INT *length_v_bordFollow, +- INT *v_freqFollow, INT *length_v_freqFollow, +- INT *i_tranFollow, INT *i_fillFollow, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT i_cmon, +- INT i_tran, INT parts, INT numberTimeSlots); +- +-static void calcCtrlSignal(HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass, +- INT *v_bord, INT length_v_bord, INT *v_freq, +- INT length_v_freq, INT i_cmon, INT i_tran, +- INT spreadFlag, INT nL); +- +-static void ctrlSignal2FrameInfo(HANDLE_SBR_GRID hSbrGrid, +- HANDLE_SBR_FRAME_INFO hFrameInfo, +- FREQ_RES *freq_res_fixfix); +- +-/* table for 8 time slot index */ +-static const int envelopeTable_8[8][5] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* borders from left to right side; -1 = not in use */ +- /*[|T-|------]*/ {2, 0, 0, 1, -1}, +- /*[|-T-|-----]*/ {2, 0, 0, 2, -1}, +- /*[--|T-|----]*/ {3, 1, 1, 2, 4}, +- /*[---|T-|---]*/ {3, 1, 1, 3, 5}, +- /*[----|T-|--]*/ {3, 1, 1, 4, 6}, +- /*[-----|T--|]*/ {2, 1, 1, 5, -1}, +- /*[------|T-|]*/ {2, 1, 1, 6, -1}, +- /*[-------|T|]*/ {2, 1, 1, 7, -1}, +-}; +- +-/* table for 16 time slot index */ +-static const int envelopeTable_16[16][6] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* length from left to right side; -1 = not in use */ +- /*[|T---|------------|]*/ {2, 0, 0, 4, -1, -1}, +- /*[|-T---|-----------|]*/ {2, 0, 0, 5, -1, -1}, +- /*[|--|T---|----------]*/ {3, 1, 1, 2, 6, -1}, +- /*[|---|T---|---------]*/ {3, 1, 1, 3, 7, -1}, +- /*[|----|T---|--------]*/ {3, 1, 1, 4, 8, -1}, +- /*[|-----|T---|-------]*/ {3, 1, 1, 5, 9, -1}, +- /*[|------|T---|------]*/ {3, 1, 1, 6, 10, -1}, +- /*[|-------|T---|-----]*/ {3, 1, 1, 7, 11, -1}, +- /*[|--------|T---|----]*/ {3, 1, 1, 8, 12, -1}, +- /*[|---------|T---|---]*/ {3, 1, 1, 9, 13, -1}, +- /*[|----------|T---|--]*/ {3, 1, 1, 10, 14, -1}, +- /*[|-----------|T----|]*/ {2, 1, 1, 11, -1, -1}, +- /*[|------------|T---|]*/ {2, 1, 1, 12, -1, -1}, +- /*[|-------------|T--|]*/ {2, 1, 1, 13, -1, -1}, +- /*[|--------------|T-|]*/ {2, 1, 1, 14, -1, -1}, +- /*[|---------------|T|]*/ {2, 1, 1, 15, -1, -1}, +-}; +- +-/* table for 15 time slot index */ +-static const int envelopeTable_15[15][6] = { +- /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ +- /* length from left to right side; -1 = not in use */ +- /*[|T---|------------]*/ {2, 0, 0, 4, -1, -1}, +- /*[|-T---|-----------]*/ {2, 0, 0, 5, -1, -1}, +- /*[|--|T---|---------]*/ {3, 1, 1, 2, 6, -1}, +- /*[|---|T---|--------]*/ {3, 1, 1, 3, 7, -1}, +- /*[|----|T---|-------]*/ {3, 1, 1, 4, 8, -1}, +- /*[|-----|T---|------]*/ {3, 1, 1, 5, 9, -1}, +- /*[|------|T---|-----]*/ {3, 1, 1, 6, 10, -1}, +- /*[|-------|T---|----]*/ {3, 1, 1, 7, 11, -1}, +- /*[|--------|T---|---]*/ {3, 1, 1, 8, 12, -1}, +- /*[|---------|T---|--]*/ {3, 1, 1, 9, 13, -1}, +- /*[|----------|T----|]*/ {2, 1, 1, 10, -1, -1}, +- /*[|-----------|T---|]*/ {2, 1, 1, 11, -1, -1}, +- /*[|------------|T--|]*/ {2, 1, 1, 12, -1, -1}, +- /*[|-------------|T-|]*/ {2, 1, 1, 13, -1, -1}, +- /*[|--------------|T|]*/ {2, 1, 1, 14, -1, -1}, +-}; +- +-static const int minFrameTranDistance = 4; +- +-static const FREQ_RES freqRes_table_8[] = { +- FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, +- FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}; +- +-static const FREQ_RES freqRes_table_16[16] = { +- /* size of envelope */ +- /* 0-4 */ FREQ_RES_LOW, +- FREQ_RES_LOW, +- FREQ_RES_LOW, +- FREQ_RES_LOW, +- FREQ_RES_LOW, +- /* 5-9 */ FREQ_RES_LOW, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- /* 10-16 */ FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH, +- FREQ_RES_HIGH}; +- +-static void generateFixFixOnly(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, +- HANDLE_SBR_GRID hSbrGrid, int tranPosInternal, +- int numberTimeSlots, UCHAR fResTransIsLow); +- +-/*! +- Functionname: FDKsbrEnc_frameInfoGenerator +- +- Description: produces the FRAME_INFO struct for the current frame +- +- Arguments: hSbrEnvFrame - pointer to sbr envelope handle +- v_pre_transient_info - pointer to transient info vector +- v_transient_info - pointer to previous transient info +-vector v_tuning - pointer to tuning vector +- +- Return: frame_info - pointer to SBR_FRAME_INFO struct +- +-*******************************************************************************/ +-HANDLE_SBR_FRAME_INFO +-FDKsbrEnc_frameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, +- UCHAR *v_transient_info, const INT rightBorderFIX, +- UCHAR *v_transient_info_pre, int ldGrid, +- const int *v_tuning) { +- INT numEnv, tranPosInternal = 0, bmin = 0, bmax = 0, parts, d, i_cmon = 0, +- i_tran = 0, nL; +- INT fmax = 0; +- +- INT *v_bord = hSbrEnvFrame->v_bord; +- INT *v_freq = hSbrEnvFrame->v_freq; +- INT *v_bordFollow = hSbrEnvFrame->v_bordFollow; +- INT *v_freqFollow = hSbrEnvFrame->v_freqFollow; +- +- INT *length_v_bordFollow = &hSbrEnvFrame->length_v_bordFollow; +- INT *length_v_freqFollow = &hSbrEnvFrame->length_v_freqFollow; +- INT *length_v_bord = &hSbrEnvFrame->length_v_bord; +- INT *length_v_freq = &hSbrEnvFrame->length_v_freq; +- INT *spreadFlag = &hSbrEnvFrame->spreadFlag; +- INT *i_tranFollow = &hSbrEnvFrame->i_tranFollow; +- INT *i_fillFollow = &hSbrEnvFrame->i_fillFollow; +- FRAME_CLASS *frameClassOld = &hSbrEnvFrame->frameClassOld; +- FRAME_CLASS frameClass = FIXFIX; +- +- INT allowSpread = hSbrEnvFrame->allowSpread; +- INT numEnvStatic = hSbrEnvFrame->numEnvStatic; +- INT staticFraming = hSbrEnvFrame->staticFraming; +- INT dmin = hSbrEnvFrame->dmin; +- INT dmax = hSbrEnvFrame->dmax; +- +- INT bufferFrameStart = hSbrEnvFrame->SbrGrid.bufferFrameStart; +- INT numberTimeSlots = hSbrEnvFrame->SbrGrid.numberTimeSlots; +- INT frameMiddleSlot = hSbrEnvFrame->frameMiddleSlot; +- +- INT tranPos = v_transient_info[0]; +- INT tranFlag = v_transient_info[1]; +- +- const int *v_tuningSegm = v_tuning; +- const int *v_tuningFreq = v_tuning + 3; +- +- hSbrEnvFrame->v_tuningSegm = v_tuningSegm; +- +- if (ldGrid) { +- /* in case there was a transient at the very end of the previous frame, +- * start with a transient envelope */ +- if (!tranFlag && v_transient_info_pre[1] && +- (numberTimeSlots - v_transient_info_pre[0] < minFrameTranDistance)) { +- tranFlag = 1; +- tranPos = 0; +- } +- } +- +- /* +- * Synopsis: +- * +- * The frame generator creates the time-/frequency-grid for one SBR frame. +- * Input signals are provided by the transient detector and the frame +- * splitter (transientDetectNew() & FrameSplitter() in tran_det.c). The +- * framing is controlled by adjusting tuning parameters stored in +- * FRAME_GEN_TUNING. The parameter values are dependent on frame lengths +- * and bitrates, and may in the future be signal dependent. +- * +- * The envelope borders are stored for frame generator internal use in +- * aBorders. The contents of aBorders represent positions along the time +- * axis given in the figures in fram_gen.h (the "frame-generator" rows). +- * The unit is "time slot". The figures in fram_gen.h also define the +- * detection ranges for the transient detector. For every border in +- * aBorders, there is a corresponding entry in aFreqRes, which defines the +- * frequency resolution of the envelope following (delimited by) the +- * border. +- * +- * When no transients are present, FIXFIX class frames are used. The +- * frame splitter decides whether to use one or two envelopes in the +- * FIXFIX frame. "Sparse transients" (separated by a few frames without +- * transients) are handeled by [FIXVAR, VARFIX] pairs or (depending on +- * tuning and transient position relative the nominal frame boundaries) +- * by [FIXVAR, VARVAR, VARFIX] triples. "Tight transients" (in +- * consecutive frames) are handeled by [..., VARVAR, VARVAR, ...] +- * sequences. +- * +- * The generator assumes that transients are "sparse", and designs +- * borders for [FIXVAR, VARFIX] pairs right away, where the first frame +- * corresponds to the present frame. At the next call of the generator +- * it is known whether the transient actually is "sparse" or not. If +- * 'yes', the already calculated VARFIX borders are used. If 'no', new +- * borders, meeting the requirements of the "tight" transient, are +- * calculated. +- * +- * The generator produces two outputs: A "clear-text bitstream" stored in +- * SBR_GRID, and a straight-forward representation of the grid stored in +- * SBR_FRAME_INFO. The former is subsequently converted to the actual +- * bitstream sbr_grid() (encodeSbrGrid() in bit_sbr.c). The latter is +- * used by other encoder functions, such as the envelope estimator +- * (calculateSbrEnvelope() in env_est.c) and the noise floor and missing +- * harmonics detector (TonCorrParamExtr() in nf_est.c). +- */ +- +- if (staticFraming) { +- /*-------------------------------------------------------------------------- +- Ignore transient detector +- ---------------------------------------------------------------------------*/ +- +- frameClass = FIXFIX; +- numEnv = numEnvStatic; /* {1,2,4,8} */ +- *frameClassOld = FIXFIX; /* for change to dyn */ +- hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; +- hSbrEnvFrame->SbrGrid.frameClass = frameClass; +- } else { +- /*-------------------------------------------------------------------------- +- Calculate frame class to use +- ---------------------------------------------------------------------------*/ +- if (rightBorderFIX) { +- tranFlag = 0; +- *spreadFlag = 0; +- } +- calcFrameClass(&frameClass, frameClassOld, tranFlag, spreadFlag); +- +- /* patch for new frame class FIXFIXonly for AAC LD */ +- if (tranFlag && ldGrid) { +- frameClass = FIXFIXonly; +- *frameClassOld = FIXFIX; +- } +- +- /* +- * every transient is processed below by inserting +- * +- * - one border at the onset of the transient +- * - one or more "decay borders" (after the onset of the transient) +- * - optionally one "attack border" (before the onset of the transient) +- * +- * those borders are referred to as "mandatory borders" and are +- * defined by the 'segmentLength' array in FRAME_GEN_TUNING +- * +- * the frequency resolutions of the corresponding envelopes are +- * defined by the 'segmentRes' array in FRAME_GEN_TUNING +- */ +- +- /*-------------------------------------------------------------------------- +- Design frame (or follow-up old design) +- ---------------------------------------------------------------------------*/ +- if (tranFlag) { +- /* Always for FixVar, often but not always for VarVar */ +- +- /*-------------------------------------------------------------------------- +- Design part of T/F-grid around the new transient +- ---------------------------------------------------------------------------*/ +- +- tranPosInternal = +- frameMiddleSlot + tranPos + bufferFrameStart; /* FH 00-06-26 */ +- /* +- add mandatory borders around transient +- */ +- +- fillFrameTran(v_tuningSegm, v_tuningFreq, tranPosInternal, v_bord, +- length_v_bord, v_freq, length_v_freq, &bmin, &bmax); +- +- /* make sure we stay within the maximum SBR frame overlap */ +- fmax = calcFillLengthMax(tranPos, numberTimeSlots); +- } +- +- switch (frameClass) { +- case FIXFIXonly: +- FDK_ASSERT(ldGrid); +- tranPosInternal = tranPos; +- generateFixFixOnly(&(hSbrEnvFrame->SbrFrameInfo), +- &(hSbrEnvFrame->SbrGrid), tranPosInternal, +- numberTimeSlots, hSbrEnvFrame->fResTransIsLow); +- +- return &(hSbrEnvFrame->SbrFrameInfo); +- +- case FIXVAR: +- +- /*-------------------------------------------------------------------------- +- Design remaining parts of T/F-grid (assuming next frame is VarFix) +- ---------------------------------------------------------------------------*/ +- +- /*-------------------------------------------------------------------------- +- Fill region before new transient: +- ---------------------------------------------------------------------------*/ +- fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, +- bmin - bufferFrameStart); /* FH 00-06-26 */ +- +- /*-------------------------------------------------------------------------- +- Fill region after new transient: +- ---------------------------------------------------------------------------*/ +- fillFramePost(&parts, &d, dmax, v_bord, length_v_bord, v_freq, +- length_v_freq, bmax, bufferFrameStart, numberTimeSlots, +- fmax); +- +- /*-------------------------------------------------------------------------- +- Take care of special case: +- ---------------------------------------------------------------------------*/ +- if (parts == 1 && d < dmin) /* no fill, short last envelope */ +- specialCase(spreadFlag, allowSpread, v_bord, length_v_bord, v_freq, +- length_v_freq, &parts, d); +- +- /*-------------------------------------------------------------------------- +- Calculate common border (split-point) +- ---------------------------------------------------------------------------*/ +- calcCmonBorder(&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal, +- bufferFrameStart, numberTimeSlots); /* FH 00-06-26 */ +- +- /*-------------------------------------------------------------------------- +- Extract data for proper follow-up in next frame +- ---------------------------------------------------------------------------*/ +- keepForFollowUp(v_bordFollow, length_v_bordFollow, v_freqFollow, +- length_v_freqFollow, i_tranFollow, i_fillFollow, v_bord, +- length_v_bord, v_freq, i_cmon, i_tran, parts, +- numberTimeSlots); /* FH 00-06-26 */ +- +- /*-------------------------------------------------------------------------- +- Calculate control signal +- ---------------------------------------------------------------------------*/ +- calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bord, +- *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran, +- *spreadFlag, DC); +- break; +- case VARFIX: +- /*-------------------------------------------------------------------------- +- Follow-up old transient - calculate control signal +- ---------------------------------------------------------------------------*/ +- calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow, +- *length_v_bordFollow, v_freqFollow, *length_v_freqFollow, +- DC, *i_tranFollow, *spreadFlag, DC); +- break; +- case VARVAR: +- if (*spreadFlag) { /* spread across three frames */ +- /*-------------------------------------------------------------------------- +- Follow-up old transient - calculate control signal +- ---------------------------------------------------------------------------*/ +- calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow, +- *length_v_bordFollow, v_freqFollow, +- *length_v_freqFollow, DC, *i_tranFollow, *spreadFlag, +- DC); +- +- *spreadFlag = 0; +- +- /*-------------------------------------------------------------------------- +- Extract data for proper follow-up in next frame +- ---------------------------------------------------------------------------*/ +- v_bordFollow[0] = hSbrEnvFrame->SbrGrid.bs_abs_bord_1 - +- numberTimeSlots; /* FH 00-06-26 */ +- v_freqFollow[0] = 1; +- *length_v_bordFollow = 1; +- *length_v_freqFollow = 1; +- +- *i_tranFollow = -DC; +- *i_fillFollow = -DC; +- } else { +- /*-------------------------------------------------------------------------- +- Design remaining parts of T/F-grid (assuming next frame is VarFix) +- adapt or fill region before new transient: +- ---------------------------------------------------------------------------*/ +- fillFrameInter(&nL, v_tuningSegm, v_bord, length_v_bord, bmin, v_freq, +- length_v_freq, v_bordFollow, length_v_bordFollow, +- v_freqFollow, length_v_freqFollow, *i_fillFollow, dmin, +- dmax, numberTimeSlots); +- +- /*-------------------------------------------------------------------------- +- Fill after transient: +- ---------------------------------------------------------------------------*/ +- fillFramePost(&parts, &d, dmax, v_bord, length_v_bord, v_freq, +- length_v_freq, bmax, bufferFrameStart, numberTimeSlots, +- fmax); +- +- /*-------------------------------------------------------------------------- +- Take care of special case: +- ---------------------------------------------------------------------------*/ +- if (parts == 1 && d < dmin) /*% no fill, short last envelope */ +- specialCase(spreadFlag, allowSpread, v_bord, length_v_bord, v_freq, +- length_v_freq, &parts, d); +- +- /*-------------------------------------------------------------------------- +- Calculate common border (split-point) +- ---------------------------------------------------------------------------*/ +- calcCmonBorder(&i_cmon, &i_tran, v_bord, length_v_bord, +- tranPosInternal, bufferFrameStart, numberTimeSlots); +- +- /*-------------------------------------------------------------------------- +- Extract data for proper follow-up in next frame +- ---------------------------------------------------------------------------*/ +- keepForFollowUp(v_bordFollow, length_v_bordFollow, v_freqFollow, +- length_v_freqFollow, i_tranFollow, i_fillFollow, +- v_bord, length_v_bord, v_freq, i_cmon, i_tran, parts, +- numberTimeSlots); +- +- /*-------------------------------------------------------------------------- +- Calculate control signal +- ---------------------------------------------------------------------------*/ +- calcCtrlSignal(&hSbrEnvFrame->SbrGrid, frameClass, v_bord, +- *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran, +- 0, nL); +- } +- break; +- case FIXFIX: +- if (tranPos == 0) +- numEnv = 1; +- else +- numEnv = 2; +- +- hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; +- hSbrEnvFrame->SbrGrid.frameClass = frameClass; +- +- break; +- default: +- FDK_ASSERT(0); +- } +- } +- +- /*------------------------------------------------------------------------- +- Convert control signal to frame info struct +- ---------------------------------------------------------------------------*/ +- ctrlSignal2FrameInfo(&hSbrEnvFrame->SbrGrid, &hSbrEnvFrame->SbrFrameInfo, +- hSbrEnvFrame->freq_res_fixfix); +- +- return &hSbrEnvFrame->SbrFrameInfo; +-} +- +-/***************************************************************************/ +-/*! +- \brief Gnerates frame info for FIXFIXonly frame class used for low delay +- version +- +- \return nothing +- ****************************************************************************/ +-static void generateFixFixOnly(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, +- HANDLE_SBR_GRID hSbrGrid, int tranPosInternal, +- int numberTimeSlots, UCHAR fResTransIsLow) { +- int nEnv, i, k = 0, tranIdx; +- const int *pTable = NULL; +- const FREQ_RES *freqResTable = NULL; +- +- switch (numberTimeSlots) { +- case 8: { +- pTable = envelopeTable_8[tranPosInternal]; +- } +- freqResTable = freqRes_table_8; +- break; +- case 15: +- pTable = envelopeTable_15[tranPosInternal]; +- freqResTable = freqRes_table_16; +- break; +- case 16: +- pTable = envelopeTable_16[tranPosInternal]; +- freqResTable = freqRes_table_16; +- break; +- } +- +- /* look number of envolpes in table */ +- nEnv = pTable[0]; +- /* look up envolpe distribution in table */ +- for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2]; +- +- /* open and close frame border */ +- hSbrFrameInfo->borders[0] = 0; +- hSbrFrameInfo->borders[nEnv] = numberTimeSlots; +- +- /* adjust segment-frequency-resolution according to the segment-length */ +- for (i = 0; i < nEnv; i++) { +- k = hSbrFrameInfo->borders[i + 1] - hSbrFrameInfo->borders[i]; +- if (!fResTransIsLow) +- hSbrFrameInfo->freqRes[i] = freqResTable[k]; +- else +- hSbrFrameInfo->freqRes[i] = FREQ_RES_LOW; +- +- hSbrGrid->v_f[i] = hSbrFrameInfo->freqRes[i]; +- } +- +- hSbrFrameInfo->nEnvelopes = nEnv; +- hSbrFrameInfo->shortEnv = pTable[2]; +- /* transient idx */ +- tranIdx = pTable[1]; +- +- /* add noise floors */ +- hSbrFrameInfo->bordersNoise[0] = 0; +- hSbrFrameInfo->bordersNoise[1] = +- hSbrFrameInfo->borders[tranIdx ? tranIdx : 1]; +- hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; +- hSbrFrameInfo->nNoiseEnvelopes = 2; +- +- hSbrGrid->frameClass = FIXFIXonly; +- hSbrGrid->bs_abs_bord = tranPosInternal; +- hSbrGrid->bs_num_env = nEnv; +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_initFrameInfoGenerator +- ******************************************************************************* +- +- Description: +- +- Arguments: hSbrEnvFrame - pointer to sbr envelope handle +- allowSpread - commandline parameter +- numEnvStatic - commandline parameter +- staticFraming - commandline parameter +- +- Return: none +- +-*******************************************************************************/ +-void FDKsbrEnc_initFrameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, +- INT allowSpread, INT numEnvStatic, +- INT staticFraming, INT timeSlots, +- const FREQ_RES *freq_res_fixfix, +- UCHAR fResTransIsLow, +- INT ldGrid) { /* FH 00-06-26 */ +- +- FDKmemclear(hSbrEnvFrame, sizeof(SBR_ENVELOPE_FRAME)); +- +- /* Initialisation */ +- hSbrEnvFrame->frameClassOld = FIXFIX; +- hSbrEnvFrame->spreadFlag = 0; +- +- hSbrEnvFrame->allowSpread = allowSpread; +- hSbrEnvFrame->numEnvStatic = numEnvStatic; +- hSbrEnvFrame->staticFraming = staticFraming; +- hSbrEnvFrame->freq_res_fixfix[0] = freq_res_fixfix[0]; +- hSbrEnvFrame->freq_res_fixfix[1] = freq_res_fixfix[1]; +- hSbrEnvFrame->fResTransIsLow = fResTransIsLow; +- +- hSbrEnvFrame->length_v_bord = 0; +- hSbrEnvFrame->length_v_bordFollow = 0; +- +- hSbrEnvFrame->length_v_freq = 0; +- hSbrEnvFrame->length_v_freqFollow = 0; +- +- hSbrEnvFrame->i_tranFollow = 0; +- hSbrEnvFrame->i_fillFollow = 0; +- +- hSbrEnvFrame->SbrGrid.numberTimeSlots = timeSlots; +- +- if (ldGrid) { +- /*case CODEC_AACLD:*/ +- hSbrEnvFrame->dmin = 2; +- hSbrEnvFrame->dmax = 16; +- hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_512LD; +- hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; +- } else +- switch (timeSlots) { +- case NUMBER_TIME_SLOTS_1920: +- hSbrEnvFrame->dmin = 4; +- hSbrEnvFrame->dmax = 12; +- hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; +- hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1920; +- break; +- case NUMBER_TIME_SLOTS_2048: +- hSbrEnvFrame->dmin = 4; +- hSbrEnvFrame->dmax = 12; +- hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; +- hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2048; +- break; +- case NUMBER_TIME_SLOTS_1152: +- hSbrEnvFrame->dmin = 2; +- hSbrEnvFrame->dmax = 8; +- hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; +- hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1152; +- break; +- case NUMBER_TIME_SLOTS_2304: +- hSbrEnvFrame->dmin = 4; +- hSbrEnvFrame->dmax = 15; +- hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; +- hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2304; +- break; +- default: +- FDK_ASSERT(0); +- } +-} +- +-/******************************************************************************* +- Functionname: fillFrameTran +- ******************************************************************************* +- +- Description: Add mandatory borders, as described by the tuning vector +- and the current transient position +- +- Arguments: +- modified: +- v_bord - int pointer to v_bord vector +- length_v_bord - length of v_bord vector +- v_freq - int pointer to v_freq vector +- length_v_freq - length of v_freq vector +- bmin - int pointer to bmin (call by reference) +- bmax - int pointer to bmax (call by reference) +- not modified: +- tran - position of transient +- v_tuningSegm - int pointer to v_tuningSegm vector +- v_tuningFreq - int pointer to v_tuningFreq vector +- +- Return: none +- +-*******************************************************************************/ +-static void fillFrameTran( +- const int *v_tuningSegm, /*!< tuning: desired segment lengths */ +- const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */ +- int tran, /*!< input : position of transient */ +- int *v_bord, /*!< memNew: borders */ +- int *length_v_bord, /*!< memNew: # borders */ +- int *v_freq, /*!< memNew: frequency resolutions */ +- int *length_v_freq, /*!< memNew: # frequency resolutions */ +- int *bmin, /*!< hlpNew: first mandatory border */ +- int *bmax /*!< hlpNew: last mandatory border */ +-) { +- int bord, i; +- +- *length_v_bord = 0; +- *length_v_freq = 0; +- +- /* add attack env leading border (optional) */ +- if (v_tuningSegm[0]) { +- /* v_bord = [(Ba)] start of attack env */ +- FDKsbrEnc_AddRight(v_bord, length_v_bord, (tran - v_tuningSegm[0])); +- +- /* v_freq = [(Fa)] res of attack env */ +- FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[0]); +- } +- +- /* add attack env trailing border/first decay env leading border */ +- bord = tran; +- FDKsbrEnc_AddRight(v_bord, length_v_bord, tran); /* v_bord = [(Ba),Bd1] */ +- +- /* add first decay env trailing border/2:nd decay env leading border */ +- if (v_tuningSegm[1]) { +- bord += v_tuningSegm[1]; +- +- /* v_bord = [(Ba),Bd1,Bd2] */ +- FDKsbrEnc_AddRight(v_bord, length_v_bord, bord); +- +- /* v_freq = [(Fa),Fd1] */ +- FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[1]); +- } +- +- /* add 2:nd decay env trailing border (optional) */ +- if (v_tuningSegm[2] != 0) { +- bord += v_tuningSegm[2]; +- +- /* v_bord = [(Ba),Bd1, Bd2,(Bd3)] */ +- FDKsbrEnc_AddRight(v_bord, length_v_bord, bord); +- +- /* v_freq = [(Fa),Fd1,(Fd2)] */ +- FDKsbrEnc_AddRight(v_freq, length_v_freq, v_tuningFreq[2]); +- } +- +- /* v_freq = [(Fa),Fd1,(Fd2),1] */ +- FDKsbrEnc_AddRight(v_freq, length_v_freq, 1); +- +- /* calc min and max values of mandatory borders */ +- *bmin = v_bord[0]; +- for (i = 0; i < *length_v_bord; i++) +- if (v_bord[i] < *bmin) *bmin = v_bord[i]; +- +- *bmax = v_bord[0]; +- for (i = 0; i < *length_v_bord; i++) +- if (v_bord[i] > *bmax) *bmax = v_bord[i]; +-} +- +-/******************************************************************************* +- Functionname: fillFramePre +- ******************************************************************************* +- +- Description: Add borders before mandatory borders, if needed +- +- Arguments: +- modified: +- v_bord - int pointer to v_bord vector +- length_v_bord - length of v_bord vector +- v_freq - int pointer to v_freq vector +- length_v_freq - length of v_freq vector +- not modified: +- dmax - int value +- bmin - int value +- rest - int value +- +- Return: none +- +-*******************************************************************************/ +-static void fillFramePre(INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, +- INT *length_v_freq, INT bmin, INT rest) { +- /* +- input state: +- v_bord = [(Ba),Bd1, Bd2 ,(Bd3)] +- v_freq = [(Fa),Fd1,(Fd2),1 ] +- */ +- +- INT parts, d, j, S, s = 0, segm, bord; +- +- /* +- start with one envelope +- */ +- +- parts = 1; +- d = rest; +- +- /* +- calc # of additional envelopes and corresponding lengths +- */ +- +- while (d > dmax) { +- parts++; +- +- segm = rest / parts; +- S = (segm - 2) >> 1; +- s = fixMin(8, 2 * S + 2); +- d = rest - (parts - 1) * s; +- } +- +- /* +- add borders before mandatory borders +- */ +- +- bord = bmin; +- +- for (j = 0; j <= parts - 2; j++) { +- bord = bord - s; +- +- /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] */ +- FDKsbrEnc_AddLeft(v_bord, length_v_bord, bord); +- +- /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 ] */ +- FDKsbrEnc_AddLeft(v_freq, length_v_freq, 1); +- } +-} +- +-/***************************************************************************/ +-/*! +- \brief Overlap control +- +- Calculate max length of trailing fill segments, such that we always get a +- border within the frame overlap region +- +- \return void +- +-****************************************************************************/ +-static int calcFillLengthMax( +- int tranPos, /*!< input : transient position (ref: tran det) */ +- int numberTimeSlots /*!< input : number of timeslots */ +-) { +- int fmax; +- +- /* +- calculate transient position within envelope buffer +- */ +- switch (numberTimeSlots) { +- case NUMBER_TIME_SLOTS_2048: +- if (tranPos < 4) +- fmax = 6; +- else if (tranPos == 4 || tranPos == 5) +- fmax = 4; +- else +- fmax = 8; +- break; +- +- case NUMBER_TIME_SLOTS_1920: +- if (tranPos < 4) +- fmax = 5; +- else if (tranPos == 4 || tranPos == 5) +- fmax = 3; +- else +- fmax = 7; +- break; +- +- default: +- fmax = 8; +- break; +- } +- +- return fmax; +-} +- +-/******************************************************************************* +- Functionname: fillFramePost +- ******************************************************************************* +- +- Description: -Add borders after mandatory borders, if needed +- Make a preliminary design of next frame, +- assuming no transient is present there +- +- Arguments: +- modified: +- parts - int pointer to parts (call by reference) +- d - int pointer to d (call by reference) +- v_bord - int pointer to v_bord vector +- length_v_bord - length of v_bord vector +- v_freq - int pointer to v_freq vector +- length_v_freq - length of v_freq vector +- not modified: +- bmax - int value +- dmax - int value +- +- Return: none +- +-*******************************************************************************/ +-static void fillFramePost(INT *parts, INT *d, INT dmax, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT *length_v_freq, +- INT bmax, INT bufferFrameStart, INT numberTimeSlots, +- INT fmax) { +- INT j, rest, segm, S, s = 0, bord; +- +- /* +- input state: +- v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] +- v_freq = [...,(1 ),(Fa),Fd1,(Fd2),1 ] +- */ +- +- rest = bufferFrameStart + 2 * numberTimeSlots - bmax; +- *d = rest; +- +- if (*d > 0) { +- *parts = 1; /* start with one envelope */ +- +- /* calc # of additional envelopes and corresponding lengths */ +- +- while (*d > dmax) { +- *parts = *parts + 1; +- +- segm = rest / (*parts); +- S = (segm - 2) >> 1; +- s = fixMin(fmax, 2 * S + 2); +- *d = rest - (*parts - 1) * s; +- } +- +- /* add borders after mandatory borders */ +- +- bord = bmax; +- for (j = 0; j <= *parts - 2; j++) { +- bord += s; +- +- /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3),(Bf)] */ +- FDKsbrEnc_AddRight(v_bord, length_v_bord, bord); +- +- /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 , 1! ,1] */ +- FDKsbrEnc_AddRight(v_freq, length_v_freq, 1); +- } +- } else { +- *parts = 1; +- +- /* remove last element from v_bord and v_freq */ +- +- *length_v_bord = *length_v_bord - 1; +- *length_v_freq = *length_v_freq - 1; +- } +-} +- +-/******************************************************************************* +- Functionname: fillFrameInter +- ******************************************************************************* +- +- Description: +- +- Arguments: nL - +- v_tuningSegm - +- v_bord - +- length_v_bord - +- bmin - +- v_freq - +- length_v_freq - +- v_bordFollow - +- length_v_bordFollow - +- v_freqFollow - +- length_v_freqFollow - +- i_fillFollow - +- dmin - +- dmax - +- +- Return: none +- +-*******************************************************************************/ +-static void fillFrameInter(INT *nL, const int *v_tuningSegm, INT *v_bord, +- INT *length_v_bord, INT bmin, INT *v_freq, +- INT *length_v_freq, INT *v_bordFollow, +- INT *length_v_bordFollow, INT *v_freqFollow, +- INT *length_v_freqFollow, INT i_fillFollow, INT dmin, +- INT dmax, INT numberTimeSlots) { +- INT middle, b_new, numBordFollow, bordMaxFollow, i; +- +- if (numberTimeSlots != NUMBER_TIME_SLOTS_1152) { +- /* % remove fill borders: */ +- if (i_fillFollow >= 1) { +- *length_v_bordFollow = i_fillFollow; +- *length_v_freqFollow = i_fillFollow; +- } +- +- numBordFollow = *length_v_bordFollow; +- bordMaxFollow = v_bordFollow[numBordFollow - 1]; +- +- /* remove even more borders if needed */ +- middle = bmin - bordMaxFollow; +- while (middle < 0) { +- numBordFollow--; +- bordMaxFollow = v_bordFollow[numBordFollow - 1]; +- middle = bmin - bordMaxFollow; +- } +- +- *length_v_bordFollow = numBordFollow; +- *length_v_freqFollow = numBordFollow; +- *nL = numBordFollow - 1; +- +- b_new = *length_v_bord; +- +- if (middle <= dmax) { +- if (middle >= dmin) { /* concatenate */ +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } +- +- else { +- if (v_tuningSegm[0] != 0) { /* remove one new border and concatenate */ +- *length_v_bord = b_new - 1; +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- +- *length_v_freq = b_new - 1; +- FDKsbrEnc_AddVecLeft(v_freq + 1, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } else { +- if (*length_v_bordFollow > +- 1) { /* remove one old border and concatenate */ +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow - 1); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_bordFollow - 1); +- +- *nL = *nL - 1; +- } else { /* remove new "transient" border and concatenate */ +- +- for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1]; +- +- for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1]; +- +- *length_v_bord = b_new - 1; +- *length_v_freq = b_new - 1; +- +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } +- } +- } +- } else { /* middle > dmax */ +- +- fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, +- middle); +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } +- +- } else { /* numberTimeSlots==NUMBER_TIME_SLOTS_1152 */ +- +- INT l, m; +- +- /*------------------------------------------------------------------------ +- remove fill borders +- ------------------------------------------------------------------------*/ +- if (i_fillFollow >= 1) { +- *length_v_bordFollow = i_fillFollow; +- *length_v_freqFollow = i_fillFollow; +- } +- +- numBordFollow = *length_v_bordFollow; +- bordMaxFollow = v_bordFollow[numBordFollow - 1]; +- +- /*------------------------------------------------------------------------ +- remove more borders if necessary to eliminate overlap +- ------------------------------------------------------------------------*/ +- +- /* check for overlap */ +- middle = bmin - bordMaxFollow; +- +- /* intervals: +- i) middle < 0 : overlap, must remove borders +- ii) 0 <= middle < dmin : no overlap but too tight, must remove +- borders iii) dmin <= middle <= dmax : ok, just concatenate iv) dmax +- <= middle : too wide, must add borders +- */ +- +- /* first remove old non-fill-borders... */ +- while (middle < 0) { +- /* ...but don't remove all of them */ +- if (numBordFollow == 1) break; +- +- numBordFollow--; +- bordMaxFollow = v_bordFollow[numBordFollow - 1]; +- middle = bmin - bordMaxFollow; +- } +- +- /* if this isn't enough, remove new non-fill borders */ +- if (middle < 0) { +- for (l = 0, m = 0; l < *length_v_bord; l++) { +- if (v_bord[l] > bordMaxFollow) { +- v_bord[m] = v_bord[l]; +- v_freq[m] = v_freq[l]; +- m++; +- } +- } +- +- *length_v_bord = l; +- *length_v_freq = l; +- +- bmin = v_bord[0]; +- } +- +- /*------------------------------------------------------------------------ +- update modified follow-up data +- ------------------------------------------------------------------------*/ +- +- *length_v_bordFollow = numBordFollow; +- *length_v_freqFollow = numBordFollow; +- +- /* left relative borders correspond to follow-up */ +- *nL = numBordFollow - 1; +- +- /*------------------------------------------------------------------------ +- take care of intervals ii through iv +- ------------------------------------------------------------------------*/ +- +- /* now middle should be >= 0 */ +- middle = bmin - bordMaxFollow; +- +- if (middle <= dmin) /* (ii) */ +- { +- b_new = *length_v_bord; +- +- if (v_tuningSegm[0] != 0) { +- /* remove new "luxury" border and concatenate */ +- *length_v_bord = b_new - 1; +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- +- *length_v_freq = b_new - 1; +- FDKsbrEnc_AddVecLeft(v_freq + 1, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- +- } else if (*length_v_bordFollow > 1) { +- /* remove old border and concatenate */ +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow - 1); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_bordFollow - 1); +- +- *nL = *nL - 1; +- } else { +- /* remove new border and concatenate */ +- for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1]; +- +- for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1]; +- +- *length_v_bord = b_new - 1; +- *length_v_freq = b_new - 1; +- +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } +- } else if ((middle >= dmin) && (middle <= dmax)) /* (iii) */ +- { +- /* concatenate */ +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- +- } else /* (iv) */ +- { +- fillFramePre(dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, +- middle); +- FDKsbrEnc_AddVecLeft(v_bord, length_v_bord, v_bordFollow, +- *length_v_bordFollow); +- FDKsbrEnc_AddVecLeft(v_freq, length_v_freq, v_freqFollow, +- *length_v_freqFollow); +- } +- } +-} +- +-/******************************************************************************* +- Functionname: calcFrameClass +- ******************************************************************************* +- +- Description: +- +- Arguments: INT* frameClass, INT* frameClassOld, INT tranFlag, INT* spreadFlag) +- +- Return: none +- +-*******************************************************************************/ +-static void calcFrameClass(FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, +- INT tranFlag, INT *spreadFlag) { +- switch (*frameClassOld) { +- case FIXFIXonly: +- case FIXFIX: +- if (tranFlag) +- *frameClass = FIXVAR; +- else +- *frameClass = FIXFIX; +- break; +- case FIXVAR: +- if (tranFlag) { +- *frameClass = VARVAR; +- *spreadFlag = 0; +- } else { +- if (*spreadFlag) +- *frameClass = VARVAR; +- else +- *frameClass = VARFIX; +- } +- break; +- case VARFIX: +- if (tranFlag) +- *frameClass = FIXVAR; +- else +- *frameClass = FIXFIX; +- break; +- case VARVAR: +- if (tranFlag) { +- *frameClass = VARVAR; +- *spreadFlag = 0; +- } else { +- if (*spreadFlag) +- *frameClass = VARVAR; +- else +- *frameClass = VARFIX; +- } +- break; +- }; +- +- *frameClassOld = *frameClass; +-} +- +-/******************************************************************************* +- Functionname: specialCase +- ******************************************************************************* +- +- Description: +- +- Arguments: spreadFlag +- allowSpread +- v_bord +- length_v_bord +- v_freq +- length_v_freq +- parts +- d +- +- Return: none +- +-*******************************************************************************/ +-static void specialCase(INT *spreadFlag, INT allowSpread, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT *length_v_freq, +- INT *parts, INT d) { +- INT L; +- +- L = *length_v_bord; +- +- if (allowSpread) { /* add one "step 8" */ +- *spreadFlag = 1; +- FDKsbrEnc_AddRight(v_bord, length_v_bord, v_bord[L - 1] + 8); +- FDKsbrEnc_AddRight(v_freq, length_v_freq, 1); +- (*parts)++; +- } else { +- if (d == 1) { /* stretch one slot */ +- *length_v_bord = L - 1; +- *length_v_freq = L - 1; +- } else { +- if ((v_bord[L - 1] - v_bord[L - 2]) > 2) { /* compress one quant step */ +- v_bord[L - 1] = v_bord[L - 1] - 2; +- v_freq[*length_v_freq - 1] = 0; /* use low res for short segment */ +- } +- } +- } +-} +- +-/******************************************************************************* +- Functionname: calcCmonBorder +- ******************************************************************************* +- +- Description: +- +- Arguments: i_cmon +- i_tran +- v_bord +- length_v_bord +- tran +- +- Return: none +- +-*******************************************************************************/ +-static void calcCmonBorder(INT *i_cmon, INT *i_tran, INT *v_bord, +- INT *length_v_bord, INT tran, INT bufferFrameStart, +- INT numberTimeSlots) { /* FH 00-06-26 */ +- INT i; +- +- for (i = 0; i < *length_v_bord; i++) +- if (v_bord[i] >= bufferFrameStart + numberTimeSlots) { /* FH 00-06-26 */ +- *i_cmon = i; +- break; +- } +- +- /* keep track of transient: */ +- for (i = 0; i < *length_v_bord; i++) +- if (v_bord[i] >= tran) { +- *i_tran = i; +- break; +- } else +- *i_tran = EMPTY; +-} +- +-/******************************************************************************* +- Functionname: keepForFollowUp +- ******************************************************************************* +- +- Description: +- +- Arguments: v_bordFollow +- length_v_bordFollow +- v_freqFollow +- length_v_freqFollow +- i_tranFollow +- i_fillFollow +- v_bord +- length_v_bord +- v_freq +- i_cmon +- i_tran +- parts) +- +- Return: none +- +-*******************************************************************************/ +-static void keepForFollowUp(INT *v_bordFollow, INT *length_v_bordFollow, +- INT *v_freqFollow, INT *length_v_freqFollow, +- INT *i_tranFollow, INT *i_fillFollow, INT *v_bord, +- INT *length_v_bord, INT *v_freq, INT i_cmon, +- INT i_tran, INT parts, +- INT numberTimeSlots) { /* FH 00-06-26 */ +- INT L, i, j; +- +- L = *length_v_bord; +- +- (*length_v_bordFollow) = 0; +- (*length_v_freqFollow) = 0; +- +- for (j = 0, i = i_cmon; i < L; i++, j++) { +- v_bordFollow[j] = v_bord[i] - numberTimeSlots; /* FH 00-06-26 */ +- v_freqFollow[j] = v_freq[i]; +- (*length_v_bordFollow)++; +- (*length_v_freqFollow)++; +- } +- if (i_tran != EMPTY) +- *i_tranFollow = i_tran - i_cmon; +- else +- *i_tranFollow = EMPTY; +- *i_fillFollow = L - (parts - 1) - i_cmon; +-} +- +-/******************************************************************************* +- Functionname: calcCtrlSignal +- ******************************************************************************* +- +- Description: +- +- Arguments: hSbrGrid +- frameClass +- v_bord +- length_v_bord +- v_freq +- length_v_freq +- i_cmon +- i_tran +- spreadFlag +- nL +- +- Return: none +- +-*******************************************************************************/ +-static void calcCtrlSignal(HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass, +- INT *v_bord, INT length_v_bord, INT *v_freq, +- INT length_v_freq, INT i_cmon, INT i_tran, +- INT spreadFlag, INT nL) { +- INT i, r, a, n, p, b, aL, aR, ntot, nmax, nR; +- +- INT *v_f = hSbrGrid->v_f; +- INT *v_fLR = hSbrGrid->v_fLR; +- INT *v_r = hSbrGrid->bs_rel_bord; +- INT *v_rL = hSbrGrid->bs_rel_bord_0; +- INT *v_rR = hSbrGrid->bs_rel_bord_1; +- +- INT length_v_r = 0; +- INT length_v_rR = 0; +- INT length_v_rL = 0; +- +- switch (frameClass) { +- case FIXVAR: +- /* absolute border: */ +- +- a = v_bord[i_cmon]; +- +- /* relative borders: */ +- length_v_r = 0; +- i = i_cmon; +- +- while (i >= 1) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_r, &length_v_r, r); +- i--; +- } +- +- /* number of relative borders: */ +- n = length_v_r; +- +- /* freq res: */ +- for (i = 0; i < i_cmon; i++) v_f[i] = v_freq[i_cmon - 1 - i]; +- v_f[i_cmon] = 1; +- +- /* pointer: */ +- p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0); +- +- hSbrGrid->frameClass = frameClass; +- hSbrGrid->bs_abs_bord = a; +- hSbrGrid->n = n; +- hSbrGrid->p = p; +- +- break; +- case VARFIX: +- /* absolute border: */ +- a = v_bord[0]; +- +- /* relative borders: */ +- length_v_r = 0; +- +- for (i = 1; i < length_v_bord; i++) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_r, &length_v_r, r); +- } +- +- /* number of relative borders: */ +- n = length_v_r; +- +- /* freq res: */ +- FDKmemcpy(v_f, v_freq, length_v_freq * sizeof(INT)); +- +- /* pointer: */ +- p = (i_tran >= 0 && i_tran != EMPTY) ? (i_tran + 1) : (0); +- +- hSbrGrid->frameClass = frameClass; +- hSbrGrid->bs_abs_bord = a; +- hSbrGrid->n = n; +- hSbrGrid->p = p; +- +- break; +- case VARVAR: +- if (spreadFlag) { +- /* absolute borders: */ +- b = length_v_bord; +- +- aL = v_bord[0]; +- aR = v_bord[b - 1]; +- +- /* number of relative borders: */ +- ntot = b - 2; +- +- nmax = 2; /* n: {0,1,2} */ +- if (ntot > nmax) { +- nL = nmax; +- nR = ntot - nmax; +- } else { +- nL = ntot; +- nR = 0; +- } +- +- /* relative borders: */ +- length_v_rL = 0; +- for (i = 1; i <= nL; i++) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_rL, &length_v_rL, r); +- } +- +- length_v_rR = 0; +- i = b - 1; +- while (i >= b - nR) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_rR, &length_v_rR, r); +- i--; +- } +- +- /* pointer (only one due to constraint in frame info): */ +- p = (i_tran > 0 && i_tran != EMPTY) ? (b - i_tran) : (0); +- +- /* freq res: */ +- +- for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i]; +- } else { +- length_v_bord = i_cmon + 1; +- +- /* absolute borders: */ +- b = length_v_bord; +- +- aL = v_bord[0]; +- aR = v_bord[b - 1]; +- +- /* number of relative borders: */ +- ntot = b - 2; +- nR = ntot - nL; +- +- /* relative borders: */ +- length_v_rL = 0; +- for (i = 1; i <= nL; i++) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_rL, &length_v_rL, r); +- } +- +- length_v_rR = 0; +- i = b - 1; +- while (i >= b - nR) { +- r = v_bord[i] - v_bord[i - 1]; +- FDKsbrEnc_AddRight(v_rR, &length_v_rR, r); +- i--; +- } +- +- /* pointer (only one due to constraint in frame info): */ +- p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0); +- +- /* freq res: */ +- for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i]; +- } +- +- hSbrGrid->frameClass = frameClass; +- hSbrGrid->bs_abs_bord_0 = aL; +- hSbrGrid->bs_abs_bord_1 = aR; +- hSbrGrid->bs_num_rel_0 = nL; +- hSbrGrid->bs_num_rel_1 = nR; +- hSbrGrid->p = p; +- +- break; +- +- default: +- /* do nothing */ +- break; +- } +-} +- +-/******************************************************************************* +- Functionname: createDefFrameInfo +- ******************************************************************************* +- +- Description: Copies the default (static) frameInfo structs to the frameInfo +- passed by reference; only used for FIXFIX frames +- +- Arguments: hFrameInfo - HANLDE_SBR_FRAME_INFO +- nEnv - INT +- nTimeSlots - INT +- +- Return: none; hSbrFrameInfo contains a copy of the default frameInfo +- +- Written: Andreas Schneider +- Revised: +-*******************************************************************************/ +-static void createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, INT nEnv, +- INT nTimeSlots) { +- switch (nEnv) { +- case 1: +- switch (nTimeSlots) { +- case NUMBER_TIME_SLOTS_1920: +- FDKmemcpy(hSbrFrameInfo, &frameInfo1_1920, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2048: +- FDKmemcpy(hSbrFrameInfo, &frameInfo1_2048, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_1152: +- FDKmemcpy(hSbrFrameInfo, &frameInfo1_1152, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2304: +- FDKmemcpy(hSbrFrameInfo, &frameInfo1_2304, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_512LD: +- FDKmemcpy(hSbrFrameInfo, &frameInfo1_512LD, sizeof(SBR_FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- case 2: +- switch (nTimeSlots) { +- case NUMBER_TIME_SLOTS_1920: +- FDKmemcpy(hSbrFrameInfo, &frameInfo2_1920, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2048: +- FDKmemcpy(hSbrFrameInfo, &frameInfo2_2048, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_1152: +- FDKmemcpy(hSbrFrameInfo, &frameInfo2_1152, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2304: +- FDKmemcpy(hSbrFrameInfo, &frameInfo2_2304, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_512LD: +- FDKmemcpy(hSbrFrameInfo, &frameInfo2_512LD, sizeof(SBR_FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- case 4: +- switch (nTimeSlots) { +- case NUMBER_TIME_SLOTS_1920: +- FDKmemcpy(hSbrFrameInfo, &frameInfo4_1920, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2048: +- FDKmemcpy(hSbrFrameInfo, &frameInfo4_2048, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_1152: +- FDKmemcpy(hSbrFrameInfo, &frameInfo4_1152, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_2304: +- FDKmemcpy(hSbrFrameInfo, &frameInfo4_2304, sizeof(SBR_FRAME_INFO)); +- break; +- case NUMBER_TIME_SLOTS_512LD: +- FDKmemcpy(hSbrFrameInfo, &frameInfo4_512LD, sizeof(SBR_FRAME_INFO)); +- break; +- default: +- FDK_ASSERT(0); +- } +- break; +- default: +- FDK_ASSERT(0); +- } +-} +- +-/******************************************************************************* +- Functionname: ctrlSignal2FrameInfo +- ******************************************************************************* +- +- Description: Convert "clear-text" sbr_grid() to "frame info" used by the +- envelope and noise floor estimators. +- This is basically (except for "low level" calculations) the +- bitstream decoder defined in the MPEG-4 standard, sub clause +- 4.6.18.3.3, Time / Frequency Grid. See inline comments for +- explanation of the shorten and noise border algorithms. +- +- Arguments: hSbrGrid - source +- hSbrFrameInfo - destination +- freq_res_fixfix - frequency resolution for FIXFIX frames +- +- Return: void; hSbrFrameInfo contains the updated FRAME_INFO struct +- +-*******************************************************************************/ +-static void ctrlSignal2FrameInfo( +- HANDLE_SBR_GRID hSbrGrid, /* input : the grid handle */ +- HANDLE_SBR_FRAME_INFO hSbrFrameInfo, /* output: the frame info handle */ +- FREQ_RES +- *freq_res_fixfix /* in/out: frequency resolution for FIXFIX frames */ +-) { +- INT frameSplit = 0; +- INT nEnv = 0, border = 0, i, k, p /*?*/; +- INT *v_r = hSbrGrid->bs_rel_bord; +- INT *v_f = hSbrGrid->v_f; +- +- FRAME_CLASS frameClass = hSbrGrid->frameClass; +- INT bufferFrameStart = hSbrGrid->bufferFrameStart; +- INT numberTimeSlots = hSbrGrid->numberTimeSlots; +- +- switch (frameClass) { +- case FIXFIX: +- createDefFrameInfo(hSbrFrameInfo, hSbrGrid->bs_num_env, numberTimeSlots); +- +- frameSplit = (hSbrFrameInfo->nEnvelopes > 1); +- for (i = 0; i < hSbrFrameInfo->nEnvelopes; i++) { +- hSbrGrid->v_f[i] = hSbrFrameInfo->freqRes[i] = +- freq_res_fixfix[frameSplit]; +- } +- break; +- +- case FIXVAR: +- case VARFIX: +- nEnv = hSbrGrid->n + 1; /* read n [SBR_NUM_BITS bits] */ /*? snd*/ +- FDK_ASSERT(nEnv <= MAX_ENVELOPES_FIXVAR_VARFIX); +- +- hSbrFrameInfo->nEnvelopes = nEnv; +- +- border = hSbrGrid->bs_abs_bord; /* read the absolute border */ +- +- if (nEnv == 1) +- hSbrFrameInfo->nNoiseEnvelopes = 1; +- else +- hSbrFrameInfo->nNoiseEnvelopes = 2; +- +- break; +- +- default: +- /* do nothing */ +- break; +- } +- +- switch (frameClass) { +- case FIXVAR: +- hSbrFrameInfo->borders[0] = +- bufferFrameStart; /* start-position of 1st envelope */ +- +- hSbrFrameInfo->borders[nEnv] = border; +- +- for (k = 0, i = nEnv - 1; k < nEnv - 1; k++, i--) { +- border -= v_r[k]; +- hSbrFrameInfo->borders[i] = border; +- } +- +- /* make either envelope nr. nEnv + 1 - p short; or don't shorten if p == 0 +- */ +- p = hSbrGrid->p; +- if (p == 0) { +- hSbrFrameInfo->shortEnv = 0; +- } else { +- hSbrFrameInfo->shortEnv = nEnv + 1 - p; +- } +- +- for (k = 0, i = nEnv - 1; k < nEnv; k++, i--) { +- hSbrFrameInfo->freqRes[i] = (FREQ_RES)v_f[k]; +- } +- +- /* if either there is no short envelope or the last envelope is short... +- */ +- if (p == 0 || p == 1) { +- hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; +- } else { +- hSbrFrameInfo->bordersNoise[1] = +- hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; +- } +- +- break; +- +- case VARFIX: +- /* in this case 'border' indicates the start of the 1st envelope */ +- hSbrFrameInfo->borders[0] = border; +- +- for (k = 0; k < nEnv - 1; k++) { +- border += v_r[k]; +- hSbrFrameInfo->borders[k + 1] = border; +- } +- +- hSbrFrameInfo->borders[nEnv] = bufferFrameStart + numberTimeSlots; +- +- p = hSbrGrid->p; +- if (p == 0 || p == 1) { +- hSbrFrameInfo->shortEnv = 0; +- } else { +- hSbrFrameInfo->shortEnv = p - 1; +- } +- +- for (k = 0; k < nEnv; k++) { +- hSbrFrameInfo->freqRes[k] = (FREQ_RES)v_f[k]; +- } +- +- switch (p) { +- case 0: +- hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[1]; +- break; +- case 1: +- hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; +- break; +- default: +- hSbrFrameInfo->bordersNoise[1] = +- hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; +- break; +- } +- break; +- +- case VARVAR: +- nEnv = hSbrGrid->bs_num_rel_0 + hSbrGrid->bs_num_rel_1 + 1; +- FDK_ASSERT(nEnv <= MAX_ENVELOPES_VARVAR); /* just to be sure */ +- hSbrFrameInfo->nEnvelopes = nEnv; +- +- hSbrFrameInfo->borders[0] = border = hSbrGrid->bs_abs_bord_0; +- +- for (k = 0, i = 1; k < hSbrGrid->bs_num_rel_0; k++, i++) { +- border += hSbrGrid->bs_rel_bord_0[k]; +- hSbrFrameInfo->borders[i] = border; +- } +- +- border = hSbrGrid->bs_abs_bord_1; +- hSbrFrameInfo->borders[nEnv] = border; +- +- for (k = 0, i = nEnv - 1; k < hSbrGrid->bs_num_rel_1; k++, i--) { +- border -= hSbrGrid->bs_rel_bord_1[k]; +- hSbrFrameInfo->borders[i] = border; +- } +- +- p = hSbrGrid->p; +- if (p == 0) { +- hSbrFrameInfo->shortEnv = 0; +- } else { +- hSbrFrameInfo->shortEnv = nEnv + 1 - p; +- } +- +- for (k = 0; k < nEnv; k++) { +- hSbrFrameInfo->freqRes[k] = (FREQ_RES)hSbrGrid->v_fLR[k]; +- } +- +- if (nEnv == 1) { +- hSbrFrameInfo->nNoiseEnvelopes = 1; +- hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; +- hSbrFrameInfo->bordersNoise[1] = hSbrGrid->bs_abs_bord_1; +- } else { +- hSbrFrameInfo->nNoiseEnvelopes = 2; +- hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; +- +- if (p == 0 || p == 1) { +- hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; +- } else { +- hSbrFrameInfo->bordersNoise[1] = +- hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; +- } +- hSbrFrameInfo->bordersNoise[2] = hSbrGrid->bs_abs_bord_1; +- } +- break; +- +- default: +- /* do nothing */ +- break; +- } +- +- if (frameClass == VARFIX || frameClass == FIXVAR) { +- hSbrFrameInfo->bordersNoise[0] = hSbrFrameInfo->borders[0]; +- if (nEnv == 1) { +- hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv]; +- } else { +- hSbrFrameInfo->bordersNoise[2] = hSbrFrameInfo->borders[nEnv]; +- } +- } +-} +diff --git a/libSBRenc/src/fram_gen.h b/libSBRenc/src/fram_gen.h +deleted file mode 100644 +index 0c5edc3..0000000 +--- a/libSBRenc/src/fram_gen.h ++++ /dev/null +@@ -1,343 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Framing generator prototypes and structs $Revision: 92790 $ +-*/ +-#ifndef FRAM_GEN_H +-#define FRAM_GEN_H +- +-#include "sbr_def.h" /* for MAX_ENVELOPES and MAX_NOISE_ENVELOPES in struct FRAME_INFO and CODEC_TYPE */ +-#include "sbr_encoder.h" /* for FREQ_RES */ +- +-#define MAX_ENVELOPES_VARVAR \ +- MAX_ENVELOPES /*!< worst case number of envelopes in a VARVAR frame */ +-#define MAX_ENVELOPES_FIXVAR_VARFIX \ +- 4 /*!< worst case number of envelopes in VARFIX and FIXVAR frames */ +-#define MAX_NUM_REL \ +- 3 /*!< maximum number of relative borders in any VAR frame */ +- +-/* SBR frame class definitions */ +-typedef enum { +- FIXFIX = +- 0, /*!< bs_frame_class: leading and trailing frame borders are fixed */ +- FIXVAR, /*!< bs_frame_class: leading frame border is fixed, trailing frame +- border is variable */ +- VARFIX, /*!< bs_frame_class: leading frame border is variable, trailing frame +- border is fixed */ +- VARVAR /*!< bs_frame_class: leading and trailing frame borders are variable */ +- , +- FIXFIXonly /*!< bs_frame_class: leading border fixed (0), trailing border +- fixed (nrTimeSlots) and encased borders are dynamically derived +- from the tranPos */ +-} FRAME_CLASS; +- +-/* helper constants */ +-#define DC 4711 /*!< helper constant: don't care */ +-#define EMPTY (-99) /*!< helper constant: empty */ +- +-/* system constants: AAC+SBR, DRM Frame-Length */ +-#define FRAME_MIDDLE_SLOT_1920 4 +-#define NUMBER_TIME_SLOTS_1920 15 +- +-#define LD_PRETRAN_OFF 3 +-#define FRAME_MIDDLE_SLOT_512LD 4 +-#define NUMBER_TIME_SLOTS_512LD 8 +-#define TRANSIENT_OFFSET_LD 0 +- +-/* +-system constants: AAC+SBR or aacPRO (hybrid format), Standard Frame-Length, +-Multi-Rate +---------------------------------------------------------------------------- +-Number of slots (numberTimeSlots): 16 (NUMBER_TIME_SLOTS_2048) +-Detector-offset (frameMiddleSlot): 4 +-Overlap : 3 +-Buffer-offset : 8 (BUFFER_FRAME_START_2048 = 0) +- +- +- |<------------tranPos---------->| +- |c|d|e|f|0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f| +- FixFix | | +- FixVar | :<- ->: +- VarFix :<- ->: | +- VarVar :<- ->: :<- ->: +- 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 +-................................................................................ +- +-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-| +- +-frame-generator:0 16 24 32 +-analysis-buffer:8 24 32 40 +-*/ +-#define FRAME_MIDDLE_SLOT_2048 4 +-#define NUMBER_TIME_SLOTS_2048 16 +- +-/* +-system constants: mp3PRO, Multi-Rate & Single-Rate +--------------------------------------------------- +-Number of slots (numberTimeSlots): 9 (NUMBER_TIME_SLOTS_1152) +-Detector-offset (frameMiddleSlot): 4 (FRAME_MIDDLE_SLOT_1152) +-Overlap : 3 +-Buffer-offset : 4.5 (BUFFER_FRAME_START_1152 = 0) +- +- +- |<----tranPos---->| +- |5|6|7|8|0|1|2|3|4|5|6|7|8| +- FixFix | | +- FixVar | :<- ->: +- VarFix :<- ->: | +- VarVar :<- ->: :<- ->: +- 0 1 2 3 4 5 6 7 8 0 1 2 3 +- ............................................. +- +- -|-|-|-|-B-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-| +- +-frame-generator: 0 9 13 18 +-analysis-buffer: 4.5 13.5 22.5 +-*/ +-#define FRAME_MIDDLE_SLOT_1152 4 +-#define NUMBER_TIME_SLOTS_1152 9 +- +-/* system constants: Layer2+SBR */ +-#define FRAME_MIDDLE_SLOT_2304 8 +-#define NUMBER_TIME_SLOTS_2304 18 +- +-/*! +- \struct SBR_GRID +- \brief sbr_grid() signals to be converted to bitstream elements +- +- The variables hold the signals (e.g. lengths and numbers) in "clear text" +-*/ +- +-typedef struct { +- /* system constants */ +- INT bufferFrameStart; /*!< frame generator vs analysis buffer time alignment +- (currently set to 0, offset added elsewhere) */ +- INT numberTimeSlots; /*!< number of SBR timeslots per frame */ +- +- /* will be adjusted for every frame */ +- FRAME_CLASS frameClass; /*!< SBR frame class */ +- INT bs_num_env; /*!< bs_num_env, number of envelopes for FIXFIX */ +- INT bs_abs_bord; /*!< bs_abs_bord, absolute border for VARFIX and FIXVAR */ +- INT n; /*!< number of relative borders for VARFIX and FIXVAR */ +- INT p; /*!< pointer-to-transient-border */ +- INT bs_rel_bord[MAX_NUM_REL]; /*!< bs_rel_bord, relative borders for all VAR +- */ +- INT v_f[MAX_ENVELOPES_FIXVAR_VARFIX]; /*!< envelope frequency resolutions for +- FIXVAR and VARFIX */ +- +- INT bs_abs_bord_0; /*!< bs_abs_bord_0, leading absolute border for VARVAR */ +- INT bs_abs_bord_1; /*!< bs_abs_bord_1, trailing absolute border for VARVAR */ +- INT bs_num_rel_0; /*!< bs_num_rel_0, number of relative borders associated +- with leading absolute border for VARVAR */ +- INT bs_num_rel_1; /*!< bs_num_rel_1, number of relative borders associated +- with trailing absolute border for VARVAR */ +- INT bs_rel_bord_0[MAX_NUM_REL]; /*!< bs_rel_bord_0, relative borders +- associated with leading absolute border +- for VARVAR */ +- INT bs_rel_bord_1[MAX_NUM_REL]; /*!< bs_rel_bord_1, relative borders +- associated with trailing absolute border +- for VARVAR */ +- INT v_fLR[MAX_ENVELOPES_VARVAR]; /*!< envelope frequency resolutions for +- VARVAR */ +- +-} SBR_GRID; +-typedef SBR_GRID *HANDLE_SBR_GRID; +- +-/*! +- \struct SBR_FRAME_INFO +- \brief time/frequency grid description for one frame +-*/ +-typedef struct { +- INT nEnvelopes; /*!< number of envelopes */ +- INT borders[MAX_ENVELOPES + 1]; /*!< envelope borders in SBR timeslots */ +- FREQ_RES freqRes[MAX_ENVELOPES]; /*!< frequency resolution of each envelope */ +- INT shortEnv; /*!< number of an envelope to be shortened (starting at 1) or 0 +- for no shortened envelope */ +- INT nNoiseEnvelopes; /*!< number of noise floors */ +- INT bordersNoise[MAX_NOISE_ENVELOPES + +- 1]; /*!< noise floor borders in SBR timeslots */ +-} SBR_FRAME_INFO; +-/* WARNING: When rearranging the elements of this struct keep in mind that the +- * static initializations in the corresponding C-file have to be rearranged as +- * well! snd 2002/01/23 +- */ +-typedef SBR_FRAME_INFO *HANDLE_SBR_FRAME_INFO; +- +-/*! +- \struct SBR_ENVELOPE_FRAME +- \brief frame generator main struct +- +- Contains tuning parameters, time/frequency grid description, sbr_grid() +- bitstream elements, and generator internal signals +-*/ +-typedef struct { +- /* system constants */ +- INT frameMiddleSlot; /*!< transient detector offset in SBR timeslots */ +- +- /* basic tuning parameters */ +- INT staticFraming; /*!< 1: run static framing in time, i.e. exclusive use of +- bs_frame_class = FIXFIX */ +- INT numEnvStatic; /*!< number of envelopes per frame for static framing */ +- FREQ_RES +- freq_res_fixfix[2]; /*!< envelope frequency resolution to use for +- bs_frame_class = FIXFIX; single env and split */ +- UCHAR +- fResTransIsLow; /*!< frequency resolution for transient frames - always +- low (0) or according to table (1) */ +- +- /* expert tuning parameters */ +- const int *v_tuningSegm; /*!< segment lengths to use around transient */ +- const int *v_tuningFreq; /*!< frequency resolutions to use around transient */ +- INT dmin; /*!< minimum length of dependent segments */ +- INT dmax; /*!< maximum length of dependent segments */ +- INT allowSpread; /*!< 1: allow isolated transient to influence grid of 3 +- consecutive frames */ +- +- /* internally used signals */ +- FRAME_CLASS frameClassOld; /*!< frame class used for previous frame */ +- INT spreadFlag; /*!< 1: use VARVAR instead of VARFIX to follow up old +- transient */ +- +- INT v_bord[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< borders for current frame and +- preliminary borders for next +- frame (fixed borders excluded) */ +- INT length_v_bord; /*!< helper variable: length of v_bord */ +- INT v_freq[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< frequency resolutions for +- current frame and preliminary +- resolutions for next frame */ +- INT length_v_freq; /*!< helper variable: length of v_freq */ +- +- INT v_bordFollow[MAX_ENVELOPES_VARVAR]; /*!< preliminary borders for current +- frame (calculated during previous +- frame) */ +- INT length_v_bordFollow; /*!< helper variable: length of v_bordFollow */ +- INT i_tranFollow; /*!< points to transient border in v_bordFollow (may be +- negative, see keepForFollowUp()) */ +- INT i_fillFollow; /*!< points to first fill border in v_bordFollow */ +- INT v_freqFollow[MAX_ENVELOPES_VARVAR]; /*!< preliminary frequency resolutions +- for current frame (calculated +- during previous frame) */ +- INT length_v_freqFollow; /*!< helper variable: length of v_freqFollow */ +- +- /* externally needed signals */ +- SBR_GRID +- SbrGrid; /*!< sbr_grid() signals to be converted to bitstream elements */ +- SBR_FRAME_INFO +- SbrFrameInfo; /*!< time/frequency grid description for one frame */ +-} SBR_ENVELOPE_FRAME; +-typedef SBR_ENVELOPE_FRAME *HANDLE_SBR_ENVELOPE_FRAME; +- +-void FDKsbrEnc_initFrameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, +- INT allowSpread, INT numEnvStatic, +- INT staticFraming, INT timeSlots, +- const FREQ_RES *freq_res_fixfix, +- UCHAR fResTransIsLow, INT ldGrid); +- +-HANDLE_SBR_FRAME_INFO +-FDKsbrEnc_frameInfoGenerator(HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, +- UCHAR *v_transient_info, const INT rightBorderFIX, +- UCHAR *v_transient_info_pre, int ldGrid, +- const int *v_tuning); +- +-#endif +diff --git a/libSBRenc/src/invf_est.cpp b/libSBRenc/src/invf_est.cpp +deleted file mode 100644 +index 53b47ac..0000000 +--- a/libSBRenc/src/invf_est.cpp ++++ /dev/null +@@ -1,610 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "invf_est.h" +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-#define MAX_NUM_REGIONS 10 +-#define SCALE_FAC_QUO 512.0f +-#define SCALE_FAC_NRG 256.0f +- +-#ifndef min +-#define min(a, b) (a < b ? a : b) +-#endif +- +-#ifndef max +-#define max(a, b) (a > b ? a : b) +-#endif +- +-static const FIXP_DBL quantStepsSbr[4] = { +- 0x00400000, 0x02800000, 0x03800000, +- 0x04c00000}; /* table scaled with SCALE_FAC_QUO */ +-static const FIXP_DBL quantStepsOrig[4] = { +- 0x00000000, 0x00c00000, 0x01c00000, +- 0x02800000}; /* table scaled with SCALE_FAC_QUO */ +-static const FIXP_DBL nrgBorders[4] = { +- 0x0c800000, 0x0f000000, 0x11800000, +- 0x14000000}; /* table scaled with SCALE_FAC_NRG */ +- +-static const DETECTOR_PARAMETERS detectorParamsAAC = { +- quantStepsSbr, +- quantStepsOrig, +- nrgBorders, +- 4, /* Number of borders SBR. */ +- 4, /* Number of borders orig. */ +- 4, /* Number of borders Nrg. */ +- { +- /* Region space. */ +- {INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* regionSbr */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF} /* | */ +- }, /*------------------------ regionOrig ---------------------------------*/ +- { +- /* Region space transient. */ +- {INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* regionSbr */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF} /* | */ +- }, /*------------------------ regionOrig ---------------------------------*/ +- {-4, -3, -2, -1, +- 0} /* Reduction factor of the inverse filtering for low energies.*/ +-}; +- +-static const FIXP_DBL hysteresis = +- 0x00400000; /* Delta value for hysteresis. scaled with SCALE_FAC_QUO */ +- +-/* +- * AAC+SBR PARAMETERS for Speech +- *********************************/ +-static const DETECTOR_PARAMETERS detectorParamsAACSpeech = { +- quantStepsSbr, +- quantStepsOrig, +- nrgBorders, +- 4, /* Number of borders SBR. */ +- 4, /* Number of borders orig. */ +- 4, /* Number of borders Nrg. */ +- { +- /* Region space. */ +- {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* regionSbr */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF} /* | */ +- }, /*------------------------ regionOrig ---------------------------------*/ +- { +- /* Region space transient. */ +- {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* regionSbr */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF}, /* | */ +- {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, +- INVF_OFF} /* | */ +- }, /*------------------------ regionOrig ---------------------------------*/ +- {-4, -3, -2, -1, +- 0} /* Reduction factor of the inverse filtering for low energies.*/ +-}; +- +-/* +- * Smoothing filters. +- ************************/ +-typedef const FIXP_DBL FIR_FILTER[5]; +- +-static const FIR_FILTER fir_0 = {0x7fffffff, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000}; +-static const FIR_FILTER fir_1 = {0x2aaaaa80, 0x555554ff, 0x00000000, 0x00000000, +- 0x00000000}; +-static const FIR_FILTER fir_2 = {0x10000000, 0x30000000, 0x40000000, 0x00000000, +- 0x00000000}; +-static const FIR_FILTER fir_3 = {0x077f80e8, 0x199999a0, 0x2bb3b240, 0x33333340, +- 0x00000000}; +-static const FIR_FILTER fir_4 = {0x04130598, 0x0ebdb000, 0x1becfa60, 0x2697a4c0, +- 0x2aaaaa80}; +- +-static const FIR_FILTER *const fir_table[5] = {&fir_0, &fir_1, &fir_2, &fir_3, +- &fir_4}; +- +-/**************************************************************************/ +-/*! +- \brief Calculates the values used for the detector. +- +- +- \return none +- +-*/ +-/**************************************************************************/ +-static void calculateDetectorValues( +- FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the tonality values of the +- original. */ +- SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ +- FIXP_DBL *nrgVector, /*!< Energy vector. */ +- DETECTOR_VALUES *detectorValues, /*!< pointer to DETECTOR_VALUES struct. */ +- INT startChannel, /*!< Start channel. */ +- INT stopChannel, /*!< Stop channel. */ +- INT startIndex, /*!< Start index. */ +- INT stopIndex, /*!< Stop index. */ +- INT numberOfStrongest /*!< The number of sorted tonal components to be +- considered. */ +-) { +- INT i, temp, j; +- +- const FIXP_DBL *filter = *fir_table[INVF_SMOOTHING_LENGTH]; +- FIXP_DBL origQuotaMeanStrongest, sbrQuotaMeanStrongest; +- FIXP_DBL origQuota, sbrQuota; +- FIXP_DBL invIndex, invChannel, invTemp; +- FIXP_DBL quotaVecOrig[64], quotaVecSbr[64]; +- +- FDKmemclear(quotaVecOrig, 64 * sizeof(FIXP_DBL)); +- FDKmemclear(quotaVecSbr, 64 * sizeof(FIXP_DBL)); +- +- invIndex = GetInvInt(stopIndex - startIndex); +- invChannel = GetInvInt(stopChannel - startChannel); +- +- /* +- Calculate the mean value, over the current time segment, for the original, +- the HFR and the difference, over all channels in the current frequency range. +- NOTE: the averaging is done on the values quota/(1 - quota + RELAXATION). +- */ +- +- /* The original, the sbr signal and the total energy */ +- detectorValues->avgNrg = FL2FXCONST_DBL(0.0f); +- for (j = startIndex; j < stopIndex; j++) { +- for (i = startChannel; i < stopChannel; i++) { +- quotaVecOrig[i] += fMult(quotaMatrixOrig[j][i], invIndex); +- +- if (indexVector[i] != -1) +- quotaVecSbr[i] += fMult(quotaMatrixOrig[j][indexVector[i]], invIndex); +- } +- detectorValues->avgNrg += fMult(nrgVector[j], invIndex); +- } +- +- /* +- Calculate the mean value, over the current frequency range, for the original, +- the HFR and the difference. Also calculate the same mean values for the three +- vectors, but only includeing the x strongest copmponents. +- */ +- +- origQuota = FL2FXCONST_DBL(0.0f); +- sbrQuota = FL2FXCONST_DBL(0.0f); +- for (i = startChannel; i < stopChannel; i++) { +- origQuota += fMultDiv2(quotaVecOrig[i], invChannel); +- sbrQuota += fMultDiv2(quotaVecSbr[i], invChannel); +- } +- +- /* +- Calculate the mean value for the x strongest components +- */ +- FDKsbrEnc_Shellsort_fract(quotaVecOrig + startChannel, +- stopChannel - startChannel); +- FDKsbrEnc_Shellsort_fract(quotaVecSbr + startChannel, +- stopChannel - startChannel); +- +- origQuotaMeanStrongest = FL2FXCONST_DBL(0.0f); +- sbrQuotaMeanStrongest = FL2FXCONST_DBL(0.0f); +- +- temp = min(stopChannel - startChannel, numberOfStrongest); +- invTemp = GetInvInt(temp); +- +- for (i = 0; i < temp; i++) { +- origQuotaMeanStrongest += +- fMultDiv2(quotaVecOrig[i + stopChannel - temp], invTemp); +- sbrQuotaMeanStrongest += +- fMultDiv2(quotaVecSbr[i + stopChannel - temp], invTemp); +- } +- +- /* +- The value for the strongest component +- */ +- detectorValues->origQuotaMax = quotaVecOrig[stopChannel - 1]; +- detectorValues->sbrQuotaMax = quotaVecSbr[stopChannel - 1]; +- +- /* +- Buffer values +- */ +- FDKmemmove(detectorValues->origQuotaMean, detectorValues->origQuotaMean + 1, +- INVF_SMOOTHING_LENGTH * sizeof(FIXP_DBL)); +- FDKmemmove(detectorValues->sbrQuotaMean, detectorValues->sbrQuotaMean + 1, +- INVF_SMOOTHING_LENGTH * sizeof(FIXP_DBL)); +- FDKmemmove(detectorValues->origQuotaMeanStrongest, +- detectorValues->origQuotaMeanStrongest + 1, +- INVF_SMOOTHING_LENGTH * sizeof(FIXP_DBL)); +- FDKmemmove(detectorValues->sbrQuotaMeanStrongest, +- detectorValues->sbrQuotaMeanStrongest + 1, +- INVF_SMOOTHING_LENGTH * sizeof(FIXP_DBL)); +- +- detectorValues->origQuotaMean[INVF_SMOOTHING_LENGTH] = origQuota << 1; +- detectorValues->sbrQuotaMean[INVF_SMOOTHING_LENGTH] = sbrQuota << 1; +- detectorValues->origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH] = +- origQuotaMeanStrongest << 1; +- detectorValues->sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH] = +- sbrQuotaMeanStrongest << 1; +- +- /* +- Filter values +- */ +- detectorValues->origQuotaMeanFilt = FL2FXCONST_DBL(0.0f); +- detectorValues->sbrQuotaMeanFilt = FL2FXCONST_DBL(0.0f); +- detectorValues->origQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); +- detectorValues->sbrQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); +- +- for (i = 0; i < INVF_SMOOTHING_LENGTH + 1; i++) { +- detectorValues->origQuotaMeanFilt += +- fMult(detectorValues->origQuotaMean[i], filter[i]); +- detectorValues->sbrQuotaMeanFilt += +- fMult(detectorValues->sbrQuotaMean[i], filter[i]); +- detectorValues->origQuotaMeanStrongestFilt += +- fMult(detectorValues->origQuotaMeanStrongest[i], filter[i]); +- detectorValues->sbrQuotaMeanStrongestFilt += +- fMult(detectorValues->sbrQuotaMeanStrongest[i], filter[i]); +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Returns the region in which the input value belongs. +- +- +- +- \return region. +- +-*/ +-/**************************************************************************/ +-static INT findRegion( +- FIXP_DBL currVal, /*!< The current value. */ +- const FIXP_DBL *borders, /*!< The border of the regions. */ +- const INT numBorders /*!< The number of borders. */ +-) { +- INT i; +- +- if (currVal < borders[0]) { +- return 0; +- } +- +- for (i = 1; i < numBorders; i++) { +- if (currVal >= borders[i - 1] && currVal < borders[i]) { +- return i; +- } +- } +- +- if (currVal >= borders[numBorders - 1]) { +- return numBorders; +- } +- +- return 0; /* We never get here, it's just to avoid compiler warnings.*/ +-} +- +-/**************************************************************************/ +-/*! +- \brief Makes a clever decision based on the quota vector. +- +- +- \return decision on which invf mode to use +- +-*/ +-/**************************************************************************/ +-static INVF_MODE decisionAlgorithm( +- const DETECTOR_PARAMETERS +- *detectorParams, /*!< Struct with the detector parameters. */ +- DETECTOR_VALUES *detectorValues, /*!< Struct with the detector values. */ +- INT transientFlag, /*!< Flag indicating if there is a transient present.*/ +- INT *prevRegionSbr, /*!< The previous region in which the Sbr value was. */ +- INT *prevRegionOrig /*!< The previous region in which the Orig value was. */ +-) { +- INT invFiltLevel, regionSbr, regionOrig, regionNrg; +- +- /* +- Current thresholds. +- */ +- const INT numRegionsSbr = detectorParams->numRegionsSbr; +- const INT numRegionsOrig = detectorParams->numRegionsOrig; +- const INT numRegionsNrg = detectorParams->numRegionsNrg; +- +- FIXP_DBL quantStepsSbrTmp[MAX_NUM_REGIONS]; +- FIXP_DBL quantStepsOrigTmp[MAX_NUM_REGIONS]; +- +- /* +- Current detector values. +- */ +- FIXP_DBL origQuotaMeanFilt; +- FIXP_DBL sbrQuotaMeanFilt; +- FIXP_DBL nrg; +- +- /* 0.375 = 3.0 / 8.0; 0.31143075889 = log2(RELAXATION)/64.0; 0.625 = +- * log(16)/64.0; 0.6875 = 44/64.0 */ +- origQuotaMeanFilt = +- (fMultDiv2(FL2FXCONST_DBL(2.f * 0.375f), +- (FIXP_DBL)(CalcLdData(max(detectorValues->origQuotaMeanFilt, +- (FIXP_DBL)1)) + +- FL2FXCONST_DBL(0.31143075889f)))) +- << 0; /* scaled by 1/2^9 */ +- sbrQuotaMeanFilt = +- (fMultDiv2(FL2FXCONST_DBL(2.f * 0.375f), +- (FIXP_DBL)(CalcLdData(max(detectorValues->sbrQuotaMeanFilt, +- (FIXP_DBL)1)) + +- FL2FXCONST_DBL(0.31143075889f)))) +- << 0; /* scaled by 1/2^9 */ +- /* If energy is zero then we will get different results for different word +- * lengths. */ +- nrg = +- (fMultDiv2(FL2FXCONST_DBL(2.f * 0.375f), +- (FIXP_DBL)(CalcLdData(detectorValues->avgNrg + (FIXP_DBL)1) + +- FL2FXCONST_DBL(0.0625f) + FL2FXCONST_DBL(0.6875f)))) +- << 0; /* scaled by 1/2^8; 2^44 -> qmf energy scale */ +- +- FDKmemcpy(quantStepsSbrTmp, detectorParams->quantStepsSbr, +- numRegionsSbr * sizeof(FIXP_DBL)); +- FDKmemcpy(quantStepsOrigTmp, detectorParams->quantStepsOrig, +- numRegionsOrig * sizeof(FIXP_DBL)); +- +- if (*prevRegionSbr < numRegionsSbr) +- quantStepsSbrTmp[*prevRegionSbr] = +- detectorParams->quantStepsSbr[*prevRegionSbr] + hysteresis; +- if (*prevRegionSbr > 0) +- quantStepsSbrTmp[*prevRegionSbr - 1] = +- detectorParams->quantStepsSbr[*prevRegionSbr - 1] - hysteresis; +- +- if (*prevRegionOrig < numRegionsOrig) +- quantStepsOrigTmp[*prevRegionOrig] = +- detectorParams->quantStepsOrig[*prevRegionOrig] + hysteresis; +- if (*prevRegionOrig > 0) +- quantStepsOrigTmp[*prevRegionOrig - 1] = +- detectorParams->quantStepsOrig[*prevRegionOrig - 1] - hysteresis; +- +- regionSbr = findRegion(sbrQuotaMeanFilt, quantStepsSbrTmp, numRegionsSbr); +- regionOrig = findRegion(origQuotaMeanFilt, quantStepsOrigTmp, numRegionsOrig); +- regionNrg = findRegion(nrg, detectorParams->nrgBorders, numRegionsNrg); +- +- *prevRegionSbr = regionSbr; +- *prevRegionOrig = regionOrig; +- +- /* Use different settings if a transient is present*/ +- invFiltLevel = +- (transientFlag == 1) +- ? detectorParams->regionSpaceTransient[regionSbr][regionOrig] +- : detectorParams->regionSpace[regionSbr][regionOrig]; +- +- /* Compensate for low energy.*/ +- invFiltLevel = +- max(invFiltLevel + detectorParams->EnergyCompFactor[regionNrg], 0); +- +- return (INVF_MODE)(invFiltLevel); +-} +- +-/**************************************************************************/ +-/*! +- \brief Estiamtion of the inverse filtering level required +- in the decoder. +- +- A second order LPC is calculated for every filterbank channel, using +- the covariance method. THe ratio between the energy of the predicted +- signal and the energy of the non-predictable signal is calcualted. +- +- \return none. +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_qmfInverseFilteringDetector( +- HANDLE_SBR_INV_FILT_EST +- hInvFilt, /*!< Handle to the SBR_INV_FILT_EST struct. */ +- FIXP_DBL **quotaMatrix, /*!< The matrix holding the tonality values of the +- original. */ +- FIXP_DBL *nrgVector, /*!< The energy vector. */ +- SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ +- INT startIndex, /*!< Start index. */ +- INT stopIndex, /*!< Stop index. */ +- INT transientFlag, /*!< Flag indicating if a transient is present or not.*/ +- INVF_MODE *infVec /*!< Vector holding the inverse filtering levels. */ +-) { +- INT band; +- +- /* +- * Do the inverse filtering level estimation. +- *****************************************************/ +- for (band = 0; band < hInvFilt->noDetectorBands; band++) { +- INT startChannel = hInvFilt->freqBandTableInvFilt[band]; +- INT stopChannel = hInvFilt->freqBandTableInvFilt[band + 1]; +- +- calculateDetectorValues(quotaMatrix, indexVector, nrgVector, +- &hInvFilt->detectorValues[band], startChannel, +- stopChannel, startIndex, stopIndex, +- hInvFilt->numberOfStrongest); +- +- infVec[band] = decisionAlgorithm( +- hInvFilt->detectorParams, &hInvFilt->detectorValues[band], +- transientFlag, &hInvFilt->prevRegionSbr[band], +- &hInvFilt->prevRegionOrig[band]); +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Initialize an instance of the inverse filtering level estimator. +- +- +- \return errorCode, noError if successful. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_initInvFiltDetector( +- HANDLE_SBR_INV_FILT_EST +- hInvFilt, /*!< Pointer to a handle to the SBR_INV_FILT_EST struct. */ +- INT *freqBandTableDetector, /*!< Frequency band table for the inverse +- filtering. */ +- INT numDetectorBands, /*!< Number of inverse filtering bands. */ +- UINT +- useSpeechConfig /*!< Flag: adapt tuning parameters according to speech*/ +-) { +- INT i; +- +- FDKmemclear(hInvFilt, sizeof(SBR_INV_FILT_EST)); +- +- hInvFilt->detectorParams = +- (useSpeechConfig) ? &detectorParamsAACSpeech : &detectorParamsAAC; +- +- hInvFilt->noDetectorBandsMax = numDetectorBands; +- +- /* +- Memory initialisation +- */ +- for (i = 0; i < hInvFilt->noDetectorBandsMax; i++) { +- FDKmemclear(&hInvFilt->detectorValues[i], sizeof(DETECTOR_VALUES)); +- hInvFilt->prevInvfMode[i] = INVF_OFF; +- hInvFilt->prevRegionOrig[i] = 0; +- hInvFilt->prevRegionSbr[i] = 0; +- } +- +- /* +- Reset the inverse fltering detector. +- */ +- FDKsbrEnc_resetInvFiltDetector(hInvFilt, freqBandTableDetector, +- hInvFilt->noDetectorBandsMax); +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief resets sbr inverse filtering structure. +- +- +- +- \return errorCode, noError if successful. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_resetInvFiltDetector( +- HANDLE_SBR_INV_FILT_EST +- hInvFilt, /*!< Handle to the SBR_INV_FILT_EST struct. */ +- INT *freqBandTableDetector, /*!< Frequency band table for the inverse +- filtering. */ +- INT numDetectorBands) /*!< Number of inverse filtering bands. */ +-{ +- hInvFilt->numberOfStrongest = 1; +- FDKmemcpy(hInvFilt->freqBandTableInvFilt, freqBandTableDetector, +- (numDetectorBands + 1) * sizeof(INT)); +- hInvFilt->noDetectorBands = numDetectorBands; +- +- return (0); +-} +diff --git a/libSBRenc/src/invf_est.h b/libSBRenc/src/invf_est.h +deleted file mode 100644 +index 3ab6726..0000000 +--- a/libSBRenc/src/invf_est.h ++++ /dev/null +@@ -1,181 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Inverse Filtering detection prototypes $Revision: 92790 $ +-*/ +-#ifndef INVF_EST_H +-#define INVF_EST_H +- +-#include "sbr_encoder.h" +-#include "sbr_def.h" +- +-#define INVF_SMOOTHING_LENGTH 2 +- +-typedef struct { +- const FIXP_DBL *quantStepsSbr; +- const FIXP_DBL *quantStepsOrig; +- const FIXP_DBL *nrgBorders; +- INT numRegionsSbr; +- INT numRegionsOrig; +- INT numRegionsNrg; +- INVF_MODE regionSpace[5][5]; +- INVF_MODE regionSpaceTransient[5][5]; +- INT EnergyCompFactor[5]; +- +-} DETECTOR_PARAMETERS; +- +-typedef struct { +- FIXP_DBL origQuotaMean[INVF_SMOOTHING_LENGTH + 1]; +- FIXP_DBL sbrQuotaMean[INVF_SMOOTHING_LENGTH + 1]; +- FIXP_DBL origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH + 1]; +- FIXP_DBL sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH + 1]; +- +- FIXP_DBL origQuotaMeanFilt; +- FIXP_DBL sbrQuotaMeanFilt; +- FIXP_DBL origQuotaMeanStrongestFilt; +- FIXP_DBL sbrQuotaMeanStrongestFilt; +- +- FIXP_DBL origQuotaMax; +- FIXP_DBL sbrQuotaMax; +- +- FIXP_DBL avgNrg; +-} DETECTOR_VALUES; +- +-typedef struct { +- INT numberOfStrongest; +- +- INT prevRegionSbr[MAX_NUM_NOISE_VALUES]; +- INT prevRegionOrig[MAX_NUM_NOISE_VALUES]; +- +- INT freqBandTableInvFilt[MAX_NUM_NOISE_VALUES]; +- INT noDetectorBands; +- INT noDetectorBandsMax; +- +- const DETECTOR_PARAMETERS *detectorParams; +- +- INVF_MODE prevInvfMode[MAX_NUM_NOISE_VALUES]; +- DETECTOR_VALUES detectorValues[MAX_NUM_NOISE_VALUES]; +- +- FIXP_DBL nrgAvg; +- FIXP_DBL wmQmf[MAX_NUM_NOISE_VALUES]; +-} SBR_INV_FILT_EST; +- +-typedef SBR_INV_FILT_EST *HANDLE_SBR_INV_FILT_EST; +- +-void FDKsbrEnc_qmfInverseFilteringDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, +- FIXP_DBL **quotaMatrix, +- FIXP_DBL *nrgVector, +- SCHAR *indexVector, INT startIndex, +- INT stopIndex, INT transientFlag, +- INVF_MODE *infVec); +- +-INT FDKsbrEnc_initInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, +- INT *freqBandTableDetector, +- INT numDetectorBands, UINT useSpeechConfig); +- +-INT FDKsbrEnc_resetInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, +- INT *freqBandTableDetector, +- INT numDetectorBands); +- +-#endif /* _QMF_INV_FILT_H */ +diff --git a/libSBRenc/src/mh_det.cpp b/libSBRenc/src/mh_det.cpp +deleted file mode 100644 +index 2f3b386..0000000 +--- a/libSBRenc/src/mh_det.cpp ++++ /dev/null +@@ -1,1396 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "mh_det.h" +- +-#include "sbrenc_ram.h" +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-#define SFM_SHIFT 2 /* Attention: SFM_SCALE depends on SFM_SHIFT */ +-#define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT) /* 1.0 >> SFM_SHIFT */ +- +-/*!< Detector Parameters for AAC core codec. */ +-static const DETECTOR_PARAMETERS_MH paramsAac = { +- 9, /*!< deltaTime */ +- { +- FL2FXCONST_DBL(20.0f * RELAXATION_FLOAT), /*!< thresHoldDiff */ +- FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldDiffGuide */ +- FL2FXCONST_DBL(15.0f * RELAXATION_FLOAT), /*!< thresHoldTone */ +- FL2FXCONST_DBL((1.0f / 15.0f) * +- RELAXATION_FLOAT), /*!< invThresHoldTone */ +- FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldToneGuide */ +- FL2FXCONST_DBL(0.3f) >> SFM_SHIFT, /*!< sfmThresSbr */ +- FL2FXCONST_DBL(0.1f) >> SFM_SHIFT, /*!< sfmThresOrig */ +- FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ +- FL2FXCONST_DBL(0.5f), /*!< decayGuideDiff */ +- FL2FXCONST_DBL(-0.000112993269), +- /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ +- FL2FXCONST_DBL(-0.000112993269), +- /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ +- FL2FXCONST_DBL( +- -0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< +- derivThresAboveLD64 +- */ +- }, +- 50 /*!< maxComp */ +-}; +- +-/*!< Detector Parameters for AAC LD core codec. */ +-static const DETECTOR_PARAMETERS_MH paramsAacLd = { +- 16, /*!< Delta time. */ +- { +- FL2FXCONST_DBL(25.0f * RELAXATION_FLOAT), /*!< thresHoldDiff */ +- FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< tresHoldDiffGuide */ +- FL2FXCONST_DBL(15.0f * RELAXATION_FLOAT), /*!< thresHoldTone */ +- FL2FXCONST_DBL((1.0f / 15.0f) * +- RELAXATION_FLOAT), /*!< invThresHoldTone */ +- FL2FXCONST_DBL(1.26f * RELAXATION_FLOAT), /*!< thresHoldToneGuide */ +- FL2FXCONST_DBL(0.3f) >> SFM_SHIFT, /*!< sfmThresSbr */ +- FL2FXCONST_DBL(0.1f) >> SFM_SHIFT, /*!< sfmThresOrig */ +- FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ +- FL2FXCONST_DBL(0.2f), /*!< decayGuideDiff */ +- FL2FXCONST_DBL(-0.000112993269), +- /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ +- FL2FXCONST_DBL(-0.000112993269), +- /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ +- FL2FXCONST_DBL( +- -0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< +- derivThresAboveLD64 +- */ +- }, +- 50 /*!< maxComp */ +-}; +- +-/**************************************************************************/ +-/*! +- \brief Calculates the difference in tonality between original and SBR +- for a given time and frequency region. +- +- The values for pDiffMapped2Scfb are scaled by RELAXATION +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void diff(FIXP_DBL *RESTRICT pTonalityOrig, FIXP_DBL *pDiffMapped2Scfb, +- const UCHAR *RESTRICT pFreqBandTable, INT nScfb, +- SCHAR *indexVector) { +- UCHAR i, ll, lu, k; +- FIXP_DBL maxValOrig, maxValSbr, tmp; +- INT scale; +- +- for (i = 0; i < nScfb; i++) { +- ll = pFreqBandTable[i]; +- lu = pFreqBandTable[i + 1]; +- +- maxValOrig = FL2FXCONST_DBL(0.0f); +- maxValSbr = FL2FXCONST_DBL(0.0f); +- +- for (k = ll; k < lu; k++) { +- maxValOrig = fixMax(maxValOrig, pTonalityOrig[k]); +- maxValSbr = fixMax(maxValSbr, pTonalityOrig[indexVector[k]]); +- } +- +- if ((maxValSbr >= RELAXATION)) { +- tmp = fDivNorm(maxValOrig, maxValSbr, &scale); +- pDiffMapped2Scfb[i] = +- scaleValue(fMult(tmp, RELAXATION_FRACT), +- fixMax(-(DFRACT_BITS - 1), (scale - RELAXATION_SHIFT))); +- } else { +- pDiffMapped2Scfb[i] = maxValOrig; +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Calculates a flatness measure of the tonality measures. +- +- Calculation of the power function and using scalefactor for basis: +- Using log2: +- z = (2^k * x)^y; +- z' = CalcLd(z) = y*CalcLd(x) + y*k; +- z = CalcInvLd(z'); +- +- Using ld64: +- z = (2^k * x)^y; +- z' = CalcLd64(z) = y*CalcLd64(x)/64 + y*k/64; +- z = CalcInvLd64(z'); +- +- The values pSfmOrigVec and pSfmSbrVec are scaled by the factor 1/4.0 +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, SCHAR *indexVector, +- FIXP_DBL *pSfmOrigVec, +- FIXP_DBL *pSfmSbrVec, +- const UCHAR *pFreqBandTable, INT nSfb) { +- INT i, j; +- FIXP_DBL invBands, tmp1, tmp2; +- INT shiftFac0, shiftFacSum0; +- INT shiftFac1, shiftFacSum1; +- FIXP_DBL accu; +- +- for (i = 0; i < nSfb; i++) { +- INT ll = pFreqBandTable[i]; +- INT lu = pFreqBandTable[i + 1]; +- pSfmOrigVec[i] = (FIXP_DBL)(MAXVAL_DBL >> 2); +- pSfmSbrVec[i] = (FIXP_DBL)(MAXVAL_DBL >> 2); +- +- if (lu - ll > 1) { +- FIXP_DBL amOrig, amTransp, gmOrig, gmTransp, sfmOrig, sfmTransp; +- invBands = GetInvInt(lu - ll); +- shiftFacSum0 = 0; +- shiftFacSum1 = 0; +- amOrig = amTransp = FL2FXCONST_DBL(0.0f); +- gmOrig = gmTransp = (FIXP_DBL)MAXVAL_DBL; +- +- for (j = ll; j < lu; j++) { +- sfmOrig = pQuotaBuffer[j]; +- sfmTransp = pQuotaBuffer[indexVector[j]]; +- +- amOrig += fMult(sfmOrig, invBands); +- amTransp += fMult(sfmTransp, invBands); +- +- shiftFac0 = CountLeadingBits(sfmOrig); +- shiftFac1 = CountLeadingBits(sfmTransp); +- +- gmOrig = fMult(gmOrig, sfmOrig << shiftFac0); +- gmTransp = fMult(gmTransp, sfmTransp << shiftFac1); +- +- shiftFacSum0 += shiftFac0; +- shiftFacSum1 += shiftFac1; +- } +- +- if (gmOrig > FL2FXCONST_DBL(0.0f)) { +- tmp1 = CalcLdData(gmOrig); /* CalcLd64(x)/64 */ +- tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ +- +- /* y*k/64 */ +- accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS - 1 - 8); +- tmp2 = fMultDiv2(invBands, accu) << (2 + 1); +- +- tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ +- gmOrig = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ +- } else { +- gmOrig = FL2FXCONST_DBL(0.0f); +- } +- +- if (gmTransp > FL2FXCONST_DBL(0.0f)) { +- tmp1 = CalcLdData(gmTransp); /* CalcLd64(x)/64 */ +- tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ +- +- /* y*k/64 */ +- accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS - 1 - 8); +- tmp2 = fMultDiv2(invBands, accu) << (2 + 1); +- +- tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ +- gmTransp = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ +- } else { +- gmTransp = FL2FXCONST_DBL(0.0f); +- } +- if (amOrig != FL2FXCONST_DBL(0.0f)) +- pSfmOrigVec[i] = +- FDKsbrEnc_LSI_divide_scale_fract(gmOrig, amOrig, SFM_SCALE); +- +- if (amTransp != FL2FXCONST_DBL(0.0f)) +- pSfmSbrVec[i] = +- FDKsbrEnc_LSI_divide_scale_fract(gmTransp, amTransp, SFM_SCALE); +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Calculates the input to the missing harmonics detection. +- +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void calculateDetectorInput( +- FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Pointer to tonality matrix. */ +- SCHAR *RESTRICT indexVector, FIXP_DBL **RESTRICT tonalityDiff, +- FIXP_DBL **RESTRICT pSfmOrig, FIXP_DBL **RESTRICT pSfmSbr, +- const UCHAR *freqBandTable, INT nSfb, INT noEstPerFrame, INT move) { +- INT est; +- +- /* +- New estimate. +- */ +- for (est = 0; est < noEstPerFrame; est++) { +- diff(pQuotaBuffer[est + move], tonalityDiff[est + move], freqBandTable, +- nSfb, indexVector); +- +- calculateFlatnessMeasure(pQuotaBuffer[est + move], indexVector, +- pSfmOrig[est + move], pSfmSbr[est + move], +- freqBandTable, nSfb); +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Checks that the detection is not due to a LP filter +- +- This function determines if a newly detected missing harmonics is not +- in fact just a low-pass filtere input signal. If so, the detection is +- removed. +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, +- UCHAR **RESTRICT pDetectionVectors, +- INT start, INT stop, INT nSfb, +- const UCHAR *RESTRICT pFreqBandTable, +- FIXP_DBL *RESTRICT pNrgVector, +- THRES_HOLDS mhThresh) +- +-{ +- INT i, est; +- INT maxDerivPos = pFreqBandTable[nSfb]; +- INT numBands = pFreqBandTable[nSfb]; +- FIXP_DBL nrgLow, nrgHigh; +- FIXP_DBL nrgLD64, nrgLowLD64, nrgHighLD64, nrgDiffLD64; +- FIXP_DBL valLD64, maxValLD64, maxValAboveLD64; +- INT bLPsignal = 0; +- +- maxValLD64 = FL2FXCONST_DBL(-1.0f); +- for (i = numBands - 1 - 2; i > pFreqBandTable[0]; i--) { +- nrgLow = pNrgVector[i]; +- nrgHigh = pNrgVector[i + 2]; +- +- if (nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh) { +- nrgLowLD64 = CalcLdData(nrgLow >> 1); +- nrgDiffLD64 = CalcLdData((nrgLow >> 1) - (nrgHigh >> 1)); +- valLD64 = nrgDiffLD64 - nrgLowLD64; +- if (valLD64 > maxValLD64) { +- maxDerivPos = i; +- maxValLD64 = valLD64; +- } +- if (maxValLD64 > mhThresh.derivThresMaxLD64) { +- break; +- } +- } +- } +- +- /* Find the largest "gradient" above. (should be relatively flat, hence we +- expect a low value if the signal is LP.*/ +- maxValAboveLD64 = FL2FXCONST_DBL(-1.0f); +- for (i = numBands - 1 - 2; i > maxDerivPos + 2; i--) { +- nrgLow = pNrgVector[i]; +- nrgHigh = pNrgVector[i + 2]; +- +- if (nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh) { +- nrgLowLD64 = CalcLdData(nrgLow >> 1); +- nrgDiffLD64 = CalcLdData((nrgLow >> 1) - (nrgHigh >> 1)); +- valLD64 = nrgDiffLD64 - nrgLowLD64; +- if (valLD64 > maxValAboveLD64) { +- maxValAboveLD64 = valLD64; +- } +- } else { +- if (nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow) { +- nrgHighLD64 = CalcLdData(nrgHigh >> 1); +- nrgDiffLD64 = CalcLdData((nrgHigh >> 1) - (nrgLow >> 1)); +- valLD64 = nrgDiffLD64 - nrgHighLD64; +- if (valLD64 > maxValAboveLD64) { +- maxValAboveLD64 = valLD64; +- } +- } +- } +- } +- +- if (maxValLD64 > mhThresh.derivThresMaxLD64 && +- maxValAboveLD64 < mhThresh.derivThresAboveLD64) { +- bLPsignal = 1; +- +- for (i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0; i--) { +- if (pNrgVector[i] != FL2FXCONST_DBL(0.0f) && +- pNrgVector[i] > pNrgVector[maxDerivPos + 2]) { +- nrgDiffLD64 = CalcLdData((pNrgVector[i] >> 1) - +- (pNrgVector[maxDerivPos + 2] >> 1)); +- nrgLD64 = CalcLdData(pNrgVector[i] >> 1); +- valLD64 = nrgDiffLD64 - nrgLD64; +- if (valLD64 < mhThresh.derivThresBelowLD64) { +- bLPsignal = 0; +- break; +- } +- } else { +- bLPsignal = 0; +- break; +- } +- } +- } +- +- if (bLPsignal) { +- for (i = 0; i < nSfb; i++) { +- if (maxDerivPos >= pFreqBandTable[i] && +- maxDerivPos < pFreqBandTable[i + 1]) +- break; +- } +- +- if (pAddHarmSfb[i]) { +- pAddHarmSfb[i] = 0; +- for (est = start; est < stop; est++) { +- pDetectionVectors[est][i] = 0; +- } +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Checks if it is allowed to detect a missing tone, that wasn't +- detected previously. +- +- +- \return newDetectionAllowed flag. +- +-*/ +-/**************************************************************************/ +-static INT isDetectionOfNewToneAllowed( +- const SBR_FRAME_INFO *pFrameInfo, INT *pDetectionStartPos, +- INT noEstPerFrame, INT prevTransientFrame, INT prevTransientPos, +- INT prevTransientFlag, INT transientPosOffset, INT transientFlag, +- INT transientPos, INT deltaTime, +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) { +- INT transientFrame, newDetectionAllowed; +- +- /* Determine if this is a frame where a transient starts... +- * If the transient flag was set the previous frame but not the +- * transient frame flag, the transient frame flag is set in the current frame. +- *****************************************************************************/ +- transientFrame = 0; +- if (transientFlag) { +- if (transientPos + transientPosOffset < +- pFrameInfo->borders[pFrameInfo->nEnvelopes]) { +- transientFrame = 1; +- if (noEstPerFrame > 1) { +- if (transientPos + transientPosOffset > +- h_sbrMissingHarmonicsDetector->timeSlots >> 1) { +- *pDetectionStartPos = noEstPerFrame; +- } else { +- *pDetectionStartPos = noEstPerFrame >> 1; +- } +- +- } else { +- *pDetectionStartPos = noEstPerFrame; +- } +- } +- } else { +- if (prevTransientFlag && !prevTransientFrame) { +- transientFrame = 1; +- *pDetectionStartPos = 0; +- } +- } +- +- /* +- * Determine if detection of new missing harmonics are allowed. +- * If the frame contains a transient it's ok. If the previous +- * frame contained a transient it needs to be sufficiently close +- * to the start of the current frame. +- ****************************************************************/ +- newDetectionAllowed = 0; +- if (transientFrame) { +- newDetectionAllowed = 1; +- } else { +- if (prevTransientFrame && +- fixp_abs(pFrameInfo->borders[0] - +- (prevTransientPos + transientPosOffset - +- h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) { +- newDetectionAllowed = 1; +- *pDetectionStartPos = 0; +- } +- } +- +- h_sbrMissingHarmonicsDetector->previousTransientFlag = transientFlag; +- h_sbrMissingHarmonicsDetector->previousTransientFrame = transientFrame; +- h_sbrMissingHarmonicsDetector->previousTransientPos = transientPos; +- +- return (newDetectionAllowed); +-} +- +-/**************************************************************************/ +-/*! +- \brief Cleans up the detection after a transient. +- +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void transientCleanUp(FIXP_DBL **quotaBuffer, INT nSfb, +- UCHAR **detectionVectors, UCHAR *pAddHarmSfb, +- UCHAR *pPrevAddHarmSfb, INT **signBuffer, +- const UCHAR *pFreqBandTable, INT start, INT stop, +- INT newDetectionAllowed, FIXP_DBL *pNrgVector, +- THRES_HOLDS mhThresh) { +- INT i, j, est; +- +- for (est = start; est < stop; est++) { +- for (i = 0; i < nSfb; i++) { +- pAddHarmSfb[i] = pAddHarmSfb[i] || detectionVectors[est][i]; +- } +- } +- +- if (newDetectionAllowed == 1) { +- /* +- * Check for duplication of sines located +- * on the border of two scf-bands. +- *************************************************/ +- for (i = 0; i < nSfb - 1; i++) { +- /* detection in adjacent channels.*/ +- if (pAddHarmSfb[i] && pAddHarmSfb[i + 1]) { +- FIXP_DBL maxVal1, maxVal2; +- INT maxPos1, maxPos2, maxPosTime1, maxPosTime2; +- +- INT li = pFreqBandTable[i]; +- INT ui = pFreqBandTable[i + 1]; +- +- /* Find maximum tonality in the the two scf bands.*/ +- maxPosTime1 = start; +- maxPos1 = li; +- maxVal1 = quotaBuffer[start][li]; +- for (est = start; est < stop; est++) { +- for (j = li; j < ui; j++) { +- if (quotaBuffer[est][j] > maxVal1) { +- maxVal1 = quotaBuffer[est][j]; +- maxPos1 = j; +- maxPosTime1 = est; +- } +- } +- } +- +- li = pFreqBandTable[i + 1]; +- ui = pFreqBandTable[i + 2]; +- +- /* Find maximum tonality in the the two scf bands.*/ +- maxPosTime2 = start; +- maxPos2 = li; +- maxVal2 = quotaBuffer[start][li]; +- for (est = start; est < stop; est++) { +- for (j = li; j < ui; j++) { +- if (quotaBuffer[est][j] > maxVal2) { +- maxVal2 = quotaBuffer[est][j]; +- maxPos2 = j; +- maxPosTime2 = est; +- } +- } +- } +- +- /* If the maximum values are in adjacent QMF-channels, we need to remove +- the lowest of the two.*/ +- if (maxPos2 - maxPos1 < 2) { +- if (pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i + 1] == 0) { +- /* Keep the lower, remove the upper.*/ +- pAddHarmSfb[i + 1] = 0; +- for (est = start; est < stop; est++) { +- detectionVectors[est][i + 1] = 0; +- } +- } else { +- if (pPrevAddHarmSfb[i] == 0 && pPrevAddHarmSfb[i + 1] == 1) { +- /* Keep the upper, remove the lower.*/ +- pAddHarmSfb[i] = 0; +- for (est = start; est < stop; est++) { +- detectionVectors[est][i] = 0; +- } +- } else { +- /* If the maximum values are in adjacent QMF-channels, and if the +- signs indicate that it is the same sine, we need to remove the +- lowest of the two.*/ +- if (maxVal1 > maxVal2) { +- if (signBuffer[maxPosTime1][maxPos2] < 0 && +- signBuffer[maxPosTime1][maxPos1] > 0) { +- /* Keep the lower, remove the upper.*/ +- pAddHarmSfb[i + 1] = 0; +- for (est = start; est < stop; est++) { +- detectionVectors[est][i + 1] = 0; +- } +- } +- } else { +- if (signBuffer[maxPosTime2][maxPos2] < 0 && +- signBuffer[maxPosTime2][maxPos1] > 0) { +- /* Keep the upper, remove the lower.*/ +- pAddHarmSfb[i] = 0; +- for (est = start; est < stop; est++) { +- detectionVectors[est][i] = 0; +- } +- } +- } +- } +- } +- } +- } +- } +- +- /* Make sure that the detection is not the cut-off of a low pass filter. */ +- removeLowPassDetection(pAddHarmSfb, detectionVectors, start, stop, nSfb, +- pFreqBandTable, pNrgVector, mhThresh); +- } else { +- /* +- * If a missing harmonic wasn't missing the previous frame +- * the transient-flag needs to be set in order to be allowed to detect it. +- *************************************************************************/ +- for (i = 0; i < nSfb; i++) { +- if (pAddHarmSfb[i] - pPrevAddHarmSfb[i] > 0) pAddHarmSfb[i] = 0; +- } +- } +-} +- +-/*****************************************************************************/ +-/*! +- \brief Detection for one tonality estimate. +- +- This is the actual missing harmonics detection, using information from the +- previous detection. +- +- If a missing harmonic was detected (in a previous frame) due to too high +- tonality differences, but there was not enough tonality difference in the +- current frame, the detection algorithm still continues to trace the strongest +- tone in the scalefactor band (assuming that this is the tone that is going to +- be replaced in the decoder). This is done to avoid abrupt endings of sines +- fading out (e.g. in the glockenspiel). +- +- The function also tries to estimate where one sine is going to be replaced +- with multiple sines (due to the patching). This is done by comparing the +- tonality flatness measure of the original and the SBR signal. +- +- The function also tries to estimate (for the scalefactor bands only +- containing one qmf subband) when a strong tone in the original will be +- replaced by a strong tone in the adjacent QMF subband. +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void detection(FIXP_DBL *quotaBuffer, FIXP_DBL *pDiffVecScfb, INT nSfb, +- UCHAR *pHarmVec, const UCHAR *pFreqBandTable, +- FIXP_DBL *sfmOrig, FIXP_DBL *sfmSbr, +- GUIDE_VECTORS guideVectors, GUIDE_VECTORS newGuideVectors, +- THRES_HOLDS mhThresh) { +- INT i, j, ll, lu; +- FIXP_DBL thresTemp, thresOrig; +- +- /* +- * Do detection on the difference vector, i.e. the difference between +- * the original and the transposed. +- *********************************************************************/ +- for (i = 0; i < nSfb; i++) { +- thresTemp = (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) +- ? fMax(fMult(mhThresh.decayGuideDiff, +- guideVectors.guideVectorDiff[i]), +- mhThresh.thresHoldDiffGuide) +- : mhThresh.thresHoldDiff; +- +- thresTemp = fMin(thresTemp, mhThresh.thresHoldDiff); +- +- if (pDiffVecScfb[i] > thresTemp) { +- pHarmVec[i] = 1; +- newGuideVectors.guideVectorDiff[i] = pDiffVecScfb[i]; +- } else { +- /* If the guide wasn't zero, but the current level is to low, +- start tracking the decay on the tone in the original rather +- than the difference.*/ +- if (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) { +- guideVectors.guideVectorOrig[i] = mhThresh.thresHoldToneGuide; +- } +- } +- } +- +- /* +- * Trace tones in the original signal that at one point +- * have been detected because they will be replaced by +- * multiple tones in the sbr signal. +- ****************************************************/ +- +- for (i = 0; i < nSfb; i++) { +- ll = pFreqBandTable[i]; +- lu = pFreqBandTable[i + 1]; +- +- thresOrig = +- fixMax(fMult(guideVectors.guideVectorOrig[i], mhThresh.decayGuideOrig), +- mhThresh.thresHoldToneGuide); +- thresOrig = fixMin(thresOrig, mhThresh.thresHoldTone); +- +- if (guideVectors.guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)) { +- for (j = ll; j < lu; j++) { +- if (quotaBuffer[j] > thresOrig) { +- pHarmVec[i] = 1; +- newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; +- } +- } +- } +- } +- +- /* +- * Check for multiple sines in the transposed signal, +- * where there is only one in the original. +- ****************************************************/ +- thresOrig = mhThresh.thresHoldTone; +- +- for (i = 0; i < nSfb; i++) { +- ll = pFreqBandTable[i]; +- lu = pFreqBandTable[i + 1]; +- +- if (pHarmVec[i] == 0) { +- if (lu - ll > 1) { +- for (j = ll; j < lu; j++) { +- if (quotaBuffer[j] > thresOrig && +- (sfmSbr[i] > mhThresh.sfmThresSbr && +- sfmOrig[i] < mhThresh.sfmThresOrig)) { +- pHarmVec[i] = 1; +- newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; +- } +- } +- } else { +- if (i < nSfb - 1) { +- ll = pFreqBandTable[i]; +- +- if (i > 0) { +- if (quotaBuffer[ll] > mhThresh.thresHoldTone && +- (pDiffVecScfb[i + 1] < mhThresh.invThresHoldTone || +- pDiffVecScfb[i - 1] < mhThresh.invThresHoldTone)) { +- pHarmVec[i] = 1; +- newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; +- } +- } else { +- if (quotaBuffer[ll] > mhThresh.thresHoldTone && +- pDiffVecScfb[i + 1] < mhThresh.invThresHoldTone) { +- pHarmVec[i] = 1; +- newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; +- } +- } +- } +- } +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Do detection for every tonality estimate, using forward prediction. +- +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void detectionWithPrediction( +- FIXP_DBL **quotaBuffer, FIXP_DBL **pDiffVecScfb, INT **signBuffer, INT nSfb, +- const UCHAR *pFreqBandTable, FIXP_DBL **sfmOrig, FIXP_DBL **sfmSbr, +- UCHAR **detectionVectors, UCHAR *pPrevAddHarmSfb, +- GUIDE_VECTORS *guideVectors, INT noEstPerFrame, INT detectionStart, +- INT totNoEst, INT newDetectionAllowed, INT *pAddHarmFlag, +- UCHAR *pAddHarmSfb, FIXP_DBL *pNrgVector, +- const DETECTOR_PARAMETERS_MH *mhParams) { +- INT est = 0, i; +- INT start; +- +- FDKmemclear(pAddHarmSfb, nSfb * sizeof(UCHAR)); +- +- if (newDetectionAllowed) { +- /* Since we don't want to use the transient region for detection (since the +- tonality values tend to be a bit unreliable for this region) the +- guide-values are copied to the current starting point. */ +- if (totNoEst > 1) { +- start = detectionStart + 1; +- +- if (start != 0) { +- FDKmemcpy(guideVectors[start].guideVectorDiff, +- guideVectors[0].guideVectorDiff, nSfb * sizeof(FIXP_DBL)); +- FDKmemcpy(guideVectors[start].guideVectorOrig, +- guideVectors[0].guideVectorOrig, nSfb * sizeof(FIXP_DBL)); +- FDKmemclear(guideVectors[start - 1].guideVectorDetected, +- nSfb * sizeof(UCHAR)); +- } +- } else { +- start = 0; +- } +- } else { +- start = 0; +- } +- +- for (est = start; est < totNoEst; est++) { +- /* +- * Do detection on the current frame using +- * guide-info from the previous. +- *******************************************/ +- if (est > 0) { +- FDKmemcpy(guideVectors[est].guideVectorDetected, +- detectionVectors[est - 1], nSfb * sizeof(UCHAR)); +- } +- +- FDKmemclear(detectionVectors[est], nSfb * sizeof(UCHAR)); +- +- if (est < totNoEst - 1) { +- FDKmemclear(guideVectors[est + 1].guideVectorDiff, +- nSfb * sizeof(FIXP_DBL)); +- FDKmemclear(guideVectors[est + 1].guideVectorOrig, +- nSfb * sizeof(FIXP_DBL)); +- FDKmemclear(guideVectors[est + 1].guideVectorDetected, +- nSfb * sizeof(UCHAR)); +- +- detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, +- detectionVectors[est], pFreqBandTable, sfmOrig[est], +- sfmSbr[est], guideVectors[est], guideVectors[est + 1], +- mhParams->thresHolds); +- } else { +- FDKmemclear(guideVectors[est].guideVectorDiff, nSfb * sizeof(FIXP_DBL)); +- FDKmemclear(guideVectors[est].guideVectorOrig, nSfb * sizeof(FIXP_DBL)); +- FDKmemclear(guideVectors[est].guideVectorDetected, nSfb * sizeof(UCHAR)); +- +- detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, +- detectionVectors[est], pFreqBandTable, sfmOrig[est], +- sfmSbr[est], guideVectors[est], guideVectors[est], +- mhParams->thresHolds); +- } +- } +- +- /* Clean up the detection.*/ +- transientCleanUp(quotaBuffer, nSfb, detectionVectors, pAddHarmSfb, +- pPrevAddHarmSfb, signBuffer, pFreqBandTable, start, totNoEst, +- newDetectionAllowed, pNrgVector, mhParams->thresHolds); +- +- /* Set flag... */ +- *pAddHarmFlag = 0; +- for (i = 0; i < nSfb; i++) { +- if (pAddHarmSfb[i]) { +- *pAddHarmFlag = 1; +- break; +- } +- } +- +- FDKmemcpy(pPrevAddHarmSfb, pAddHarmSfb, nSfb * sizeof(UCHAR)); +- FDKmemcpy(guideVectors[0].guideVectorDetected, pAddHarmSfb, +- nSfb * sizeof(INT)); +- +- for (i = 0; i < nSfb; i++) { +- guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); +- guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); +- +- if (pAddHarmSfb[i] == 1) { +- /* If we had a detection use the guide-value in the next frame from the +- last estimate were the detection was done.*/ +- for (est = start; est < totNoEst; est++) { +- if (guideVectors[est].guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) { +- guideVectors[0].guideVectorDiff[i] = +- guideVectors[est].guideVectorDiff[i]; +- } +- if (guideVectors[est].guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)) { +- guideVectors[0].guideVectorOrig[i] = +- guideVectors[est].guideVectorOrig[i]; +- } +- } +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Calculates a compensation vector for the energy data. +- +- This function calculates a compensation vector for the energy data (i.e. +- envelope data) that is calculated elsewhere. This is since, one sine on +- the border of two scalefactor bands, will be replace by one sine in the +- middle of either scalefactor band. However, since the sine that is replaced +- will influence the energy estimate in both scalefactor bands (in the envelops +- calculation function) a compensation value is required in order to avoid +- noise substitution in the decoder next to the synthetic sine. +- +- \return none. +- +-*/ +-/**************************************************************************/ +-static void calculateCompVector(UCHAR *pAddHarmSfb, FIXP_DBL **pTonalityMatrix, +- INT **pSignMatrix, UCHAR *pEnvComp, INT nSfb, +- const UCHAR *freqBandTable, INT totNoEst, +- INT maxComp, UCHAR *pPrevEnvComp, +- INT newDetectionAllowed) { +- INT scfBand, est, l, ll, lu, maxPosF, maxPosT; +- FIXP_DBL maxVal; +- INT compValue; +- FIXP_DBL tmp; +- +- FDKmemclear(pEnvComp, nSfb * sizeof(UCHAR)); +- +- for (scfBand = 0; scfBand < nSfb; scfBand++) { +- if (pAddHarmSfb[scfBand]) { /* A missing sine was detected */ +- ll = freqBandTable[scfBand]; +- lu = freqBandTable[scfBand + 1]; +- +- maxPosF = 0; /* First find the maximum*/ +- maxPosT = 0; +- maxVal = FL2FXCONST_DBL(0.0f); +- +- for (est = 0; est < totNoEst; est++) { +- for (l = ll; l < lu; l++) { +- if (pTonalityMatrix[est][l] > maxVal) { +- maxVal = pTonalityMatrix[est][l]; +- maxPosF = l; +- maxPosT = est; +- } +- } +- } +- +- /* +- * If the maximum tonality is at the lower border of the +- * scalefactor band, we check the sign of the adjacent channels +- * to see if this sine is shared by the lower channel. If so, the +- * energy of the single sine will be present in two scalefactor bands +- * in the SBR data, which will cause problems in the decoder, when we +- * add a sine to just one of the channels. +- *********************************************************************/ +- if (maxPosF == ll && scfBand) { +- if (!pAddHarmSfb[scfBand - 1]) { /* No detection below*/ +- if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && +- pSignMatrix[maxPosT][maxPosF] < 0) { +- /* The comp value is calulated as the tonallity value, i.e we want +- to reduce the envelope data for this channel with as much as the +- tonality that is spread from the channel above. (ld64(RELAXATION) +- = 0.31143075889) */ +- tmp = fixp_abs( +- (FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + +- RELAXATION_LD64); +- tmp = (tmp >> (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1)) + +- (FIXP_DBL)1; /* shift one bit less for rounding */ +- compValue = ((INT)(LONG)tmp) >> 1; +- +- /* limit the comp-value*/ +- if (compValue > maxComp) compValue = maxComp; +- +- pEnvComp[scfBand - 1] = compValue; +- } +- } +- } +- +- /* +- * Same as above, but for the upper end of the scalefactor-band. +- ***************************************************************/ +- if (maxPosF == lu - 1 && scfBand + 1 < nSfb) { /* Upper border*/ +- if (!pAddHarmSfb[scfBand + 1]) { +- if (pSignMatrix[maxPosT][maxPosF] > 0 && +- pSignMatrix[maxPosT][maxPosF + 1] < 0) { +- tmp = fixp_abs( +- (FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + +- RELAXATION_LD64); +- tmp = (tmp >> (DFRACT_BITS - 1 - LD_DATA_SHIFT - 1)) + +- (FIXP_DBL)1; /* shift one bit less for rounding */ +- compValue = ((INT)(LONG)tmp) >> 1; +- +- if (compValue > maxComp) compValue = maxComp; +- +- pEnvComp[scfBand + 1] = compValue; +- } +- } +- } +- } +- } +- +- if (newDetectionAllowed == 0) { +- for (scfBand = 0; scfBand < nSfb; scfBand++) { +- if (pEnvComp[scfBand] != 0 && pPrevEnvComp[scfBand] == 0) +- pEnvComp[scfBand] = 0; +- } +- } +- +- /* remember the value for the next frame.*/ +- FDKmemcpy(pPrevEnvComp, pEnvComp, nSfb * sizeof(UCHAR)); +-} +- +-/**************************************************************************/ +-/*! +- \brief Detects where strong tonal components will be missing after +- HFR in the decoder. +- +- +- \return none. +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_SbrMissingHarmonicsDetectorQmf( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMHDet, FIXP_DBL **pQuotaBuffer, +- INT **pSignBuffer, SCHAR *indexVector, const SBR_FRAME_INFO *pFrameInfo, +- const UCHAR *pTranInfo, INT *pAddHarmonicsFlag, +- UCHAR *pAddHarmonicsScaleFactorBands, const UCHAR *freqBandTable, INT nSfb, +- UCHAR *envelopeCompensation, FIXP_DBL *pNrgVector) { +- INT transientFlag = pTranInfo[1]; +- INT transientPos = pTranInfo[0]; +- INT newDetectionAllowed; +- INT transientDetStart = 0; +- +- UCHAR **detectionVectors = h_sbrMHDet->detectionVectors; +- INT move = h_sbrMHDet->move; +- INT noEstPerFrame = h_sbrMHDet->noEstPerFrame; +- INT totNoEst = h_sbrMHDet->totNoEst; +- INT prevTransientFlag = h_sbrMHDet->previousTransientFlag; +- INT prevTransientFrame = h_sbrMHDet->previousTransientFrame; +- INT transientPosOffset = h_sbrMHDet->transientPosOffset; +- INT prevTransientPos = h_sbrMHDet->previousTransientPos; +- GUIDE_VECTORS *guideVectors = h_sbrMHDet->guideVectors; +- INT deltaTime = h_sbrMHDet->mhParams->deltaTime; +- INT maxComp = h_sbrMHDet->mhParams->maxComp; +- +- int est; +- +- /* +- Buffer values. +- */ +- FDK_ASSERT(move <= (MAX_NO_OF_ESTIMATES >> 1)); +- FDK_ASSERT(noEstPerFrame <= (MAX_NO_OF_ESTIMATES >> 1)); +- +- FIXP_DBL *sfmSbr[MAX_NO_OF_ESTIMATES]; +- FIXP_DBL *sfmOrig[MAX_NO_OF_ESTIMATES]; +- FIXP_DBL *tonalityDiff[MAX_NO_OF_ESTIMATES]; +- +- for (est = 0; est < MAX_NO_OF_ESTIMATES / 2; est++) { +- sfmSbr[est] = h_sbrMHDet->sfmSbr[est]; +- sfmOrig[est] = h_sbrMHDet->sfmOrig[est]; +- tonalityDiff[est] = h_sbrMHDet->tonalityDiff[est]; +- } +- +- C_ALLOC_SCRATCH_START(_scratch, FIXP_DBL, +- 3 * MAX_NO_OF_ESTIMATES / 2 * MAX_FREQ_COEFFS) +- FIXP_DBL *scratch = _scratch; +- for (; est < MAX_NO_OF_ESTIMATES; est++) { +- sfmSbr[est] = scratch; +- scratch += MAX_FREQ_COEFFS; +- sfmOrig[est] = scratch; +- scratch += MAX_FREQ_COEFFS; +- tonalityDiff[est] = scratch; +- scratch += MAX_FREQ_COEFFS; +- } +- +- /* Determine if we're allowed to detect "missing harmonics" that wasn't +- detected before. In order to be allowed to do new detection, there must be +- a transient in the current frame, or a transient in the previous frame +- sufficiently close to the current frame. */ +- newDetectionAllowed = isDetectionOfNewToneAllowed( +- pFrameInfo, &transientDetStart, noEstPerFrame, prevTransientFrame, +- prevTransientPos, prevTransientFlag, transientPosOffset, transientFlag, +- transientPos, deltaTime, h_sbrMHDet); +- +- /* Calulate the variables that will be used subsequently for the actual +- * detection */ +- calculateDetectorInput(pQuotaBuffer, indexVector, tonalityDiff, sfmOrig, +- sfmSbr, freqBandTable, nSfb, noEstPerFrame, move); +- +- /* Do the actual detection using information from previous detections */ +- detectionWithPrediction(pQuotaBuffer, tonalityDiff, pSignBuffer, nSfb, +- freqBandTable, sfmOrig, sfmSbr, detectionVectors, +- h_sbrMHDet->guideScfb, guideVectors, noEstPerFrame, +- transientDetStart, totNoEst, newDetectionAllowed, +- pAddHarmonicsFlag, pAddHarmonicsScaleFactorBands, +- pNrgVector, h_sbrMHDet->mhParams); +- +- /* Calculate the comp vector, so that the energy can be +- compensated for a sine between two QMF-bands. */ +- calculateCompVector(pAddHarmonicsScaleFactorBands, pQuotaBuffer, pSignBuffer, +- envelopeCompensation, nSfb, freqBandTable, totNoEst, +- maxComp, h_sbrMHDet->prevEnvelopeCompensation, +- newDetectionAllowed); +- +- for (est = 0; est < move; est++) { +- FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], +- sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], +- sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], +- sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- } +- C_ALLOC_SCRATCH_END(_scratch, FIXP_DBL, +- 3 * MAX_NO_OF_ESTIMATES / 2 * MAX_FREQ_COEFFS) +-} +- +-/**************************************************************************/ +-/*! +- \brief Initialize an instance of the missing harmonics detector. +- +- +- \return errorCode, noError if OK. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_CreateSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT chan) { +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; +- INT i; +- +- UCHAR *detectionVectors = GetRam_Sbr_detectionVectors(chan); +- UCHAR *guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); +- FIXP_DBL *guideVectorDiff = GetRam_Sbr_guideVectorDiff(chan); +- FIXP_DBL *guideVectorOrig = GetRam_Sbr_guideVectorOrig(chan); +- +- FDKmemclear(hs, sizeof(SBR_MISSING_HARMONICS_DETECTOR)); +- +- hs->prevEnvelopeCompensation = GetRam_Sbr_prevEnvelopeCompensation(chan); +- hs->guideScfb = GetRam_Sbr_guideScfb(chan); +- +- if ((NULL == detectionVectors) || (NULL == guideVectorDetected) || +- (NULL == guideVectorDiff) || (NULL == guideVectorOrig) || +- (NULL == hs->prevEnvelopeCompensation) || (NULL == hs->guideScfb)) { +- goto bail; +- } +- +- for (i = 0; i < MAX_NO_OF_ESTIMATES; i++) { +- hs->guideVectors[i].guideVectorDiff = +- guideVectorDiff + (i * MAX_FREQ_COEFFS); +- hs->guideVectors[i].guideVectorOrig = +- guideVectorOrig + (i * MAX_FREQ_COEFFS); +- hs->detectionVectors[i] = detectionVectors + (i * MAX_FREQ_COEFFS); +- hs->guideVectors[i].guideVectorDetected = +- guideVectorDetected + (i * MAX_FREQ_COEFFS); +- } +- +- return 0; +- +-bail: +- hs->guideVectors[0].guideVectorDiff = guideVectorDiff; +- hs->guideVectors[0].guideVectorOrig = guideVectorOrig; +- hs->detectionVectors[0] = detectionVectors; +- hs->guideVectors[0].guideVectorDetected = guideVectorDetected; +- +- FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(hs); +- return -1; +-} +- +-/**************************************************************************/ +-/*! +- \brief Initialize an instance of the missing harmonics detector. +- +- +- \return errorCode, noError if OK. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_InitSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT sampleFreq, +- INT frameSize, INT nSfb, INT qmfNoChannels, INT totNoEst, INT move, +- INT noEstPerFrame, UINT sbrSyntaxFlags) { +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; +- int i; +- +- FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); +- +- if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- switch (frameSize) { +- case 1024: +- case 512: +- hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; +- hs->timeSlots = 16; +- break; +- case 960: +- case 480: +- hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; +- hs->timeSlots = 15; +- break; +- default: +- return -1; +- } +- } else { +- switch (frameSize) { +- case 2048: +- case 1024: +- hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048; +- hs->timeSlots = NUMBER_TIME_SLOTS_2048; +- break; +- case 1920: +- case 960: +- hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920; +- hs->timeSlots = NUMBER_TIME_SLOTS_1920; +- break; +- default: +- return -1; +- } +- } +- +- if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- hs->mhParams = ¶msAacLd; +- } else +- hs->mhParams = ¶msAac; +- +- hs->qmfNoChannels = qmfNoChannels; +- hs->sampleFreq = sampleFreq; +- hs->nSfb = nSfb; +- +- hs->totNoEst = totNoEst; +- hs->move = move; +- hs->noEstPerFrame = noEstPerFrame; +- +- for (i = 0; i < totNoEst; i++) { +- FDKmemclear(hs->guideVectors[i].guideVectorDiff, +- sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->guideVectors[i].guideVectorOrig, +- sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->detectionVectors[i], sizeof(UCHAR) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->guideVectors[i].guideVectorDetected, +- sizeof(UCHAR) * MAX_FREQ_COEFFS); +- } +- +- // for(i=0; itonalityDiff[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->sfmOrig[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->sfmSbr[i], sizeof(FIXP_DBL) * MAX_FREQ_COEFFS); +- } +- +- FDKmemclear(hs->prevEnvelopeCompensation, sizeof(UCHAR) * MAX_FREQ_COEFFS); +- FDKmemclear(hs->guideScfb, sizeof(UCHAR) * MAX_FREQ_COEFFS); +- +- hs->previousTransientFlag = 0; +- hs->previousTransientFrame = 0; +- hs->previousTransientPos = 0; +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief Deletes an instance of the missing harmonics detector. +- +- +- \return none. +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_DeleteSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) { +- if (hSbrMHDet) { +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; +- +- FreeRam_Sbr_detectionVectors(&hs->detectionVectors[0]); +- FreeRam_Sbr_guideVectorDetected(&hs->guideVectors[0].guideVectorDetected); +- FreeRam_Sbr_guideVectorDiff(&hs->guideVectors[0].guideVectorDiff); +- FreeRam_Sbr_guideVectorOrig(&hs->guideVectors[0].guideVectorOrig); +- FreeRam_Sbr_prevEnvelopeCompensation(&hs->prevEnvelopeCompensation); +- FreeRam_Sbr_guideScfb(&hs->guideScfb); +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Resets an instance of the missing harmonics detector. +- +- +- \return error code, noError if OK. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_ResetSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, +- INT nSfb) { +- int i; +- FIXP_DBL tempGuide[MAX_FREQ_COEFFS]; +- UCHAR tempGuideInt[MAX_FREQ_COEFFS]; +- INT nSfbPrev; +- +- nSfbPrev = hSbrMissingHarmonicsDetector->nSfb; +- hSbrMissingHarmonicsDetector->nSfb = nSfb; +- +- FDKmemcpy(tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, +- nSfbPrev * sizeof(UCHAR)); +- +- if (nSfb > nSfbPrev) { +- for (i = 0; i < (nSfb - nSfbPrev); i++) { +- hSbrMissingHarmonicsDetector->guideScfb[i] = 0; +- } +- +- for (i = 0; i < nSfbPrev; i++) { +- hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = +- tempGuideInt[i]; +- } +- } else { +- for (i = 0; i < nSfb; i++) { +- hSbrMissingHarmonicsDetector->guideScfb[i] = +- tempGuideInt[i + (nSfbPrev - nSfb)]; +- } +- } +- +- FDKmemcpy(tempGuide, +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, +- nSfbPrev * sizeof(FIXP_DBL)); +- +- if (nSfb > nSfbPrev) { +- for (i = 0; i < (nSfb - nSfbPrev); i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = +- FL2FXCONST_DBL(0.0f); +- } +- +- for (i = 0; i < nSfbPrev; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0] +- .guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; +- } +- } else { +- for (i = 0; i < nSfb; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = +- tempGuide[i + (nSfbPrev - nSfb)]; +- } +- } +- +- FDKmemcpy(tempGuide, +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, +- nSfbPrev * sizeof(FIXP_DBL)); +- +- if (nSfb > nSfbPrev) { +- for (i = 0; i < (nSfb - nSfbPrev); i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = +- FL2FXCONST_DBL(0.0f); +- } +- +- for (i = 0; i < nSfbPrev; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0] +- .guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; +- } +- } else { +- for (i = 0; i < nSfb; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = +- tempGuide[i + (nSfbPrev - nSfb)]; +- } +- } +- +- FDKmemcpy(tempGuideInt, +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, +- nSfbPrev * sizeof(UCHAR)); +- +- if (nSfb > nSfbPrev) { +- for (i = 0; i < (nSfb - nSfbPrev); i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = 0; +- } +- +- for (i = 0; i < nSfbPrev; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0] +- .guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; +- } +- } else { +- for (i = 0; i < nSfb; i++) { +- hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = +- tempGuideInt[i + (nSfbPrev - nSfb)]; +- } +- } +- +- FDKmemcpy(tempGuideInt, +- hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, +- nSfbPrev * sizeof(UCHAR)); +- +- if (nSfb > nSfbPrev) { +- for (i = 0; i < (nSfb - nSfbPrev); i++) { +- hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = 0; +- } +- +- for (i = 0; i < nSfbPrev; i++) { +- hSbrMissingHarmonicsDetector +- ->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; +- } +- } else { +- for (i = 0; i < nSfb; i++) { +- hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = +- tempGuideInt[i + (nSfbPrev - nSfb)]; +- } +- } +- +- return 0; +-} +diff --git a/libSBRenc/src/mh_det.h b/libSBRenc/src/mh_det.h +deleted file mode 100644 +index 89d81b5..0000000 +--- a/libSBRenc/src/mh_det.h ++++ /dev/null +@@ -1,204 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief missing harmonics detection header file $Revision: 92790 $ +-*/ +- +-#ifndef MH_DET_H +-#define MH_DET_H +- +-#include "sbr_encoder.h" +-#include "fram_gen.h" +- +-typedef struct { +- FIXP_DBL thresHoldDiff; /*!< threshold for tonality difference */ +- FIXP_DBL thresHoldDiffGuide; /*!< threshold for tonality difference for the +- guide */ +- FIXP_DBL thresHoldTone; /*!< threshold for tonality for a sine */ +- FIXP_DBL invThresHoldTone; +- FIXP_DBL thresHoldToneGuide; /*!< threshold for tonality for a sine for the +- guide */ +- FIXP_DBL sfmThresSbr; /*!< tonality flatness measure threshold for the SBR +- signal.*/ +- FIXP_DBL sfmThresOrig; /*!< tonality flatness measure threshold for the +- original signal.*/ +- FIXP_DBL decayGuideOrig; /*!< decay value of the tonality value of the guide +- for the tone. */ +- FIXP_DBL decayGuideDiff; /*!< decay value of the tonality value of the guide +- for the tonality difference. */ +- FIXP_DBL derivThresMaxLD64; /*!< threshold for detecting LP character in a +- signal. */ +- FIXP_DBL derivThresBelowLD64; /*!< threshold for detecting LP character in a +- signal. */ +- FIXP_DBL derivThresAboveLD64; /*!< threshold for detecting LP character in a +- signal. */ +-} THRES_HOLDS; +- +-typedef struct { +- INT deltaTime; /*!< maximum allowed transient distance (from frame border in +- number of qmf subband sample) for a frame to be considered a +- transient frame.*/ +- THRES_HOLDS thresHolds; /*!< the thresholds used for detection. */ +- INT maxComp; /*!< maximum alllowed compensation factor for the envelope data. +- */ +-} DETECTOR_PARAMETERS_MH; +- +-typedef struct { +- FIXP_DBL *guideVectorDiff; +- FIXP_DBL *guideVectorOrig; +- UCHAR *guideVectorDetected; +-} GUIDE_VECTORS; +- +-typedef struct { +- INT qmfNoChannels; +- INT nSfb; +- INT sampleFreq; +- INT previousTransientFlag; +- INT previousTransientFrame; +- INT previousTransientPos; +- +- INT noVecPerFrame; +- INT transientPosOffset; +- +- INT move; +- INT totNoEst; +- INT noEstPerFrame; +- INT timeSlots; +- +- UCHAR *guideScfb; +- UCHAR *prevEnvelopeCompensation; +- UCHAR *detectionVectors[MAX_NO_OF_ESTIMATES]; +- FIXP_DBL tonalityDiff[MAX_NO_OF_ESTIMATES / 2][MAX_FREQ_COEFFS]; +- FIXP_DBL sfmOrig[MAX_NO_OF_ESTIMATES / 2][MAX_FREQ_COEFFS]; +- FIXP_DBL sfmSbr[MAX_NO_OF_ESTIMATES / 2][MAX_FREQ_COEFFS]; +- const DETECTOR_PARAMETERS_MH *mhParams; +- GUIDE_VECTORS guideVectors[MAX_NO_OF_ESTIMATES]; +-} SBR_MISSING_HARMONICS_DETECTOR; +- +-typedef SBR_MISSING_HARMONICS_DETECTOR *HANDLE_SBR_MISSING_HARMONICS_DETECTOR; +- +-void FDKsbrEnc_SbrMissingHarmonicsDetectorQmf( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, +- FIXP_DBL **pQuotaBuffer, INT **pSignBuffer, SCHAR *indexVector, +- const SBR_FRAME_INFO *pFrameInfo, const UCHAR *pTranInfo, +- INT *pAddHarmonicsFlag, UCHAR *pAddHarmonicsScaleFactorBands, +- const UCHAR *freqBandTable, INT nSfb, UCHAR *envelopeCompensation, +- FIXP_DBL *pNrgVector); +- +-INT FDKsbrEnc_CreateSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT chan); +- +-INT FDKsbrEnc_InitSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, +- INT sampleFreq, INT frameSize, INT nSfb, INT qmfNoChannels, INT totNoEst, +- INT move, INT noEstPerFrame, UINT sbrSyntaxFlags); +- +-void FDKsbrEnc_DeleteSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector); +- +-INT FDKsbrEnc_ResetSbrMissingHarmonicsDetector( +- HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, +- INT nSfb); +- +-#endif +diff --git a/libSBRenc/src/nf_est.cpp b/libSBRenc/src/nf_est.cpp +deleted file mode 100644 +index 290ec35..0000000 +--- a/libSBRenc/src/nf_est.cpp ++++ /dev/null +@@ -1,612 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "nf_est.h" +- +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-/* smoothFilter[4] = {0.05857864376269f, 0.2f, 0.34142135623731f, 0.4f}; */ +-static const FIXP_DBL smoothFilter[4] = {0x077f813d, 0x19999995, 0x2bb3b1f5, +- 0x33333335}; +- +-/* static const INT smoothFilterLength = 4; */ +- +-static const FIXP_DBL QuantOffset = (INT)0xfc000000; /* ld64(0.25) */ +- +-#ifndef min +-#define min(a, b) (a < b ? a : b) +-#endif +- +-#ifndef max +-#define max(a, b) (a > b ? a : b) +-#endif +- +-#define NOISE_FLOOR_OFFSET_SCALING (4) +- +-/**************************************************************************/ +-/*! +- \brief The function applies smoothing to the noise levels. +- +- +- +- \return none +- +-*/ +-/**************************************************************************/ +-static void smoothingOfNoiseLevels( +- FIXP_DBL *NoiseLevels, /*!< pointer to noise-floor levels.*/ +- INT nEnvelopes, /*!< Number of noise floor envelopes.*/ +- INT noNoiseBands, /*!< Number of noise bands for every noise floor envelope. +- */ +- FIXP_DBL prevNoiseLevels[NF_SMOOTHING_LENGTH] +- [MAX_NUM_NOISE_VALUES], /*!< Previous noise floor +- envelopes. */ +- const FIXP_DBL * +- pSmoothFilter, /*!< filter used for smoothing the noise floor levels. */ +- INT transientFlag) /*!< flag indicating if a transient is present*/ +- +-{ +- INT i, band, env; +- FIXP_DBL accu; +- +- for (env = 0; env < nEnvelopes; env++) { +- if (transientFlag) { +- for (i = 0; i < NF_SMOOTHING_LENGTH; i++) { +- FDKmemcpy(prevNoiseLevels[i], NoiseLevels + env * noNoiseBands, +- noNoiseBands * sizeof(FIXP_DBL)); +- } +- } else { +- for (i = 1; i < NF_SMOOTHING_LENGTH; i++) { +- FDKmemcpy(prevNoiseLevels[i - 1], prevNoiseLevels[i], +- noNoiseBands * sizeof(FIXP_DBL)); +- } +- FDKmemcpy(prevNoiseLevels[NF_SMOOTHING_LENGTH - 1], +- NoiseLevels + env * noNoiseBands, +- noNoiseBands * sizeof(FIXP_DBL)); +- } +- +- for (band = 0; band < noNoiseBands; band++) { +- accu = FL2FXCONST_DBL(0.0f); +- for (i = 0; i < NF_SMOOTHING_LENGTH; i++) { +- accu += fMultDiv2(pSmoothFilter[i], prevNoiseLevels[i][band]); +- } +- FDK_ASSERT((band + env * noNoiseBands) < MAX_NUM_NOISE_VALUES); +- NoiseLevels[band + env * noNoiseBands] = accu << 1; +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Does the noise floor level estiamtion. +- +- The noiseLevel samples are scaled by the factor 0.25 +- +- \return none +- +-*/ +-/**************************************************************************/ +-static void qmfBasedNoiseFloorDetection( +- FIXP_DBL *noiseLevel, /*!< Pointer to vector to +- store the noise levels +- in.*/ +- FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the quota +- values of the original. */ +- SCHAR *indexVector, /*!< Index vector to obtain the +- patched data. */ +- INT startIndex, /*!< Start index. */ +- INT stopIndex, /*!< Stop index. */ +- INT startChannel, /*!< Start channel of the current +- noise floor band.*/ +- INT stopChannel, /*!< Stop channel of the current +- noise floor band. */ +- FIXP_DBL ana_max_level, /*!< Maximum level of the +- adaptive noise.*/ +- FIXP_DBL noiseFloorOffset, /*!< Noise floor offset. */ +- INT missingHarmonicFlag, /*!< Flag indicating if a +- strong tonal component +- is missing.*/ +- FIXP_DBL weightFac, /*!< Weightening factor for the +- difference between orig and sbr. +- */ +- INVF_MODE diffThres, /*!< Threshold value to control the +- inverse filtering decision.*/ +- INVF_MODE inverseFilteringLevel) /*!< Inverse filtering +- level of the current +- band.*/ +-{ +- INT scale, l, k; +- FIXP_DBL meanOrig = FL2FXCONST_DBL(0.0f), meanSbr = FL2FXCONST_DBL(0.0f), +- diff; +- FIXP_DBL invIndex = GetInvInt(stopIndex - startIndex); +- FIXP_DBL invChannel = GetInvInt(stopChannel - startChannel); +- FIXP_DBL accu; +- +- /* +- Calculate the mean value, over the current time segment, for the original, the +- HFR and the difference, over all channels in the current frequency range. +- */ +- +- if (missingHarmonicFlag == 1) { +- for (l = startChannel; l < stopChannel; l++) { +- /* tonalityOrig */ +- accu = FL2FXCONST_DBL(0.0f); +- for (k = startIndex; k < stopIndex; k++) { +- accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); +- } +- meanOrig = fixMax(meanOrig, (accu << 1)); +- +- /* tonalitySbr */ +- accu = FL2FXCONST_DBL(0.0f); +- for (k = startIndex; k < stopIndex; k++) { +- accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); +- } +- meanSbr = fixMax(meanSbr, (accu << 1)); +- } +- } else { +- for (l = startChannel; l < stopChannel; l++) { +- /* tonalityOrig */ +- accu = FL2FXCONST_DBL(0.0f); +- for (k = startIndex; k < stopIndex; k++) { +- accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); +- } +- meanOrig += fMult((accu << 1), invChannel); +- +- /* tonalitySbr */ +- accu = FL2FXCONST_DBL(0.0f); +- for (k = startIndex; k < stopIndex; k++) { +- accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); +- } +- meanSbr += fMult((accu << 1), invChannel); +- } +- } +- +- /* Small fix to avoid noise during silent passages.*/ +- if (meanOrig <= FL2FXCONST_DBL(0.000976562f * RELAXATION_FLOAT) && +- meanSbr <= FL2FXCONST_DBL(0.000976562f * RELAXATION_FLOAT)) { +- meanOrig = FL2FXCONST_DBL(101.5936673f * RELAXATION_FLOAT); +- meanSbr = FL2FXCONST_DBL(101.5936673f * RELAXATION_FLOAT); +- } +- +- meanOrig = fixMax(meanOrig, RELAXATION); +- meanSbr = fixMax(meanSbr, RELAXATION); +- +- if (missingHarmonicFlag == 1 || inverseFilteringLevel == INVF_MID_LEVEL || +- inverseFilteringLevel == INVF_LOW_LEVEL || +- inverseFilteringLevel == INVF_OFF || inverseFilteringLevel <= diffThres) { +- diff = RELAXATION; +- } else { +- accu = fDivNorm(meanSbr, meanOrig, &scale); +- +- diff = fixMax(RELAXATION, fMult(RELAXATION_FRACT, fMult(weightFac, accu)) >> +- (RELAXATION_SHIFT - scale)); +- } +- +- /* +- * noise Level is now a positive value, i.e. +- * the more harmonic the signal is the higher noise level, +- * this makes no sense so we change the sign. +- *********************************************************/ +- accu = fDivNorm(diff, meanOrig, &scale); +- scale -= 2; +- +- if ((scale > 0) && (accu > ((FIXP_DBL)MAXVAL_DBL) >> scale)) { +- *noiseLevel = (FIXP_DBL)MAXVAL_DBL; +- } else { +- *noiseLevel = scaleValue(accu, scale); +- } +- +- /* +- * Add a noise floor offset to compensate for bias in the detector +- *****************************************************************/ +- if (!missingHarmonicFlag) { +- *noiseLevel = fixMin(fMult(*noiseLevel, noiseFloorOffset), +- (FIXP_DBL)MAXVAL_DBL >> NOISE_FLOOR_OFFSET_SCALING) +- << NOISE_FLOOR_OFFSET_SCALING; +- } +- +- /* +- * check to see that we don't exceed the maximum allowed level +- **************************************************************/ +- *noiseLevel = +- fixMin(*noiseLevel, +- ana_max_level); /* ana_max_level is scaled with factor 0.25 */ +-} +- +-/**************************************************************************/ +-/*! +- \brief Does the noise floor level estiamtion. +- The function calls the Noisefloor estimation function +- for the time segments decided based upon the transient +- information. The block is always divided into one or two segments. +- +- +- \return none +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_sbrNoiseFloorEstimateQmf( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- const SBR_FRAME_INFO +- *frame_info, /*!< Time frequency grid of the current frame. */ +- FIXP_DBL +- *noiseLevels, /*!< Pointer to vector to store the noise levels in.*/ +- FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the quota values of the +- original. */ +- SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ +- INT missingHarmonicsFlag, /*!< Flag indicating if a strong tonal component +- will be missing. */ +- INT startIndex, /*!< Start index. */ +- UINT numberOfEstimatesPerFrame, /*!< The number of tonality estimates per +- frame. */ +- int transientFrame, /*!< A flag indicating if a transient is present. */ +- INVF_MODE *pInvFiltLevels, /*!< Pointer to the vector holding the inverse +- filtering levels. */ +- UINT sbrSyntaxFlags) +- +-{ +- INT nNoiseEnvelopes, startPos[2], stopPos[2], env, band; +- +- INT noNoiseBands = h_sbrNoiseFloorEstimate->noNoiseBands; +- INT *freqBandTable = h_sbrNoiseFloorEstimate->freqBandTableQmf; +- +- nNoiseEnvelopes = frame_info->nNoiseEnvelopes; +- +- startPos[0] = startIndex; +- +- if (nNoiseEnvelopes == 1) { +- stopPos[0] = startIndex + min(numberOfEstimatesPerFrame, 2); +- } else { +- stopPos[0] = startIndex + 1; +- startPos[1] = startIndex + 1; +- stopPos[1] = startIndex + min(numberOfEstimatesPerFrame, 2); +- } +- +- /* +- * Estimate the noise floor. +- **************************************/ +- for (env = 0; env < nNoiseEnvelopes; env++) { +- for (band = 0; band < noNoiseBands; band++) { +- FDK_ASSERT((band + env * noNoiseBands) < MAX_NUM_NOISE_VALUES); +- qmfBasedNoiseFloorDetection( +- &noiseLevels[band + env * noNoiseBands], quotaMatrixOrig, indexVector, +- startPos[env], stopPos[env], freqBandTable[band], +- freqBandTable[band + 1], h_sbrNoiseFloorEstimate->ana_max_level, +- h_sbrNoiseFloorEstimate->noiseFloorOffset[band], missingHarmonicsFlag, +- h_sbrNoiseFloorEstimate->weightFac, +- h_sbrNoiseFloorEstimate->diffThres, pInvFiltLevels[band]); +- } +- } +- +- /* +- * Smoothing of the values. +- **************************/ +- smoothingOfNoiseLevels(noiseLevels, nNoiseEnvelopes, +- h_sbrNoiseFloorEstimate->noNoiseBands, +- h_sbrNoiseFloorEstimate->prevNoiseLevels, +- h_sbrNoiseFloorEstimate->smoothFilter, transientFrame); +- +- /* quantisation*/ +- for (env = 0; env < nNoiseEnvelopes; env++) { +- for (band = 0; band < noNoiseBands; band++) { +- FDK_ASSERT((band + env * noNoiseBands) < MAX_NUM_NOISE_VALUES); +- noiseLevels[band + env * noNoiseBands] = +- (FIXP_DBL)NOISE_FLOOR_OFFSET_64 - +- (FIXP_DBL)CalcLdData(noiseLevels[band + env * noNoiseBands] + +- (FIXP_DBL)1) + +- QuantOffset; +- } +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief +- +- +- \return errorCode, noError if successful +- +-*/ +-/**************************************************************************/ +-static INT downSampleLoRes(INT *v_result, /*!< */ +- INT num_result, /*!< */ +- const UCHAR *freqBandTableRef, /*!< */ +- INT num_Ref) /*!< */ +-{ +- INT step; +- INT i, j; +- INT org_length, result_length; +- INT v_index[MAX_FREQ_COEFFS / 2]; +- +- /* init */ +- org_length = num_Ref; +- result_length = num_result; +- +- v_index[0] = 0; /* Always use left border */ +- i = 0; +- while (org_length > 0) /* Create downsample vector */ +- { +- i++; +- step = org_length / result_length; /* floor; */ +- org_length = org_length - step; +- result_length--; +- v_index[i] = v_index[i - 1] + step; +- } +- +- if (i != num_result) /* Should never happen */ +- return (1); /* error downsampling */ +- +- for (j = 0; j <= i; +- j++) /* Use downsample vector to index LoResolution vector. */ +- { +- v_result[j] = freqBandTableRef[v_index[j]]; +- } +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief Initialize an instance of the noise floor level estimation module. +- +- +- \return errorCode, noError if successful +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_InitSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- INT ana_max_level, /*!< Maximum level of the adaptive noise. */ +- const UCHAR *freqBandTable, /*!< Frequency band table. */ +- INT nSfb, /*!< Number of frequency bands. */ +- INT noiseBands, /*!< Number of noise bands per octave. */ +- INT noiseFloorOffset, /*!< Noise floor offset. */ +- INT timeSlots, /*!< Number of time slots in a frame. */ +- UINT useSpeechConfig /*!< Flag: adapt tuning parameters according to speech +- */ +-) { +- INT i, qexp, qtmp; +- FIXP_DBL tmp, exp; +- +- FDKmemclear(h_sbrNoiseFloorEstimate, sizeof(SBR_NOISE_FLOOR_ESTIMATE)); +- +- h_sbrNoiseFloorEstimate->smoothFilter = smoothFilter; +- if (useSpeechConfig) { +- h_sbrNoiseFloorEstimate->weightFac = (FIXP_DBL)MAXVAL_DBL; +- h_sbrNoiseFloorEstimate->diffThres = INVF_LOW_LEVEL; +- } else { +- h_sbrNoiseFloorEstimate->weightFac = FL2FXCONST_DBL(0.25f); +- h_sbrNoiseFloorEstimate->diffThres = INVF_MID_LEVEL; +- } +- +- h_sbrNoiseFloorEstimate->timeSlots = timeSlots; +- h_sbrNoiseFloorEstimate->noiseBands = noiseBands; +- +- /* h_sbrNoiseFloorEstimate->ana_max_level is scaled by 0.25 */ +- switch (ana_max_level) { +- case 6: +- h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; +- break; +- case 3: +- h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.5); +- break; +- case -3: +- h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.125); +- break; +- default: +- /* Should not enter here */ +- h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; +- break; +- } +- +- /* +- calculate number of noise bands and allocate +- */ +- if (FDKsbrEnc_resetSbrNoiseFloorEstimate(h_sbrNoiseFloorEstimate, +- freqBandTable, nSfb)) +- return (1); +- +- if (noiseFloorOffset == 0) { +- tmp = ((FIXP_DBL)MAXVAL_DBL) >> NOISE_FLOOR_OFFSET_SCALING; +- } else { +- /* noiseFloorOffset has to be smaller than 12, because +- the result of the calculation below must be smaller than 1: +- (2^(noiseFloorOffset/3))*2^4<1 */ +- FDK_ASSERT(noiseFloorOffset < 12); +- +- /* Assumes the noise floor offset in tuning table are in q31 */ +- /* Change the qformat here when non-zero values would be filled */ +- exp = fDivNorm((FIXP_DBL)noiseFloorOffset, 3, &qexp); +- tmp = fPow(2, DFRACT_BITS - 1, exp, qexp, &qtmp); +- tmp = scaleValue(tmp, qtmp - NOISE_FLOOR_OFFSET_SCALING); +- } +- +- for (i = 0; i < h_sbrNoiseFloorEstimate->noNoiseBands; i++) { +- h_sbrNoiseFloorEstimate->noiseFloorOffset[i] = tmp; +- } +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief Resets the current instance of the noise floor estiamtion +- module. +- +- +- \return errorCode, noError if successful +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_resetSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- const UCHAR *freqBandTable, /*!< Frequency band table. */ +- INT nSfb /*!< Number of bands in the frequency band table. */ +-) { +- INT k2, kx; +- +- /* +- * Calculate number of noise bands +- ***********************************/ +- k2 = freqBandTable[nSfb]; +- kx = freqBandTable[0]; +- if (h_sbrNoiseFloorEstimate->noiseBands == 0) { +- h_sbrNoiseFloorEstimate->noNoiseBands = 1; +- } else { +- /* +- * Calculate number of noise bands 1,2 or 3 bands/octave +- ********************************************************/ +- FIXP_DBL tmp, ratio, lg2; +- INT ratio_e, qlg2, nNoiseBands; +- +- ratio = fDivNorm(k2, kx, &ratio_e); +- lg2 = fLog2(ratio, ratio_e, &qlg2); +- tmp = fMult((FIXP_DBL)(h_sbrNoiseFloorEstimate->noiseBands << 24), lg2); +- tmp = scaleValue(tmp, qlg2 - 23); +- +- nNoiseBands = (INT)((tmp + (FIXP_DBL)1) >> 1); +- +- if (nNoiseBands > MAX_NUM_NOISE_COEFFS) { +- nNoiseBands = MAX_NUM_NOISE_COEFFS; +- } +- +- if (nNoiseBands == 0) { +- nNoiseBands = 1; +- } +- +- h_sbrNoiseFloorEstimate->noNoiseBands = nNoiseBands; +- } +- +- return (downSampleLoRes(h_sbrNoiseFloorEstimate->freqBandTableQmf, +- h_sbrNoiseFloorEstimate->noNoiseBands, freqBandTable, +- nSfb)); +-} +- +-/**************************************************************************/ +-/*! +- \brief Deletes the current instancce of the noise floor level +- estimation module. +- +- +- \return none +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_deleteSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate) /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +-{ +- if (h_sbrNoiseFloorEstimate) { +- /* +- nothing to do +- */ +- } +-} +diff --git a/libSBRenc/src/nf_est.h b/libSBRenc/src/nf_est.h +deleted file mode 100644 +index c2f16e9..0000000 +--- a/libSBRenc/src/nf_est.h ++++ /dev/null +@@ -1,185 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Noise floor estimation structs and prototypes $Revision: 92790 $ +-*/ +- +-#ifndef NF_EST_H +-#define NF_EST_H +- +-#include "sbr_encoder.h" +-#include "fram_gen.h" +- +-#define NF_SMOOTHING_LENGTH 4 /*!< Smoothing length of the noise floors. */ +- +-typedef struct { +- FIXP_DBL +- prevNoiseLevels[NF_SMOOTHING_LENGTH] +- [MAX_NUM_NOISE_VALUES]; /*!< The previous noise levels. */ +- FIXP_DBL noiseFloorOffset +- [MAX_NUM_NOISE_VALUES]; /*!< Noise floor offset, scaled with +- NOISE_FLOOR_OFFSET_SCALING */ +- const FIXP_DBL *smoothFilter; /*!< Smoothing filter to use. */ +- FIXP_DBL ana_max_level; /*!< Max level allowed. */ +- FIXP_DBL weightFac; /*!< Weightening factor for the difference between orig +- and sbr. */ +- INT freqBandTableQmf[MAX_NUM_NOISE_VALUES + +- 1]; /*!< Frequncy band table for the noise floor bands.*/ +- INT noNoiseBands; /*!< Number of noisebands. */ +- INT noiseBands; /*!< NoiseBands switch 4 bit.*/ +- INT timeSlots; /*!< Number of timeslots in a frame. */ +- INVF_MODE diffThres; /*!< Threshold value to control the inverse filtering +- decision */ +-} SBR_NOISE_FLOOR_ESTIMATE; +- +-typedef SBR_NOISE_FLOOR_ESTIMATE *HANDLE_SBR_NOISE_FLOOR_ESTIMATE; +- +-void FDKsbrEnc_sbrNoiseFloorEstimateQmf( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- const SBR_FRAME_INFO +- *frame_info, /*!< Time frequency grid of the current frame. */ +- FIXP_DBL +- *noiseLevels, /*!< Pointer to vector to store the noise levels in.*/ +- FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the quota values of the +- original. */ +- SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ +- INT missingHarmonicsFlag, /*!< Flag indicating if a strong tonal component +- will be missing. */ +- INT startIndex, /*!< Start index. */ +- UINT numberOfEstimatesPerFrame, /*!< The number of tonality estimates per +- frame. */ +- INT transientFrame, /*!< A flag indicating if a transient is present. */ +- INVF_MODE *pInvFiltLevels, /*!< Pointer to the vector holding the inverse +- filtering levels. */ +- UINT sbrSyntaxFlags); +- +-INT FDKsbrEnc_InitSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- INT ana_max_level, /*!< Maximum level of the adaptive noise. */ +- const UCHAR *freqBandTable, /*!< Frequany band table. */ +- INT nSfb, /*!< Number of frequency bands. */ +- INT noiseBands, /*!< Number of noise bands per octave. */ +- INT noiseFloorOffset, /*!< Noise floor offset. */ +- INT timeSlots, /*!< Number of time slots in a frame. */ +- UINT useSpeechConfig /*!< Flag: adapt tuning parameters according to speech +- */ +-); +- +-INT FDKsbrEnc_resetSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- const UCHAR *freqBandTable, /*!< Frequany band table. */ +- INT nSfb); /*!< Number of bands in the frequency band table. */ +- +-void FDKsbrEnc_deleteSbrNoiseFloorEstimate( +- HANDLE_SBR_NOISE_FLOOR_ESTIMATE +- h_sbrNoiseFloorEstimate); /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct +- */ +- +-#endif +diff --git a/libSBRenc/src/ps_bitenc.cpp b/libSBRenc/src/ps_bitenc.cpp +deleted file mode 100644 +index e30af2a..0000000 +--- a/libSBRenc/src/ps_bitenc.cpp ++++ /dev/null +@@ -1,624 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): N. Rettelbach +- +- Description: Parametric Stereo bitstream encoder +- +-*******************************************************************************/ +- +-#include "ps_bitenc.h" +- +-#include "ps_main.h" +- +-static inline UCHAR FDKsbrEnc_WriteBits_ps(HANDLE_FDK_BITSTREAM hBitStream, +- UINT value, +- const UINT numberOfBits) { +- /* hBitStream == NULL happens here intentionally */ +- if (hBitStream != NULL) { +- FDKwriteBits(hBitStream, value, numberOfBits); +- } +- return numberOfBits; +-} +- +-#define SI_SBR_EXTENSION_SIZE_BITS 4 +-#define SI_SBR_EXTENSION_ESC_COUNT_BITS 8 +-#define SI_SBR_EXTENSION_ID_BITS 2 +-#define EXTENSION_ID_PS_CODING 2 +-#define PS_EXT_ID_V0 0 +- +-static const INT iidDeltaCoarse_Offset = 14; +-static const INT iidDeltaCoarse_MaxVal = 28; +-static const INT iidDeltaFine_Offset = 30; +-static const INT iidDeltaFine_MaxVal = 60; +- +-/* PS Stereo Huffmantable: iidDeltaFreqCoarse */ +-static const UINT iidDeltaFreqCoarse_Length[] = { +- 17, 17, 17, 17, 16, 15, 13, 10, 9, 7, 6, 5, 4, 3, 1, +- 3, 4, 5, 6, 6, 8, 11, 13, 14, 14, 15, 17, 18, 18}; +-static const UINT iidDeltaFreqCoarse_Code[] = { +- 0x0001fffb, 0x0001fffc, 0x0001fffd, 0x0001fffa, 0x0000fffc, 0x00007ffc, +- 0x00001ffd, 0x000003fe, 0x000001fe, 0x0000007e, 0x0000003c, 0x0000001d, +- 0x0000000d, 0x00000005, 0000000000, 0x00000004, 0x0000000c, 0x0000001c, +- 0x0000003d, 0x0000003e, 0x000000fe, 0x000007fe, 0x00001ffc, 0x00003ffc, +- 0x00003ffd, 0x00007ffd, 0x0001fffe, 0x0003fffe, 0x0003ffff}; +- +-/* PS Stereo Huffmantable: iidDeltaFreqFine */ +-static const UINT iidDeltaFreqFine_Length[] = { +- 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 18, 17, 17, 16, 16, 15, +- 14, 14, 13, 12, 12, 11, 10, 10, 8, 7, 6, 5, 4, 3, 1, 3, +- 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, +- 17, 17, 18, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18}; +-static const UINT iidDeltaFreqFine_Code[] = { +- 0x0001feb4, 0x0001feb5, 0x0001fd76, 0x0001fd77, 0x0001fd74, 0x0001fd75, +- 0x0001fe8a, 0x0001fe8b, 0x0001fe88, 0x0000fe80, 0x0001feb6, 0x0000fe82, +- 0x0000feb8, 0x00007f42, 0x00007fae, 0x00003faf, 0x00001fd1, 0x00001fe9, +- 0x00000fe9, 0x000007ea, 0x000007fb, 0x000003fb, 0x000001fb, 0x000001ff, +- 0x0000007c, 0x0000003c, 0x0000001c, 0x0000000c, 0000000000, 0x00000001, +- 0x00000001, 0x00000002, 0x00000001, 0x0000000d, 0x0000001d, 0x0000003d, +- 0x0000007d, 0x000000fc, 0x000001fc, 0x000003fc, 0x000003f4, 0x000007eb, +- 0x00000fea, 0x00001fea, 0x00001fd6, 0x00003fd0, 0x00007faf, 0x00007f43, +- 0x0000feb9, 0x0000fe83, 0x0001feb7, 0x0000fe81, 0x0001fe89, 0x0001fe8e, +- 0x0001fe8f, 0x0001fe8c, 0x0001fe8d, 0x0001feb2, 0x0001feb3, 0x0001feb0, +- 0x0001feb1}; +- +-/* PS Stereo Huffmantable: iidDeltaTimeCoarse */ +-static const UINT iidDeltaTimeCoarse_Length[] = { +- 19, 19, 19, 20, 20, 20, 17, 15, 12, 10, 8, 6, 4, 2, 1, +- 3, 5, 7, 9, 11, 13, 14, 17, 19, 20, 20, 20, 20, 20}; +-static const UINT iidDeltaTimeCoarse_Code[] = { +- 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9, 0x000ffffa, +- 0x0001fffd, 0x00007ffe, 0x00000ffe, 0x000003fe, 0x000000fe, 0x0000003e, +- 0x0000000e, 0x00000002, 0000000000, 0x00000006, 0x0000001e, 0x0000007e, +- 0x000001fe, 0x000007fe, 0x00001ffe, 0x00003ffe, 0x0001fffc, 0x0007fff8, +- 0x000ffffb, 0x000ffffc, 0x000ffffd, 0x000ffffe, 0x000fffff}; +- +-/* PS Stereo Huffmantable: iidDeltaTimeFine */ +-static const UINT iidDeltaTimeFine_Length[] = { +- 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, +- 14, 13, 13, 13, 12, 12, 11, 10, 9, 9, 7, 6, 5, 3, 1, 2, +- 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, +- 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; +-static const UINT iidDeltaTimeFine_Code[] = { +- 0x00004ed4, 0x00004ed5, 0x00004ece, 0x00004ecf, 0x00004ecc, 0x00004ed6, +- 0x00004ed8, 0x00004f46, 0x00004f60, 0x00002718, 0x00002719, 0x00002764, +- 0x00002765, 0x0000276d, 0x000027b1, 0x000013b7, 0x000013d6, 0x000009c7, +- 0x000009e9, 0x000009ed, 0x000004ee, 0x000004f7, 0x00000278, 0x00000139, +- 0x0000009a, 0x0000009f, 0x00000020, 0x00000011, 0x0000000a, 0x00000003, +- 0x00000001, 0000000000, 0x0000000b, 0x00000012, 0x00000021, 0x0000004c, +- 0x0000009b, 0x0000013a, 0x00000279, 0x00000270, 0x000004ef, 0x000004e2, +- 0x000009ea, 0x000009d8, 0x000013d7, 0x000013d0, 0x000027b2, 0x000027a2, +- 0x0000271a, 0x0000271b, 0x00004f66, 0x00004f67, 0x00004f61, 0x00004f47, +- 0x00004ed9, 0x00004ed7, 0x00004ecd, 0x00004ed2, 0x00004ed3, 0x00004ed0, +- 0x00004ed1}; +- +-static const INT iccDelta_Offset = 7; +-static const INT iccDelta_MaxVal = 14; +-/* PS Stereo Huffmantable: iccDeltaFreq */ +-static const UINT iccDeltaFreq_Length[] = {14, 14, 12, 10, 7, 5, 3, 1, +- 2, 4, 6, 8, 9, 11, 13}; +-static const UINT iccDeltaFreq_Code[] = { +- 0x00003fff, 0x00003ffe, 0x00000ffe, 0x000003fe, 0x0000007e, +- 0x0000001e, 0x00000006, 0000000000, 0x00000002, 0x0000000e, +- 0x0000003e, 0x000000fe, 0x000001fe, 0x000007fe, 0x00001ffe}; +- +-/* PS Stereo Huffmantable: iccDeltaTime */ +-static const UINT iccDeltaTime_Length[] = {14, 13, 11, 9, 7, 5, 3, 1, +- 2, 4, 6, 8, 10, 12, 14}; +-static const UINT iccDeltaTime_Code[] = { +- 0x00003ffe, 0x00001ffe, 0x000007fe, 0x000001fe, 0x0000007e, +- 0x0000001e, 0x00000006, 0000000000, 0x00000002, 0x0000000e, +- 0x0000003e, 0x000000fe, 0x000003fe, 0x00000ffe, 0x00003fff}; +- +-static const INT ipdDelta_Offset = 0; +-static const INT ipdDelta_MaxVal = 7; +-/* PS Stereo Huffmantable: ipdDeltaFreq */ +-static const UINT ipdDeltaFreq_Length[] = {1, 3, 4, 4, 4, 4, 4, 4}; +-static const UINT ipdDeltaFreq_Code[] = {0x00000001, 0000000000, 0x00000006, +- 0x00000004, 0x00000002, 0x00000003, +- 0x00000005, 0x00000007}; +- +-/* PS Stereo Huffmantable: ipdDeltaTime */ +-static const UINT ipdDeltaTime_Length[] = {1, 3, 4, 5, 5, 4, 4, 3}; +-static const UINT ipdDeltaTime_Code[] = {0x00000001, 0x00000002, 0x00000002, +- 0x00000003, 0x00000002, 0000000000, +- 0x00000003, 0x00000003}; +- +-static const INT opdDelta_Offset = 0; +-static const INT opdDelta_MaxVal = 7; +-/* PS Stereo Huffmantable: opdDeltaFreq */ +-static const UINT opdDeltaFreq_Length[] = {1, 3, 4, 4, 5, 5, 4, 3}; +-static const UINT opdDeltaFreq_Code[] = { +- 0x00000001, 0x00000001, 0x00000006, 0x00000004, +- 0x0000000f, 0x0000000e, 0x00000005, 0000000000, +-}; +- +-/* PS Stereo Huffmantable: opdDeltaTime */ +-static const UINT opdDeltaTime_Length[] = {1, 3, 4, 5, 5, 4, 4, 3}; +-static const UINT opdDeltaTime_Code[] = {0x00000001, 0x00000002, 0x00000001, +- 0x00000007, 0x00000006, 0000000000, +- 0x00000002, 0x00000003}; +- +-static INT getNoBands(const INT mode) { +- INT noBands = 0; +- +- switch (mode) { +- case 0: +- case 3: /* coarse */ +- noBands = PS_BANDS_COARSE; +- break; +- case 1: +- case 4: /* mid */ +- noBands = PS_BANDS_MID; +- break; +- case 2: +- case 5: /* fine not supported */ +- default: /* coarse as default */ +- noBands = PS_BANDS_COARSE; +- } +- +- return noBands; +-} +- +-static INT getIIDRes(INT iidMode) { +- if (iidMode < 3) +- return PS_IID_RES_COARSE; +- else +- return PS_IID_RES_FINE; +-} +- +-static INT encodeDeltaFreq(HANDLE_FDK_BITSTREAM hBitBuf, const INT *val, +- const INT nBands, const UINT *codeTable, +- const UINT *lengthTable, const INT tableOffset, +- const INT maxVal, INT *error) { +- INT bitCnt = 0; +- INT lastVal = 0; +- INT band; +- +- for (band = 0; band < nBands; band++) { +- INT delta = (val[band] - lastVal) + tableOffset; +- lastVal = val[band]; +- if ((delta > maxVal) || (delta < 0)) { +- *error = 1; +- delta = delta > 0 ? maxVal : 0; +- } +- bitCnt += +- FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); +- } +- +- return bitCnt; +-} +- +-static INT encodeDeltaTime(HANDLE_FDK_BITSTREAM hBitBuf, const INT *val, +- const INT *valLast, const INT nBands, +- const UINT *codeTable, const UINT *lengthTable, +- const INT tableOffset, const INT maxVal, +- INT *error) { +- INT bitCnt = 0; +- INT band; +- +- for (band = 0; band < nBands; band++) { +- INT delta = (val[band] - valLast[band]) + tableOffset; +- if ((delta > maxVal) || (delta < 0)) { +- *error = 1; +- delta = delta > 0 ? maxVal : 0; +- } +- bitCnt += +- FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); +- } +- +- return bitCnt; +-} +- +-INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iidVal, +- const INT *iidValLast, const INT nBands, +- const PS_IID_RESOLUTION res, const PS_DELTA mode, +- INT *error) { +- const UINT *codeTable; +- const UINT *lengthTable; +- INT bitCnt = 0; +- +- bitCnt = 0; +- +- switch (mode) { +- case PS_DELTA_FREQ: +- switch (res) { +- case PS_IID_RES_COARSE: +- codeTable = iidDeltaFreqCoarse_Code; +- lengthTable = iidDeltaFreqCoarse_Length; +- bitCnt += encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, +- lengthTable, iidDeltaCoarse_Offset, +- iidDeltaCoarse_MaxVal, error); +- break; +- case PS_IID_RES_FINE: +- codeTable = iidDeltaFreqFine_Code; +- lengthTable = iidDeltaFreqFine_Length; +- bitCnt += +- encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, lengthTable, +- iidDeltaFine_Offset, iidDeltaFine_MaxVal, error); +- break; +- default: +- *error = 1; +- } +- break; +- +- case PS_DELTA_TIME: +- switch (res) { +- case PS_IID_RES_COARSE: +- codeTable = iidDeltaTimeCoarse_Code; +- lengthTable = iidDeltaTimeCoarse_Length; +- bitCnt += encodeDeltaTime( +- hBitBuf, iidVal, iidValLast, nBands, codeTable, lengthTable, +- iidDeltaCoarse_Offset, iidDeltaCoarse_MaxVal, error); +- break; +- case PS_IID_RES_FINE: +- codeTable = iidDeltaTimeFine_Code; +- lengthTable = iidDeltaTimeFine_Length; +- bitCnt += encodeDeltaTime(hBitBuf, iidVal, iidValLast, nBands, +- codeTable, lengthTable, iidDeltaFine_Offset, +- iidDeltaFine_MaxVal, error); +- break; +- default: +- *error = 1; +- } +- break; +- +- default: +- *error = 1; +- } +- +- return bitCnt; +-} +- +-INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iccVal, +- const INT *iccValLast, const INT nBands, +- const PS_DELTA mode, INT *error) { +- const UINT *codeTable; +- const UINT *lengthTable; +- INT bitCnt = 0; +- +- switch (mode) { +- case PS_DELTA_FREQ: +- codeTable = iccDeltaFreq_Code; +- lengthTable = iccDeltaFreq_Length; +- bitCnt += encodeDeltaFreq(hBitBuf, iccVal, nBands, codeTable, lengthTable, +- iccDelta_Offset, iccDelta_MaxVal, error); +- break; +- +- case PS_DELTA_TIME: +- codeTable = iccDeltaTime_Code; +- lengthTable = iccDeltaTime_Length; +- +- bitCnt += +- encodeDeltaTime(hBitBuf, iccVal, iccValLast, nBands, codeTable, +- lengthTable, iccDelta_Offset, iccDelta_MaxVal, error); +- break; +- +- default: +- *error = 1; +- } +- +- return bitCnt; +-} +- +-INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *ipdVal, +- const INT *ipdValLast, const INT nBands, +- const PS_DELTA mode, INT *error) { +- const UINT *codeTable; +- const UINT *lengthTable; +- INT bitCnt = 0; +- +- switch (mode) { +- case PS_DELTA_FREQ: +- codeTable = ipdDeltaFreq_Code; +- lengthTable = ipdDeltaFreq_Length; +- bitCnt += encodeDeltaFreq(hBitBuf, ipdVal, nBands, codeTable, lengthTable, +- ipdDelta_Offset, ipdDelta_MaxVal, error); +- break; +- +- case PS_DELTA_TIME: +- codeTable = ipdDeltaTime_Code; +- lengthTable = ipdDeltaTime_Length; +- +- bitCnt += +- encodeDeltaTime(hBitBuf, ipdVal, ipdValLast, nBands, codeTable, +- lengthTable, ipdDelta_Offset, ipdDelta_MaxVal, error); +- break; +- +- default: +- *error = 1; +- } +- +- return bitCnt; +-} +- +-INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *opdVal, +- const INT *opdValLast, const INT nBands, +- const PS_DELTA mode, INT *error) { +- const UINT *codeTable; +- const UINT *lengthTable; +- INT bitCnt = 0; +- +- switch (mode) { +- case PS_DELTA_FREQ: +- codeTable = opdDeltaFreq_Code; +- lengthTable = opdDeltaFreq_Length; +- bitCnt += encodeDeltaFreq(hBitBuf, opdVal, nBands, codeTable, lengthTable, +- opdDelta_Offset, opdDelta_MaxVal, error); +- break; +- +- case PS_DELTA_TIME: +- codeTable = opdDeltaTime_Code; +- lengthTable = opdDeltaTime_Length; +- +- bitCnt += +- encodeDeltaTime(hBitBuf, opdVal, opdValLast, nBands, codeTable, +- lengthTable, opdDelta_Offset, opdDelta_MaxVal, error); +- break; +- +- default: +- *error = 1; +- } +- +- return bitCnt; +-} +- +-static INT encodeIpdOpd(HANDLE_PS_OUT psOut, HANDLE_FDK_BITSTREAM hBitBuf) { +- INT bitCnt = 0; +- INT error = 0; +- INT env; +- +- FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enableIpdOpd, 1); +- +- if (psOut->enableIpdOpd == 1) { +- INT *ipdLast = psOut->ipdLast; +- INT *opdLast = psOut->opdLast; +- +- for (env = 0; env < psOut->nEnvelopes; env++) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->deltaIPD[env], 1); +- bitCnt += FDKsbrEnc_EncodeIpd(hBitBuf, psOut->ipd[env], ipdLast, +- getNoBands(psOut->iidMode), +- psOut->deltaIPD[env], &error); +- +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->deltaOPD[env], 1); +- bitCnt += FDKsbrEnc_EncodeOpd(hBitBuf, psOut->opd[env], opdLast, +- getNoBands(psOut->iidMode), +- psOut->deltaOPD[env], &error); +- } +- /* reserved bit */ +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, 0, 1); +- } +- +- return bitCnt; +-} +- +-static INT getEnvIdx(const INT nEnvelopes, const INT frameClass) { +- INT envIdx = 0; +- +- switch (nEnvelopes) { +- case 0: +- envIdx = 0; +- break; +- +- case 1: +- if (frameClass == 0) +- envIdx = 1; +- else +- envIdx = 0; +- break; +- +- case 2: +- if (frameClass == 0) +- envIdx = 2; +- else +- envIdx = 1; +- break; +- +- case 3: +- envIdx = 2; +- break; +- +- case 4: +- envIdx = 3; +- break; +- +- default: +- /* unsupported number of envelopes */ +- envIdx = 0; +- } +- +- return envIdx; +-} +- +-static INT encodePSExtension(const HANDLE_PS_OUT psOut, +- HANDLE_FDK_BITSTREAM hBitBuf) { +- INT bitCnt = 0; +- +- if (psOut->enableIpdOpd == 1) { +- INT ipdOpdBits = 0; +- INT extSize = (2 + encodeIpdOpd(psOut, NULL) + 7) >> 3; +- +- if (extSize < 15) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, extSize, 4); +- } else { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, 15, 4); +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, (extSize - 15), 8); +- } +- +- /* write ipd opd data */ +- ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, PS_EXT_ID_V0, 2); +- ipdOpdBits += encodeIpdOpd(psOut, hBitBuf); +- +- /* byte align the ipd opd data */ +- if (ipdOpdBits % 8) +- ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, 0, (8 - (ipdOpdBits % 8))); +- +- bitCnt += ipdOpdBits; +- } +- +- return (bitCnt); +-} +- +-INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT psOut, +- HANDLE_FDK_BITSTREAM hBitBuf) { +- INT psExtEnable = 0; +- INT bitCnt = 0; +- INT error = 0; +- INT env; +- +- if (psOut != NULL) { +- /* PS HEADER */ +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enablePSHeader, 1); +- +- if (psOut->enablePSHeader) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enableIID, 1); +- if (psOut->enableIID) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->iidMode, 3); +- } +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enableICC, 1); +- if (psOut->enableICC) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->iccMode, 3); +- } +- if (psOut->enableIpdOpd) { +- psExtEnable = 1; +- } +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psExtEnable, 1); +- } +- +- /* Frame class, number of envelopes */ +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->frameClass, 1); +- bitCnt += FDKsbrEnc_WriteBits_ps( +- hBitBuf, getEnvIdx(psOut->nEnvelopes, psOut->frameClass), 2); +- +- if (psOut->frameClass == 1) { +- for (env = 0; env < psOut->nEnvelopes; env++) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->frameBorder[env], 5); +- } +- } +- +- if (psOut->enableIID == 1) { +- INT *iidLast = psOut->iidLast; +- for (env = 0; env < psOut->nEnvelopes; env++) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->deltaIID[env], 1); +- bitCnt += FDKsbrEnc_EncodeIid( +- hBitBuf, psOut->iid[env], iidLast, getNoBands(psOut->iidMode), +- (PS_IID_RESOLUTION)getIIDRes(psOut->iidMode), psOut->deltaIID[env], +- &error); +- +- iidLast = psOut->iid[env]; +- } +- } +- +- if (psOut->enableICC == 1) { +- INT *iccLast = psOut->iccLast; +- for (env = 0; env < psOut->nEnvelopes; env++) { +- bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->deltaICC[env], 1); +- bitCnt += FDKsbrEnc_EncodeIcc(hBitBuf, psOut->icc[env], iccLast, +- getNoBands(psOut->iccMode), +- psOut->deltaICC[env], &error); +- +- iccLast = psOut->icc[env]; +- } +- } +- +- if (psExtEnable != 0) { +- bitCnt += encodePSExtension(psOut, hBitBuf); +- } +- +- } /* if(psOut != NULL) */ +- +- return bitCnt; +-} +diff --git a/libSBRenc/src/ps_bitenc.h b/libSBRenc/src/ps_bitenc.h +deleted file mode 100644 +index 1d383e3..0000000 +--- a/libSBRenc/src/ps_bitenc.h ++++ /dev/null +@@ -1,173 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): N. Rettelbach +- +- Description: Parametric Stereo bitstream encoder +- +-*******************************************************************************/ +- +-#include "ps_main.h" +-#include "ps_const.h" +-#include "FDK_bitstream.h" +- +-#ifndef PS_BITENC_H +-#define PS_BITENC_H +- +-typedef struct T_PS_OUT { +- INT enablePSHeader; +- INT enableIID; +- INT iidMode; +- INT enableICC; +- INT iccMode; +- INT enableIpdOpd; +- +- INT frameClass; +- INT nEnvelopes; +- /* ENV data */ +- INT frameBorder[PS_MAX_ENVELOPES]; +- +- /* iid data */ +- PS_DELTA deltaIID[PS_MAX_ENVELOPES]; +- INT iid[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT iidLast[PS_MAX_BANDS]; +- +- /* icc data */ +- PS_DELTA deltaICC[PS_MAX_ENVELOPES]; +- INT icc[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT iccLast[PS_MAX_BANDS]; +- +- /* ipd data */ +- PS_DELTA deltaIPD[PS_MAX_ENVELOPES]; +- INT ipd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT ipdLast[PS_MAX_BANDS]; +- +- /* opd data */ +- PS_DELTA deltaOPD[PS_MAX_ENVELOPES]; +- INT opd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT opdLast[PS_MAX_BANDS]; +- +-} PS_OUT, *HANDLE_PS_OUT; +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iidVal, +- const INT *iidValLast, const INT nBands, +- const PS_IID_RESOLUTION res, const PS_DELTA mode, +- INT *error); +- +-INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iccVal, +- const INT *iccValLast, const INT nBands, +- const PS_DELTA mode, INT *error); +- +-INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *ipdVal, +- const INT *ipdValLast, const INT nBands, +- const PS_DELTA mode, INT *error); +- +-INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *opdVal, +- const INT *opdValLast, const INT nBands, +- const PS_DELTA mode, INT *error); +- +-INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT psOut, +- HANDLE_FDK_BITSTREAM hBitBuf); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* defined(PSENC_ENABLE) */ +diff --git a/libSBRenc/src/ps_const.h b/libSBRenc/src/ps_const.h +deleted file mode 100644 +index b9a33f9..0000000 +--- a/libSBRenc/src/ps_const.h ++++ /dev/null +@@ -1,150 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): N. Rettelbach +- +- Description: Parametric Stereo constants +- +-*******************************************************************************/ +- +-#ifndef PS_CONST_H +-#define PS_CONST_H +- +-#define MAX_PS_CHANNELS (2) +-#define HYBRID_MAX_QMF_BANDS (3) +-#define HYBRID_FILTER_LENGTH (13) +-#define HYBRID_FILTER_DELAY ((HYBRID_FILTER_LENGTH - 1) / 2) +- +-#define HYBRID_FRAMESIZE (32) +-#define HYBRID_READ_OFFSET (10) +- +-#define MAX_HYBRID_BANDS ((64 - HYBRID_MAX_QMF_BANDS + 10)) +- +-typedef enum { +- PS_RES_COARSE = 0, +- PS_RES_MID = 1, +- PS_RES_FINE = 2 +-} PS_RESOLUTION; +- +-typedef enum { +- PS_BANDS_COARSE = 10, +- PS_BANDS_MID = 20, +- PS_MAX_BANDS = PS_BANDS_MID +-} PS_BANDS; +- +-typedef enum { PS_IID_RES_COARSE = 0, PS_IID_RES_FINE } PS_IID_RESOLUTION; +- +-typedef enum { PS_ICC_ROT_A = 0, PS_ICC_ROT_B } PS_ICC_ROTATION_MODE; +- +-typedef enum { PS_DELTA_FREQ, PS_DELTA_TIME } PS_DELTA; +- +-typedef enum { +- PS_MAX_ENVELOPES = 4 +- +-} PS_CONSTS; +- +-typedef enum { +- PSENC_OK = 0x0000, /*!< No error happened. All fine. */ +- PSENC_INVALID_HANDLE = +- 0x0020, /*!< Handle passed to function call was invalid. */ +- PSENC_MEMORY_ERROR = 0x0021, /*!< Memory allocation failed. */ +- PSENC_INIT_ERROR = 0x0040, /*!< General initialization error. */ +- PSENC_ENCODE_ERROR = 0x0060 /*!< The encoding process was interrupted by an +- unexpected error. */ +- +-} FDK_PSENC_ERROR; +- +-#endif +diff --git a/libSBRenc/src/ps_encode.cpp b/libSBRenc/src/ps_encode.cpp +deleted file mode 100644 +index 88d3131..0000000 +--- a/libSBRenc/src/ps_encode.cpp ++++ /dev/null +@@ -1,1031 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): M. Neuendorf, N. Rettelbach, M. Multrus +- +- Description: PS parameter extraction, encoding +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief PS parameter extraction, encoding functions $Revision: 96441 $ +-*/ +- +-#include "ps_main.h" +-#include "ps_encode.h" +-#include "qmf.h" +-#include "sbr_misc.h" +-#include "sbrenc_ram.h" +- +-#include "genericStds.h" +- +-inline void FDKsbrEnc_addFIXP_DBL(const FIXP_DBL *X, const FIXP_DBL *Y, +- FIXP_DBL *Z, INT n) { +- for (INT i = 0; i < n; i++) Z[i] = (X[i] >> 1) + (Y[i] >> 1); +-} +- +-#define LOG10_2_10 3.01029995664f /* 10.0f*log10(2.f) */ +- +-static const INT +- iidGroupBordersLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES + 1] = { +- 0, 1, 2, 3, 4, 5, /* 6 subqmf subbands - 0th qmf subband */ +- 6, 7, /* 2 subqmf subbands - 1st qmf subband */ +- 8, 9, /* 2 subqmf subbands - 2nd qmf subband */ +- 10, 11, 12, 13, 14, 15, 16, 18, 21, 25, 30, 42, 71}; +- +-static const UCHAR +- iidGroupWidthLdLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = { +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5}; +- +-static const INT subband2parameter20[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = +- {1, 0, 0, 1, 2, 3, /* 6 subqmf subbands - 0th qmf subband */ +- 4, 5, /* 2 subqmf subbands - 1st qmf subband */ +- 6, 7, /* 2 subqmf subbands - 2nd qmf subband */ +- 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; +- +-typedef enum { +- MAX_TIME_DIFF_FRAMES = 20, +- MAX_PS_NOHEADER_CNT = 10, +- MAX_NOENV_CNT = 10, +- DO_NOT_USE_THIS_MODE = 0x7FFFFF +-} __PS_CONSTANTS; +- +-static const FIXP_DBL iidQuant_fx[15] = { +- (FIXP_DBL)0xce000000, (FIXP_DBL)0xdc000000, (FIXP_DBL)0xe4000000, +- (FIXP_DBL)0xec000000, (FIXP_DBL)0xf2000000, (FIXP_DBL)0xf8000000, +- (FIXP_DBL)0xfc000000, (FIXP_DBL)0x00000000, (FIXP_DBL)0x04000000, +- (FIXP_DBL)0x08000000, (FIXP_DBL)0x0e000000, (FIXP_DBL)0x14000000, +- (FIXP_DBL)0x1c000000, (FIXP_DBL)0x24000000, (FIXP_DBL)0x32000000}; +- +-static const FIXP_DBL iidQuantFine_fx[31] = { +- (FIXP_DBL)0x9c000001, (FIXP_DBL)0xa6000001, (FIXP_DBL)0xb0000001, +- (FIXP_DBL)0xba000001, (FIXP_DBL)0xc4000000, (FIXP_DBL)0xce000000, +- (FIXP_DBL)0xd4000000, (FIXP_DBL)0xda000000, (FIXP_DBL)0xe0000000, +- (FIXP_DBL)0xe6000000, (FIXP_DBL)0xec000000, (FIXP_DBL)0xf0000000, +- (FIXP_DBL)0xf4000000, (FIXP_DBL)0xf8000000, (FIXP_DBL)0xfc000000, +- (FIXP_DBL)0x00000000, (FIXP_DBL)0x04000000, (FIXP_DBL)0x08000000, +- (FIXP_DBL)0x0c000000, (FIXP_DBL)0x10000000, (FIXP_DBL)0x14000000, +- (FIXP_DBL)0x1a000000, (FIXP_DBL)0x20000000, (FIXP_DBL)0x26000000, +- (FIXP_DBL)0x2c000000, (FIXP_DBL)0x32000000, (FIXP_DBL)0x3c000000, +- (FIXP_DBL)0x45ffffff, (FIXP_DBL)0x4fffffff, (FIXP_DBL)0x59ffffff, +- (FIXP_DBL)0x63ffffff}; +- +-static const FIXP_DBL iccQuant[8] = { +- (FIXP_DBL)0x7fffffff, (FIXP_DBL)0x77ef9d7f, (FIXP_DBL)0x6babc97f, +- (FIXP_DBL)0x4ceaf27f, (FIXP_DBL)0x2f0ed3c0, (FIXP_DBL)0x00000000, +- (FIXP_DBL)0xb49ba601, (FIXP_DBL)0x80000000}; +- +-static FDK_PSENC_ERROR InitPSData(HANDLE_PS_DATA hPsData) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (hPsData == NULL) { +- error = PSENC_INVALID_HANDLE; +- } else { +- int i, env; +- FDKmemclear(hPsData, sizeof(PS_DATA)); +- +- for (i = 0; i < PS_MAX_BANDS; i++) { +- hPsData->iidIdxLast[i] = 0; +- hPsData->iccIdxLast[i] = 0; +- } +- +- hPsData->iidEnable = hPsData->iidEnableLast = 0; +- hPsData->iccEnable = hPsData->iccEnableLast = 0; +- hPsData->iidQuantMode = hPsData->iidQuantModeLast = PS_IID_RES_COARSE; +- hPsData->iccQuantMode = hPsData->iccQuantModeLast = PS_ICC_ROT_A; +- +- for (env = 0; env < PS_MAX_ENVELOPES; env++) { +- hPsData->iccDiffMode[env] = PS_DELTA_FREQ; +- hPsData->iccDiffMode[env] = PS_DELTA_FREQ; +- +- for (i = 0; i < PS_MAX_BANDS; i++) { +- hPsData->iidIdx[env][i] = 0; +- hPsData->iccIdx[env][i] = 0; +- } +- } +- +- hPsData->nEnvelopesLast = 0; +- +- hPsData->headerCnt = MAX_PS_NOHEADER_CNT; +- hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; +- hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; +- hPsData->noEnvCnt = MAX_NOENV_CNT; +- } +- +- return error; +-} +- +-static FIXP_DBL quantizeCoef(const FIXP_DBL *RESTRICT input, const INT nBands, +- const FIXP_DBL *RESTRICT quantTable, +- const INT idxOffset, const INT nQuantSteps, +- INT *RESTRICT quantOut) { +- INT idx, band; +- FIXP_DBL quantErr = FL2FXCONST_DBL(0.f); +- +- for (band = 0; band < nBands; band++) { +- for (idx = 0; idx < nQuantSteps - 1; idx++) { +- if (fixp_abs((input[band] >> 1) - (quantTable[idx + 1] >> 1)) > +- fixp_abs((input[band] >> 1) - (quantTable[idx] >> 1))) { +- break; +- } +- } +- quantErr += (fixp_abs(input[band] - quantTable[idx]) >> +- PS_QUANT_SCALE); /* don't scale before subtraction; diff +- smaller (64-25)/64 */ +- quantOut[band] = idx - idxOffset; +- } +- +- return quantErr; +-} +- +-static INT getICCMode(const INT nBands, const INT rotType) { +- INT mode = 0; +- +- switch (nBands) { +- case PS_BANDS_COARSE: +- mode = PS_RES_COARSE; +- break; +- case PS_BANDS_MID: +- mode = PS_RES_MID; +- break; +- default: +- mode = 0; +- } +- if (rotType == PS_ICC_ROT_B) { +- mode += 3; +- } +- +- return mode; +-} +- +-static INT getIIDMode(const INT nBands, const INT iidRes) { +- INT mode = 0; +- +- switch (nBands) { +- case PS_BANDS_COARSE: +- mode = PS_RES_COARSE; +- break; +- case PS_BANDS_MID: +- mode = PS_RES_MID; +- break; +- default: +- mode = 0; +- break; +- } +- +- if (iidRes == PS_IID_RES_FINE) { +- mode += 3; +- } +- +- return mode; +-} +- +-static INT envelopeReducible(FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- INT psBands, INT nEnvelopes) { +-#define THRESH_SCALE 7 +- +- INT reducible = 1; /* true */ +- INT e = 0, b = 0; +- FIXP_DBL dIid = FL2FXCONST_DBL(0.f); +- FIXP_DBL dIcc = FL2FXCONST_DBL(0.f); +- +- FIXP_DBL iidErrThreshold, iccErrThreshold; +- FIXP_DBL iidMeanError, iccMeanError; +- +- /* square values to prevent sqrt, +- multiply bands to prevent division; bands shifted DFRACT_BITS instead +- (DFRACT_BITS-1) because fMultDiv2 used*/ +- iidErrThreshold = +- fMultDiv2(FL2FXCONST_DBL(6.5f * 6.5f / (IID_SCALE_FT * IID_SCALE_FT)), +- (FIXP_DBL)(psBands << ((DFRACT_BITS)-THRESH_SCALE))); +- iccErrThreshold = +- fMultDiv2(FL2FXCONST_DBL(0.75f * 0.75f), +- (FIXP_DBL)(psBands << ((DFRACT_BITS)-THRESH_SCALE))); +- +- if (nEnvelopes <= 1) { +- reducible = 0; +- } else { +- /* mean error criterion */ +- for (e = 0; (e < nEnvelopes / 2) && (reducible != 0); e++) { +- iidMeanError = iccMeanError = FL2FXCONST_DBL(0.f); +- for (b = 0; b < psBands; b++) { +- dIid = (iid[2 * e][b] >> 1) - +- (iid[2 * e + 1][b] >> 1); /* scale 1 bit; squared -> 2 bit */ +- dIcc = (icc[2 * e][b] >> 1) - (icc[2 * e + 1][b] >> 1); +- iidMeanError += fPow2Div2(dIid) >> (5 - 1); /* + (bands=20) scale = 5 */ +- iccMeanError += fPow2Div2(dIcc) >> (5 - 1); +- } /* --> scaling = 7 bit = THRESH_SCALE !! */ +- +- /* instead sqrt values are squared! +- instead of division, multiply threshold with psBands +- scaling necessary!! */ +- +- /* quit as soon as threshold is reached */ +- if ((iidMeanError > (iidErrThreshold)) || +- (iccMeanError > (iccErrThreshold))) { +- reducible = 0; +- } +- } +- } /* nEnvelopes != 1 */ +- +- return reducible; +-} +- +-static void processIidData(PS_DATA *psData, +- FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- const INT psBands, const INT nEnvelopes, +- const FIXP_DBL quantErrorThreshold) { +- INT iidIdxFine[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT iidIdxCoarse[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- +- FIXP_DBL errIID = FL2FXCONST_DBL(0.f); +- FIXP_DBL errIIDFine = FL2FXCONST_DBL(0.f); +- INT bitsIidFreq = 0; +- INT bitsIidTime = 0; +- INT bitsFineTot = 0; +- INT bitsCoarseTot = 0; +- INT error = 0; +- INT env, band; +- INT diffMode[PS_MAX_ENVELOPES], diffModeFine[PS_MAX_ENVELOPES]; +- INT loudnDiff = 0; +- INT iidTransmit = 0; +- +- /* Quantize IID coefficients */ +- for (env = 0; env < nEnvelopes; env++) { +- errIID += +- quantizeCoef(iid[env], psBands, iidQuant_fx, 7, 15, iidIdxCoarse[env]); +- errIIDFine += quantizeCoef(iid[env], psBands, iidQuantFine_fx, 15, 31, +- iidIdxFine[env]); +- } +- +- /* normalize error to number of envelopes, ps bands +- errIID /= psBands*nEnvelopes; +- errIIDFine /= psBands*nEnvelopes; */ +- +- /* Check if IID coefficients should be used in this frame */ +- psData->iidEnable = 0; +- for (env = 0; env < nEnvelopes; env++) { +- for (band = 0; band < psBands; band++) { +- loudnDiff += fixp_abs(iidIdxCoarse[env][band]); +- iidTransmit++; +- } +- } +- +- if (loudnDiff > +- fMultI(FL2FXCONST_DBL(0.7f), iidTransmit)) { /* 0.7f empiric value */ +- psData->iidEnable = 1; +- } +- +- /* if iid not active -> RESET data */ +- if (psData->iidEnable == 0) { +- psData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; +- for (env = 0; env < nEnvelopes; env++) { +- psData->iidDiffMode[env] = PS_DELTA_FREQ; +- FDKmemclear(psData->iidIdx[env], sizeof(INT) * psBands); +- } +- return; +- } +- +- /* count COARSE quantization bits for first envelope*/ +- bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], NULL, psBands, +- PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); +- +- if ((psData->iidTimeCnt >= MAX_TIME_DIFF_FRAMES) || +- (psData->iidQuantModeLast == PS_IID_RES_FINE)) { +- bitsIidTime = DO_NOT_USE_THIS_MODE; +- } else { +- bitsIidTime = +- FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], psData->iidIdxLast, psBands, +- PS_IID_RES_COARSE, PS_DELTA_TIME, &error); +- } +- +- /* decision DELTA_FREQ vs DELTA_TIME */ +- if (bitsIidTime > bitsIidFreq) { +- diffMode[0] = PS_DELTA_FREQ; +- bitsCoarseTot = bitsIidFreq; +- } else { +- diffMode[0] = PS_DELTA_TIME; +- bitsCoarseTot = bitsIidTime; +- } +- +- /* count COARSE quantization bits for following envelopes*/ +- for (env = 1; env < nEnvelopes; env++) { +- bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], NULL, psBands, +- PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); +- bitsIidTime = +- FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], iidIdxCoarse[env - 1], +- psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); +- +- /* decision DELTA_FREQ vs DELTA_TIME */ +- if (bitsIidTime > bitsIidFreq) { +- diffMode[env] = PS_DELTA_FREQ; +- bitsCoarseTot += bitsIidFreq; +- } else { +- diffMode[env] = PS_DELTA_TIME; +- bitsCoarseTot += bitsIidTime; +- } +- } +- +- /* count FINE quantization bits for first envelope*/ +- bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], NULL, psBands, +- PS_IID_RES_FINE, PS_DELTA_FREQ, &error); +- +- if ((psData->iidTimeCnt >= MAX_TIME_DIFF_FRAMES) || +- (psData->iidQuantModeLast == PS_IID_RES_COARSE)) { +- bitsIidTime = DO_NOT_USE_THIS_MODE; +- } else { +- bitsIidTime = +- FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], psData->iidIdxLast, psBands, +- PS_IID_RES_FINE, PS_DELTA_TIME, &error); +- } +- +- /* decision DELTA_FREQ vs DELTA_TIME */ +- if (bitsIidTime > bitsIidFreq) { +- diffModeFine[0] = PS_DELTA_FREQ; +- bitsFineTot = bitsIidFreq; +- } else { +- diffModeFine[0] = PS_DELTA_TIME; +- bitsFineTot = bitsIidTime; +- } +- +- /* count FINE quantization bits for following envelopes*/ +- for (env = 1; env < nEnvelopes; env++) { +- bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env], NULL, psBands, +- PS_IID_RES_FINE, PS_DELTA_FREQ, &error); +- bitsIidTime = +- FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env], iidIdxFine[env - 1], psBands, +- PS_IID_RES_FINE, PS_DELTA_TIME, &error); +- +- /* decision DELTA_FREQ vs DELTA_TIME */ +- if (bitsIidTime > bitsIidFreq) { +- diffModeFine[env] = PS_DELTA_FREQ; +- bitsFineTot += bitsIidFreq; +- } else { +- diffModeFine[env] = PS_DELTA_TIME; +- bitsFineTot += bitsIidTime; +- } +- } +- +- if (bitsFineTot == bitsCoarseTot) { +- /* if same number of bits is needed, use the quantization with lower error +- */ +- if (errIIDFine < errIID) { +- bitsCoarseTot = DO_NOT_USE_THIS_MODE; +- } else { +- bitsFineTot = DO_NOT_USE_THIS_MODE; +- } +- } else { +- /* const FIXP_DBL minThreshold = +- * FL2FXCONST_DBL(0.2f/(IID_SCALE_FT*PS_QUANT_SCALE_FT)*(psBands*nEnvelopes)); +- */ +- const FIXP_DBL minThreshold = +- (FIXP_DBL)((LONG)0x00019999 * (psBands * nEnvelopes)); +- +- /* decision RES_FINE vs RES_COARSE */ +- /* test if errIIDFine*quantErrorThreshold < errIID */ +- /* shiftVal 2 comes from scaling of quantErrorThreshold */ +- if (fixMax(((errIIDFine >> 1) + (minThreshold >> 1)) >> 1, +- fMult(quantErrorThreshold, errIIDFine)) < (errIID >> 2)) { +- bitsCoarseTot = DO_NOT_USE_THIS_MODE; +- } else if (fixMax(((errIID >> 1) + (minThreshold >> 1)) >> 1, +- fMult(quantErrorThreshold, errIID)) < (errIIDFine >> 2)) { +- bitsFineTot = DO_NOT_USE_THIS_MODE; +- } +- } +- +- /* decision RES_FINE vs RES_COARSE */ +- if (bitsFineTot < bitsCoarseTot) { +- psData->iidQuantMode = PS_IID_RES_FINE; +- for (env = 0; env < nEnvelopes; env++) { +- psData->iidDiffMode[env] = diffModeFine[env]; +- FDKmemcpy(psData->iidIdx[env], iidIdxFine[env], psBands * sizeof(INT)); +- } +- } else { +- psData->iidQuantMode = PS_IID_RES_COARSE; +- for (env = 0; env < nEnvelopes; env++) { +- psData->iidDiffMode[env] = diffMode[env]; +- FDKmemcpy(psData->iidIdx[env], iidIdxCoarse[env], psBands * sizeof(INT)); +- } +- } +- +- /* Count DELTA_TIME encoding streaks */ +- for (env = 0; env < nEnvelopes; env++) { +- if (psData->iidDiffMode[env] == PS_DELTA_TIME) +- psData->iidTimeCnt++; +- else +- psData->iidTimeCnt = 0; +- } +-} +- +-static INT similarIid(PS_DATA *psData, const INT psBands, +- const INT nEnvelopes) { +- const INT diffThr = (psData->iidQuantMode == PS_IID_RES_COARSE) ? 2 : 3; +- const INT sumDiffThr = diffThr * psBands / 4; +- INT similar = 0; +- INT diff = 0; +- INT sumDiff = 0; +- INT env = 0; +- INT b = 0; +- if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes == 1)) { +- similar = 1; +- for (env = 0; env < nEnvelopes; env++) { +- sumDiff = 0; +- b = 0; +- do { +- diff = fixp_abs(psData->iidIdx[env][b] - psData->iidIdxLast[b]); +- sumDiff += diff; +- if ((diff > diffThr) /* more than x quantization steps in any band */ +- || (sumDiff > sumDiffThr)) { /* more than x quantisations steps +- overall difference */ +- similar = 0; +- } +- b++; +- } while ((b < psBands) && (similar > 0)); +- } +- } /* nEnvelopes==1 */ +- +- return similar; +-} +- +-static INT similarIcc(PS_DATA *psData, const INT psBands, +- const INT nEnvelopes) { +- const INT diffThr = 2; +- const INT sumDiffThr = diffThr * psBands / 4; +- INT similar = 0; +- INT diff = 0; +- INT sumDiff = 0; +- INT env = 0; +- INT b = 0; +- if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes == 1)) { +- similar = 1; +- for (env = 0; env < nEnvelopes; env++) { +- sumDiff = 0; +- b = 0; +- do { +- diff = fixp_abs(psData->iccIdx[env][b] - psData->iccIdxLast[b]); +- sumDiff += diff; +- if ((diff > diffThr) /* more than x quantisation step in any band */ +- || (sumDiff > sumDiffThr)) { /* more than x quantisations steps +- overall difference */ +- similar = 0; +- } +- b++; +- } while ((b < psBands) && (similar > 0)); +- } +- } /* nEnvelopes==1 */ +- +- return similar; +-} +- +-static void processIccData( +- PS_DATA *psData, +- FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], /* const input values: +- unable to declare as +- const, since it does +- not poINT to const +- memory */ +- const INT psBands, const INT nEnvelopes) { +- FIXP_DBL errICC = FL2FXCONST_DBL(0.f); +- INT env, band; +- INT bitsIccFreq, bitsIccTime; +- INT error = 0; +- INT inCoherence = 0, iccTransmit = 0; +- INT *iccIdxLast; +- +- iccIdxLast = psData->iccIdxLast; +- +- /* Quantize ICC coefficients */ +- for (env = 0; env < nEnvelopes; env++) { +- errICC += +- quantizeCoef(icc[env], psBands, iccQuant, 0, 8, psData->iccIdx[env]); +- } +- +- /* Check if ICC coefficients should be used */ +- psData->iccEnable = 0; +- for (env = 0; env < nEnvelopes; env++) { +- for (band = 0; band < psBands; band++) { +- inCoherence += psData->iccIdx[env][band]; +- iccTransmit++; +- } +- } +- if (inCoherence > +- fMultI(FL2FXCONST_DBL(0.5f), iccTransmit)) { /* 0.5f empiric value */ +- psData->iccEnable = 1; +- } +- +- if (psData->iccEnable == 0) { +- psData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; +- for (env = 0; env < nEnvelopes; env++) { +- psData->iccDiffMode[env] = PS_DELTA_FREQ; +- FDKmemclear(psData->iccIdx[env], sizeof(INT) * psBands); +- } +- return; +- } +- +- for (env = 0; env < nEnvelopes; env++) { +- bitsIccFreq = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env], NULL, psBands, +- PS_DELTA_FREQ, &error); +- +- if (psData->iccTimeCnt < MAX_TIME_DIFF_FRAMES) { +- bitsIccTime = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env], iccIdxLast, +- psBands, PS_DELTA_TIME, &error); +- } else { +- bitsIccTime = DO_NOT_USE_THIS_MODE; +- } +- +- if (bitsIccFreq > bitsIccTime) { +- psData->iccDiffMode[env] = PS_DELTA_TIME; +- psData->iccTimeCnt++; +- } else { +- psData->iccDiffMode[env] = PS_DELTA_FREQ; +- psData->iccTimeCnt = 0; +- } +- iccIdxLast = psData->iccIdx[env]; +- } +-} +- +-static void calculateIID(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- INT nEnvelopes, INT psBands) { +- INT i = 0; +- INT env = 0; +- for (env = 0; env < nEnvelopes; env++) { +- for (i = 0; i < psBands; i++) { +- /* iid[env][i] = 10.0f*(float)log10(pwrL[env][i]/pwrR[env][i]); +- */ +- FIXP_DBL IID = fMultDiv2(FL2FXCONST_DBL(LOG10_2_10 / IID_SCALE_FT), +- (ldPwrL[env][i] - ldPwrR[env][i])); +- +- IID = fixMin(IID, (FIXP_DBL)(MAXVAL_DBL >> (LD_DATA_SHIFT + 1))); +- IID = fixMax(IID, (FIXP_DBL)(MINVAL_DBL >> (LD_DATA_SHIFT + 1))); +- iid[env][i] = IID << (LD_DATA_SHIFT + 1); +- } +- } +-} +- +-static void calculateICC(FIXP_DBL pwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL pwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], +- INT nEnvelopes, INT psBands) { +- INT i = 0; +- INT env = 0; +- INT border = psBands; +- +- switch (psBands) { +- case PS_BANDS_COARSE: +- border = 5; +- break; +- case PS_BANDS_MID: +- border = 11; +- break; +- default: +- break; +- } +- +- for (env = 0; env < nEnvelopes; env++) { +- for (i = 0; i < border; i++) { +- /* icc[env][i] = min( pwrCr[env][i] / (float) sqrt(pwrL[env][i] * +- * pwrR[env][i]) , 1.f); +- */ +- int scale; +- FIXP_DBL invNrg = invSqrtNorm2( +- fMax(fMult(pwrL[env][i], pwrR[env][i]), (FIXP_DBL)1), &scale); +- icc[env][i] = +- SATURATE_LEFT_SHIFT(fMult(pwrCr[env][i], invNrg), scale, DFRACT_BITS); +- } +- +- for (; i < psBands; i++) { +- int denom_e; +- FIXP_DBL denom_m = fMultNorm(pwrL[env][i], pwrR[env][i], &denom_e); +- +- if (denom_m == (FIXP_DBL)0) { +- icc[env][i] = (FIXP_DBL)MAXVAL_DBL; +- } else { +- int num_e, result_e; +- FIXP_DBL num_m, result_m; +- +- num_e = CountLeadingBits( +- fixMax(fixp_abs(pwrCr[env][i]), fixp_abs(pwrCi[env][i]))); +- num_m = fPow2Div2((pwrCr[env][i] << num_e)) + +- fPow2Div2((pwrCi[env][i] << num_e)); +- +- result_m = fDivNorm(num_m, denom_m, &result_e); +- result_e += (-2 * num_e + 1) - denom_e; +- icc[env][i] = scaleValueSaturate(sqrtFixp(result_m >> (result_e & 1)), +- (result_e + (result_e & 1)) >> 1); +- } +- } +- } +-} +- +-void FDKsbrEnc_initPsBandNrgScale(HANDLE_PS_ENCODE hPsEncode) { +- INT group, bin; +- INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; +- +- FDKmemclear(hPsEncode->psBandNrgScale, PS_MAX_BANDS * sizeof(SCHAR)); +- +- for (group = 0; group < nIidGroups; group++) { +- /* Translate group to bin */ +- bin = hPsEncode->subband2parameterIndex[group]; +- +- /* Translate from 20 bins to 10 bins */ +- if (hPsEncode->psEncMode == PS_BANDS_COARSE) { +- bin = bin >> 1; +- } +- +- hPsEncode->psBandNrgScale[bin] = +- (hPsEncode->psBandNrgScale[bin] == 0) +- ? (hPsEncode->iidGroupWidthLd[group] + 5) +- : (fixMax(hPsEncode->iidGroupWidthLd[group], +- hPsEncode->psBandNrgScale[bin]) + +- 1); +- } +-} +- +-FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode(HANDLE_PS_ENCODE *phPsEncode) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (phPsEncode == NULL) { +- error = PSENC_INVALID_HANDLE; +- } else { +- HANDLE_PS_ENCODE hPsEncode = NULL; +- if (NULL == (hPsEncode = GetRam_PsEncode())) { +- error = PSENC_MEMORY_ERROR; +- goto bail; +- } +- FDKmemclear(hPsEncode, sizeof(PS_ENCODE)); +- *phPsEncode = hPsEncode; /* return allocated handle */ +- } +-bail: +- return error; +-} +- +-FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode(HANDLE_PS_ENCODE hPsEncode, +- const PS_BANDS psEncMode, +- const FIXP_DBL iidQuantErrorThreshold) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (NULL == hPsEncode) { +- error = PSENC_INVALID_HANDLE; +- } else { +- if (PSENC_OK != (InitPSData(&hPsEncode->psData))) { +- goto bail; +- } +- +- switch (psEncMode) { +- case PS_BANDS_COARSE: +- case PS_BANDS_MID: +- hPsEncode->nQmfIidGroups = QMF_GROUPS_LO_RES; +- hPsEncode->nSubQmfIidGroups = SUBQMF_GROUPS_LO_RES; +- FDKmemcpy(hPsEncode->iidGroupBorders, iidGroupBordersLoRes, +- (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups + 1) * +- sizeof(INT)); +- FDKmemcpy(hPsEncode->subband2parameterIndex, subband2parameter20, +- (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) * +- sizeof(INT)); +- FDKmemcpy(hPsEncode->iidGroupWidthLd, iidGroupWidthLdLoRes, +- (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) * +- sizeof(UCHAR)); +- break; +- default: +- error = PSENC_INIT_ERROR; +- goto bail; +- } +- +- hPsEncode->psEncMode = psEncMode; +- hPsEncode->iidQuantErrorThreshold = iidQuantErrorThreshold; +- FDKsbrEnc_initPsBandNrgScale(hPsEncode); +- } +-bail: +- return error; +-} +- +-FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode(HANDLE_PS_ENCODE *phPsEncode) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (NULL != phPsEncode) { +- FreeRam_PsEncode(phPsEncode); +- } +- +- return error; +-} +- +-typedef struct { +- FIXP_DBL pwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL pwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- +-} PS_PWR_DATA; +- +-FDK_PSENC_ERROR FDKsbrEnc_PSEncode( +- HANDLE_PS_ENCODE hPsEncode, HANDLE_PS_OUT hPsOut, UCHAR *dynBandScale, +- UINT maxEnvelopes, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], +- const INT frameSize, const INT sendHeader) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- HANDLE_PS_DATA hPsData = &hPsEncode->psData; +- FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- int envBorder[PS_MAX_ENVELOPES + 1]; +- +- int group, bin, col, subband, band; +- int i = 0; +- +- int env = 0; +- int psBands = (int)hPsEncode->psEncMode; +- int nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; +- int nEnvelopes = fixMin(maxEnvelopes, (UINT)PS_MAX_ENVELOPES); +- +- C_ALLOC_SCRATCH_START(pwrData, PS_PWR_DATA, 1) +- +- for (env = 0; env < nEnvelopes + 1; env++) { +- envBorder[env] = fMultI(GetInvInt(nEnvelopes), frameSize * env); +- } +- +- for (env = 0; env < nEnvelopes; env++) { +- /* clear energy array */ +- for (band = 0; band < psBands; band++) { +- pwrData->pwrL[env][band] = pwrData->pwrR[env][band] = +- pwrData->pwrCr[env][band] = pwrData->pwrCi[env][band] = FIXP_DBL(1); +- } +- +- /**** calculate energies and correlation ****/ +- +- /* start with hybrid data */ +- for (group = 0; group < nIidGroups; group++) { +- /* Translate group to bin */ +- bin = hPsEncode->subband2parameterIndex[group]; +- +- /* Translate from 20 bins to 10 bins */ +- if (hPsEncode->psEncMode == PS_BANDS_COARSE) { +- bin >>= 1; +- } +- +- /* determine group border */ +- int bScale = hPsEncode->psBandNrgScale[bin]; +- +- FIXP_DBL pwrL_env_bin = pwrData->pwrL[env][bin]; +- FIXP_DBL pwrR_env_bin = pwrData->pwrR[env][bin]; +- FIXP_DBL pwrCr_env_bin = pwrData->pwrCr[env][bin]; +- FIXP_DBL pwrCi_env_bin = pwrData->pwrCi[env][bin]; +- +- int scale = (int)dynBandScale[bin]; +- for (col = envBorder[env]; col < envBorder[env + 1]; col++) { +- for (subband = hPsEncode->iidGroupBorders[group]; +- subband < hPsEncode->iidGroupBorders[group + 1]; subband++) { +- FIXP_DBL l_real = (hybridData[col][0][0][subband]) << scale; +- FIXP_DBL l_imag = (hybridData[col][0][1][subband]) << scale; +- FIXP_DBL r_real = (hybridData[col][1][0][subband]) << scale; +- FIXP_DBL r_imag = (hybridData[col][1][1][subband]) << scale; +- +- pwrL_env_bin += (fPow2Div2(l_real) + fPow2Div2(l_imag)) >> bScale; +- pwrR_env_bin += (fPow2Div2(r_real) + fPow2Div2(r_imag)) >> bScale; +- pwrCr_env_bin += +- (fMultDiv2(l_real, r_real) + fMultDiv2(l_imag, r_imag)) >> bScale; +- pwrCi_env_bin += +- (fMultDiv2(r_real, l_imag) - fMultDiv2(l_real, r_imag)) >> bScale; +- } +- } +- /* assure, nrg's of left and right channel are not negative; necessary on +- * 16 bit multiply units */ +- pwrData->pwrL[env][bin] = fixMax((FIXP_DBL)0, pwrL_env_bin); +- pwrData->pwrR[env][bin] = fixMax((FIXP_DBL)0, pwrR_env_bin); +- +- pwrData->pwrCr[env][bin] = pwrCr_env_bin; +- pwrData->pwrCi[env][bin] = pwrCi_env_bin; +- +- } /* nIidGroups */ +- +- /* calc logarithmic energy */ +- LdDataVector(pwrData->pwrL[env], pwrData->ldPwrL[env], psBands); +- LdDataVector(pwrData->pwrR[env], pwrData->ldPwrR[env], psBands); +- +- } /* nEnvelopes */ +- +- /* calculate iid and icc */ +- calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); +- calculateICC(pwrData->pwrL, pwrData->pwrR, pwrData->pwrCr, pwrData->pwrCi, +- icc, nEnvelopes, psBands); +- +- /*** Envelope Reduction ***/ +- while (envelopeReducible(iid, icc, psBands, nEnvelopes)) { +- int e = 0; +- /* sum energies of two neighboring envelopes */ +- nEnvelopes >>= 1; +- for (e = 0; e < nEnvelopes; e++) { +- FDKsbrEnc_addFIXP_DBL(pwrData->pwrL[2 * e], pwrData->pwrL[2 * e + 1], +- pwrData->pwrL[e], psBands); +- FDKsbrEnc_addFIXP_DBL(pwrData->pwrR[2 * e], pwrData->pwrR[2 * e + 1], +- pwrData->pwrR[e], psBands); +- FDKsbrEnc_addFIXP_DBL(pwrData->pwrCr[2 * e], pwrData->pwrCr[2 * e + 1], +- pwrData->pwrCr[e], psBands); +- FDKsbrEnc_addFIXP_DBL(pwrData->pwrCi[2 * e], pwrData->pwrCi[2 * e + 1], +- pwrData->pwrCi[e], psBands); +- +- /* calc logarithmic energy */ +- LdDataVector(pwrData->pwrL[e], pwrData->ldPwrL[e], psBands); +- LdDataVector(pwrData->pwrR[e], pwrData->ldPwrR[e], psBands); +- +- /* reduce number of envelopes and adjust borders */ +- envBorder[e] = envBorder[2 * e]; +- } +- envBorder[nEnvelopes] = envBorder[2 * nEnvelopes]; +- +- /* re-calculate iid and icc */ +- calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); +- calculateICC(pwrData->pwrL, pwrData->pwrR, pwrData->pwrCr, pwrData->pwrCi, +- icc, nEnvelopes, psBands); +- } +- +- /* */ +- if (sendHeader) { +- hPsData->headerCnt = MAX_PS_NOHEADER_CNT; +- hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; +- hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; +- hPsData->noEnvCnt = MAX_NOENV_CNT; +- } +- +- /*** Parameter processing, quantisation etc ***/ +- processIidData(hPsData, iid, psBands, nEnvelopes, +- hPsEncode->iidQuantErrorThreshold); +- processIccData(hPsData, icc, psBands, nEnvelopes); +- +- /*** Initialize output struct ***/ +- +- /* PS Header on/off ? */ +- if ((hPsData->headerCnt < MAX_PS_NOHEADER_CNT) && +- ((hPsData->iidQuantMode == hPsData->iidQuantModeLast) && +- (hPsData->iccQuantMode == hPsData->iccQuantModeLast)) && +- ((hPsData->iidEnable == hPsData->iidEnableLast) && +- (hPsData->iccEnable == hPsData->iccEnableLast))) { +- hPsOut->enablePSHeader = 0; +- } else { +- hPsOut->enablePSHeader = 1; +- hPsData->headerCnt = 0; +- } +- +- /* nEnvelopes = 0 ? */ +- if ((hPsData->noEnvCnt < MAX_NOENV_CNT) && +- (similarIid(hPsData, psBands, nEnvelopes)) && +- (similarIcc(hPsData, psBands, nEnvelopes))) { +- hPsOut->nEnvelopes = nEnvelopes = 0; +- hPsData->noEnvCnt++; +- } else { +- hPsData->noEnvCnt = 0; +- } +- +- if (nEnvelopes > 0) { +- hPsOut->enableIID = hPsData->iidEnable; +- hPsOut->iidMode = getIIDMode(psBands, hPsData->iidQuantMode); +- +- hPsOut->enableICC = hPsData->iccEnable; +- hPsOut->iccMode = getICCMode(psBands, hPsData->iccQuantMode); +- +- hPsOut->enableIpdOpd = 0; +- hPsOut->frameClass = 0; +- hPsOut->nEnvelopes = nEnvelopes; +- +- for (env = 0; env < nEnvelopes; env++) { +- hPsOut->frameBorder[env] = envBorder[env + 1]; +- hPsOut->deltaIID[env] = (PS_DELTA)hPsData->iidDiffMode[env]; +- hPsOut->deltaICC[env] = (PS_DELTA)hPsData->iccDiffMode[env]; +- for (band = 0; band < psBands; band++) { +- hPsOut->iid[env][band] = hPsData->iidIdx[env][band]; +- hPsOut->icc[env][band] = hPsData->iccIdx[env][band]; +- } +- } +- +- /* IPD OPD not supported right now */ +- FDKmemclear(hPsOut->ipd, +- PS_MAX_ENVELOPES * PS_MAX_BANDS * sizeof(PS_DELTA)); +- for (env = 0; env < PS_MAX_ENVELOPES; env++) { +- hPsOut->deltaIPD[env] = PS_DELTA_FREQ; +- hPsOut->deltaOPD[env] = PS_DELTA_FREQ; +- } +- +- FDKmemclear(hPsOut->ipdLast, PS_MAX_BANDS * sizeof(INT)); +- FDKmemclear(hPsOut->opdLast, PS_MAX_BANDS * sizeof(INT)); +- +- for (band = 0; band < PS_MAX_BANDS; band++) { +- hPsOut->iidLast[band] = hPsData->iidIdxLast[band]; +- hPsOut->iccLast[band] = hPsData->iccIdxLast[band]; +- } +- +- /* save iids and iccs for differential time coding in the next frame */ +- hPsData->nEnvelopesLast = nEnvelopes; +- hPsData->iidEnableLast = hPsData->iidEnable; +- hPsData->iccEnableLast = hPsData->iccEnable; +- hPsData->iidQuantModeLast = hPsData->iidQuantMode; +- hPsData->iccQuantModeLast = hPsData->iccQuantMode; +- for (i = 0; i < psBands; i++) { +- hPsData->iidIdxLast[i] = hPsData->iidIdx[nEnvelopes - 1][i]; +- hPsData->iccIdxLast[i] = hPsData->iccIdx[nEnvelopes - 1][i]; +- } +- } /* Envelope > 0 */ +- +- C_ALLOC_SCRATCH_END(pwrData, PS_PWR_DATA, 1) +- +- return error; +-} +diff --git a/libSBRenc/src/ps_encode.h b/libSBRenc/src/ps_encode.h +deleted file mode 100644 +index 4237a00..0000000 +--- a/libSBRenc/src/ps_encode.h ++++ /dev/null +@@ -1,185 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): M. Neuendorf, N. Rettelbach, M. Multrus +- +- Description: PS Parameter extraction, encoding +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief PS parameter extraction, encoding functions $Revision: 92790 $ +-*/ +- +-#ifndef PS_ENCODE_H +-#define PS_ENCODE_H +- +-#include "ps_const.h" +-#include "ps_bitenc.h" +- +-#define IID_SCALE_FT (64.f) /* maxVal in Quant tab is +/- 50 */ +-#define IID_SCALE 6 /* maxVal in Quant tab is +/- 50 */ +-#define IID_MAXVAL (1 << IID_SCALE) +- +-#define PS_QUANT_SCALE_FT \ +- (64.f) /* error smaller (64-25)/64 * 20 bands * 4 env -> QuantScale 64 */ +-#define PS_QUANT_SCALE \ +- 6 /* error smaller (64-25)/64 * 20 bands * 4 env -> QuantScale 6 bit */ +- +-#define QMF_GROUPS_LO_RES 12 +-#define SUBQMF_GROUPS_LO_RES 10 +-#define QMF_GROUPS_HI_RES 18 +-#define SUBQMF_GROUPS_HI_RES 30 +- +-typedef struct T_PS_DATA { +- INT iidEnable; +- INT iidEnableLast; +- INT iidQuantMode; +- INT iidQuantModeLast; +- INT iidDiffMode[PS_MAX_ENVELOPES]; +- INT iidIdx[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT iidIdxLast[PS_MAX_BANDS]; +- +- INT iccEnable; +- INT iccEnableLast; +- INT iccQuantMode; +- INT iccQuantModeLast; +- INT iccDiffMode[PS_MAX_ENVELOPES]; +- INT iccIdx[PS_MAX_ENVELOPES][PS_MAX_BANDS]; +- INT iccIdxLast[PS_MAX_BANDS]; +- +- INT nEnvelopesLast; +- +- INT headerCnt; +- INT iidTimeCnt; +- INT iccTimeCnt; +- INT noEnvCnt; +- +-} PS_DATA, *HANDLE_PS_DATA; +- +-typedef struct T_PS_ENCODE { +- PS_DATA psData; +- +- PS_BANDS psEncMode; +- INT nQmfIidGroups; +- INT nSubQmfIidGroups; +- INT iidGroupBorders[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES + 1]; +- INT subband2parameterIndex[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; +- UCHAR iidGroupWidthLd[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; +- FIXP_DBL iidQuantErrorThreshold; +- +- UCHAR psBandNrgScale[PS_MAX_BANDS]; +- +-} PS_ENCODE; +- +-typedef struct T_PS_ENCODE *HANDLE_PS_ENCODE; +- +-FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode(HANDLE_PS_ENCODE *phPsEncode); +- +-FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode(HANDLE_PS_ENCODE hPsEncode, +- const PS_BANDS psEncMode, +- const FIXP_DBL iidQuantErrorThreshold); +- +-FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode(HANDLE_PS_ENCODE *phPsEncode); +- +-FDK_PSENC_ERROR FDKsbrEnc_PSEncode( +- HANDLE_PS_ENCODE hPsEncode, HANDLE_PS_OUT hPsOut, UCHAR *dynBandScale, +- UINT maxEnvelopes, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], +- const INT frameSize, const INT sendHeader); +- +-#endif +diff --git a/libSBRenc/src/ps_main.cpp b/libSBRenc/src/ps_main.cpp +deleted file mode 100644 +index 4d7a7a5..0000000 +--- a/libSBRenc/src/ps_main.cpp ++++ /dev/null +@@ -1,606 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): M. Multrus +- +- Description: PS Wrapper, Downmix +- +-*******************************************************************************/ +- +-#include "ps_main.h" +- +-/* Includes ******************************************************************/ +-#include "ps_bitenc.h" +-#include "sbrenc_ram.h" +- +-/*--------------- function declarations --------------------*/ +-static void psFindBestScaling( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], +- UCHAR *dynBandScale, FIXP_DBL *maxBandValue, SCHAR *dmxScale); +- +-/*------------- function definitions ----------------*/ +-FDK_PSENC_ERROR PSEnc_Create(HANDLE_PARAMETRIC_STEREO *phParametricStereo) { +- FDK_PSENC_ERROR error = PSENC_OK; +- HANDLE_PARAMETRIC_STEREO hParametricStereo = NULL; +- +- if (phParametricStereo == NULL) { +- error = PSENC_INVALID_HANDLE; +- } else { +- int i; +- +- if (NULL == (hParametricStereo = GetRam_ParamStereo())) { +- error = PSENC_MEMORY_ERROR; +- goto bail; +- } +- FDKmemclear(hParametricStereo, sizeof(PARAMETRIC_STEREO)); +- +- if (PSENC_OK != +- (error = FDKsbrEnc_CreatePSEncode(&hParametricStereo->hPsEncode))) { +- error = PSENC_MEMORY_ERROR; +- goto bail; +- } +- +- for (i = 0; i < MAX_PS_CHANNELS; i++) { +- if (FDKhybridAnalysisOpen( +- &hParametricStereo->fdkHybAnaFilter[i], +- hParametricStereo->__staticHybAnaStatesLF[i], +- sizeof(hParametricStereo->__staticHybAnaStatesLF[i]), +- hParametricStereo->__staticHybAnaStatesHF[i], +- sizeof(hParametricStereo->__staticHybAnaStatesHF[i])) != 0) { +- error = PSENC_MEMORY_ERROR; +- goto bail; +- } +- } +- } +- +-bail: +- if (phParametricStereo != NULL) { +- *phParametricStereo = hParametricStereo; /* return allocated handle */ +- } +- +- if (error != PSENC_OK) { +- PSEnc_Destroy(phParametricStereo); +- } +- return error; +-} +- +-FDK_PSENC_ERROR PSEnc_Init(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- const HANDLE_PSENC_CONFIG hPsEncConfig, +- INT noQmfSlots, INT noQmfBands, UCHAR *dynamic_RAM) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if ((NULL == hParametricStereo) || (NULL == hPsEncConfig)) { +- error = PSENC_INVALID_HANDLE; +- } else { +- int ch, i; +- +- hParametricStereo->initPS = 1; +- hParametricStereo->noQmfSlots = noQmfSlots; +- hParametricStereo->noQmfBands = noQmfBands; +- +- /* clear delay lines */ +- FDKmemclear(hParametricStereo->qmfDelayLines, +- sizeof(hParametricStereo->qmfDelayLines)); +- +- hParametricStereo->qmfDelayScale = FRACT_BITS - 1; +- +- /* create configuration for hybrid filter bank */ +- for (ch = 0; ch < MAX_PS_CHANNELS; ch++) { +- FDKhybridAnalysisInit(&hParametricStereo->fdkHybAnaFilter[ch], +- THREE_TO_TEN, 64, 64, 1); +- } /* ch */ +- +- FDKhybridSynthesisInit(&hParametricStereo->fdkHybSynFilter, THREE_TO_TEN, +- 64, 64); +- +- /* determine average delay */ +- hParametricStereo->psDelay = +- (HYBRID_FILTER_DELAY * hParametricStereo->noQmfBands); +- +- if ((hPsEncConfig->maxEnvelopes < PSENC_NENV_1) || +- (hPsEncConfig->maxEnvelopes > PSENC_NENV_MAX)) { +- hPsEncConfig->maxEnvelopes = PSENC_NENV_DEFAULT; +- } +- hParametricStereo->maxEnvelopes = hPsEncConfig->maxEnvelopes; +- +- if (PSENC_OK != +- (error = FDKsbrEnc_InitPSEncode( +- hParametricStereo->hPsEncode, (PS_BANDS)hPsEncConfig->nStereoBands, +- hPsEncConfig->iidQuantErrorThreshold))) { +- goto bail; +- } +- +- for (ch = 0; ch < MAX_PS_CHANNELS; ch++) { +- FIXP_DBL *pDynReal = GetRam_Sbr_envRBuffer(ch, dynamic_RAM); +- FIXP_DBL *pDynImag = GetRam_Sbr_envIBuffer(ch, dynamic_RAM); +- +- for (i = 0; i < HYBRID_FRAMESIZE; i++) { +- hParametricStereo->pHybridData[i + HYBRID_READ_OFFSET][ch][0] = +- &pDynReal[i * MAX_HYBRID_BANDS]; +- hParametricStereo->pHybridData[i + HYBRID_READ_OFFSET][ch][1] = +- &pDynImag[i * MAX_HYBRID_BANDS]; +- ; +- } +- +- for (i = 0; i < HYBRID_READ_OFFSET; i++) { +- hParametricStereo->pHybridData[i][ch][0] = +- hParametricStereo->__staticHybridData[i][ch][0]; +- hParametricStereo->pHybridData[i][ch][1] = +- hParametricStereo->__staticHybridData[i][ch][1]; +- } +- } /* ch */ +- +- /* clear static hybrid buffer */ +- FDKmemclear(hParametricStereo->__staticHybridData, +- sizeof(hParametricStereo->__staticHybridData)); +- +- /* clear bs buffer */ +- FDKmemclear(hParametricStereo->psOut, sizeof(hParametricStereo->psOut)); +- +- hParametricStereo->psOut[0].enablePSHeader = +- 1; /* write ps header in first frame */ +- +- /* clear scaling buffer */ +- FDKmemclear(hParametricStereo->dynBandScale, sizeof(UCHAR) * PS_MAX_BANDS); +- FDKmemclear(hParametricStereo->maxBandValue, +- sizeof(FIXP_DBL) * PS_MAX_BANDS); +- +- } /* valid handle */ +-bail: +- return error; +-} +- +-FDK_PSENC_ERROR PSEnc_Destroy(HANDLE_PARAMETRIC_STEREO *phParametricStereo) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (NULL != phParametricStereo) { +- HANDLE_PARAMETRIC_STEREO hParametricStereo = *phParametricStereo; +- if (hParametricStereo != NULL) { +- FDKsbrEnc_DestroyPSEncode(&hParametricStereo->hPsEncode); +- FreeRam_ParamStereo(phParametricStereo); +- } +- } +- +- return error; +-} +- +-static FDK_PSENC_ERROR ExtractPSParameters( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, const int sendHeader, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2]) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (hParametricStereo == NULL) { +- error = PSENC_INVALID_HANDLE; +- } else { +- /* call ps encode function */ +- if (hParametricStereo->initPS) { +- hParametricStereo->psOut[1] = hParametricStereo->psOut[0]; +- } +- hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; +- +- if (PSENC_OK != +- (error = FDKsbrEnc_PSEncode( +- hParametricStereo->hPsEncode, &hParametricStereo->psOut[1], +- hParametricStereo->dynBandScale, hParametricStereo->maxEnvelopes, +- hybridData, hParametricStereo->noQmfSlots, sendHeader))) { +- goto bail; +- } +- +- if (hParametricStereo->initPS) { +- hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; +- hParametricStereo->initPS = 0; +- } +- } +-bail: +- return error; +-} +- +-static FDK_PSENC_ERROR DownmixPSQmfData( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_QMF_FILTER_BANK sbrSynthQmf, FIXP_DBL **RESTRICT mixRealQmfData, +- FIXP_DBL **RESTRICT mixImagQmfData, INT_PCM *downsampledOutSignal, +- const UINT downsampledOutSignalBufSize, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], +- const INT noQmfSlots, const INT psQmfScale[MAX_PS_CHANNELS], +- SCHAR *qmfScale) { +- FDK_PSENC_ERROR error = PSENC_OK; +- +- if (hParametricStereo == NULL) { +- error = PSENC_INVALID_HANDLE; +- } else { +- int n, k; +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 2 * 64) +- +- /* define scalings */ +- int dynQmfScale = fixMax( +- 0, hParametricStereo->dmxScale - +- 1); /* scale one bit more for addition of left and right */ +- int downmixScale = psQmfScale[0] - dynQmfScale; +- const FIXP_DBL maxStereoScaleFactor = MAXVAL_DBL; /* 2.f/2.f */ +- +- for (n = 0; n < noQmfSlots; n++) { +- FIXP_DBL tmpHybrid[2][MAX_HYBRID_BANDS]; +- +- for (k = 0; k < 71; k++) { +- int dynScale, sc; /* scaling */ +- FIXP_DBL tmpLeftReal, tmpRightReal, tmpLeftImag, tmpRightImag; +- FIXP_DBL tmpScaleFactor, stereoScaleFactor; +- +- tmpLeftReal = hybridData[n][0][0][k]; +- tmpLeftImag = hybridData[n][0][1][k]; +- tmpRightReal = hybridData[n][1][0][k]; +- tmpRightImag = hybridData[n][1][1][k]; +- +- sc = fixMax( +- 0, CntLeadingZeros(fixMax( +- fixMax(fixp_abs(tmpLeftReal), fixp_abs(tmpLeftImag)), +- fixMax(fixp_abs(tmpRightReal), fixp_abs(tmpRightImag)))) - +- 2); +- +- tmpLeftReal <<= sc; +- tmpLeftImag <<= sc; +- tmpRightReal <<= sc; +- tmpRightImag <<= sc; +- dynScale = fixMin(sc - dynQmfScale, DFRACT_BITS - 1); +- +- /* calc stereo scale factor to avoid loss of energy in bands */ +- /* stereo scale factor = min(2.0f, sqrt( (abs(l(k, n)^2 + abs(r(k, n)^2 +- * )))/(0.5f*abs(l(k, n) + r(k, n))) )) */ +- stereoScaleFactor = fPow2Div2(tmpLeftReal) + fPow2Div2(tmpLeftImag) + +- fPow2Div2(tmpRightReal) + fPow2Div2(tmpRightImag); +- +- /* might be that tmpScaleFactor becomes negative, so fabs(.) */ +- tmpScaleFactor = +- fixp_abs(stereoScaleFactor + fMult(tmpLeftReal, tmpRightReal) + +- fMult(tmpLeftImag, tmpRightImag)); +- +- /* min(2.0f, sqrt(stereoScaleFactor/(0.5f*tmpScaleFactor))) */ +- if ((stereoScaleFactor >> 1) < +- fMult(maxStereoScaleFactor, tmpScaleFactor)) { +- int sc_num = CountLeadingBits(stereoScaleFactor); +- int sc_denum = CountLeadingBits(tmpScaleFactor); +- sc = -(sc_num - sc_denum); +- +- tmpScaleFactor = schur_div((stereoScaleFactor << (sc_num)) >> 1, +- tmpScaleFactor << sc_denum, 16); +- +- /* prevent odd scaling for next sqrt calculation */ +- if (sc & 0x1) { +- sc++; +- tmpScaleFactor >>= 1; +- } +- stereoScaleFactor = sqrtFixp(tmpScaleFactor); +- stereoScaleFactor <<= (sc >> 1); +- } else { +- stereoScaleFactor = maxStereoScaleFactor; +- } +- +- /* write data to hybrid output */ +- tmpHybrid[0][k] = fMultDiv2(stereoScaleFactor, +- (FIXP_DBL)(tmpLeftReal + tmpRightReal)) >> +- dynScale; +- tmpHybrid[1][k] = fMultDiv2(stereoScaleFactor, +- (FIXP_DBL)(tmpLeftImag + tmpRightImag)) >> +- dynScale; +- +- } /* hybrid bands - k */ +- +- FDKhybridSynthesisApply(&hParametricStereo->fdkHybSynFilter, tmpHybrid[0], +- tmpHybrid[1], mixRealQmfData[n], +- mixImagQmfData[n]); +- +- qmfSynthesisFilteringSlot( +- sbrSynthQmf, mixRealQmfData[n], mixImagQmfData[n], downmixScale - 7, +- downmixScale - 7, +- downsampledOutSignal + (n * sbrSynthQmf->no_channels), 1, +- pWorkBuffer); +- +- } /* slots */ +- +- *qmfScale = -downmixScale + 7; +- +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2 * 64) +- +- { +- const INT noQmfSlots2 = hParametricStereo->noQmfSlots >> 1; +- const int noQmfBands = hParametricStereo->noQmfBands; +- +- INT scale, i, j, slotOffset; +- +- FIXP_DBL tmp[2][64]; +- +- for (i = 0; i < noQmfSlots2; i++) { +- FDKmemcpy(tmp[0], hParametricStereo->qmfDelayLines[0][i], +- noQmfBands * sizeof(FIXP_DBL)); +- FDKmemcpy(tmp[1], hParametricStereo->qmfDelayLines[1][i], +- noQmfBands * sizeof(FIXP_DBL)); +- +- FDKmemcpy(hParametricStereo->qmfDelayLines[0][i], +- mixRealQmfData[i + noQmfSlots2], +- noQmfBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hParametricStereo->qmfDelayLines[1][i], +- mixImagQmfData[i + noQmfSlots2], +- noQmfBands * sizeof(FIXP_DBL)); +- +- FDKmemcpy(mixRealQmfData[i + noQmfSlots2], mixRealQmfData[i], +- noQmfBands * sizeof(FIXP_DBL)); +- FDKmemcpy(mixImagQmfData[i + noQmfSlots2], mixImagQmfData[i], +- noQmfBands * sizeof(FIXP_DBL)); +- +- FDKmemcpy(mixRealQmfData[i], tmp[0], noQmfBands * sizeof(FIXP_DBL)); +- FDKmemcpy(mixImagQmfData[i], tmp[1], noQmfBands * sizeof(FIXP_DBL)); +- } +- +- if (hParametricStereo->qmfDelayScale > *qmfScale) { +- scale = hParametricStereo->qmfDelayScale - *qmfScale; +- slotOffset = 0; +- } else { +- scale = *qmfScale - hParametricStereo->qmfDelayScale; +- slotOffset = noQmfSlots2; +- } +- +- for (i = 0; i < noQmfSlots2; i++) { +- for (j = 0; j < noQmfBands; j++) { +- mixRealQmfData[i + slotOffset][j] >>= scale; +- mixImagQmfData[i + slotOffset][j] >>= scale; +- } +- } +- +- scale = *qmfScale; +- *qmfScale = fMin(*qmfScale, hParametricStereo->qmfDelayScale); +- hParametricStereo->qmfDelayScale = scale; +- } +- +- } /* valid handle */ +- +- return error; +-} +- +-INT FDKsbrEnc_PSEnc_WritePSData(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_FDK_BITSTREAM hBitstream) { +- return ( +- (hParametricStereo != NULL) +- ? FDKsbrEnc_WritePSBitstream(&hParametricStereo->psOut[0], hBitstream) +- : 0); +-} +- +-FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, INT_PCM *samples[2], +- UINT samplesBufSize, QMF_FILTER_BANK **hQmfAnalysis, +- FIXP_DBL **RESTRICT downmixedRealQmfData, +- FIXP_DBL **RESTRICT downmixedImagQmfData, INT_PCM *downsampledOutSignal, +- HANDLE_QMF_FILTER_BANK sbrSynthQmf, SCHAR *qmfScale, const int sendHeader) { +- FDK_PSENC_ERROR error = PSENC_OK; +- INT psQmfScale[MAX_PS_CHANNELS] = {0}; +- int psCh, i; +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 4 * 64) +- +- for (psCh = 0; psCh < MAX_PS_CHANNELS; psCh++) { +- for (i = 0; i < hQmfAnalysis[psCh]->no_col; i++) { +- qmfAnalysisFilteringSlot( +- hQmfAnalysis[psCh], &pWorkBuffer[2 * 64], /* qmfReal[64] */ +- &pWorkBuffer[3 * 64], /* qmfImag[64] */ +- samples[psCh] + i * hQmfAnalysis[psCh]->no_channels, 1, +- &pWorkBuffer[0 * 64] /* qmf workbuffer 2*64 */ +- ); +- +- FDKhybridAnalysisApply( +- &hParametricStereo->fdkHybAnaFilter[psCh], +- &pWorkBuffer[2 * 64], /* qmfReal[64] */ +- &pWorkBuffer[3 * 64], /* qmfImag[64] */ +- hParametricStereo->pHybridData[i + HYBRID_READ_OFFSET][psCh][0], +- hParametricStereo->pHybridData[i + HYBRID_READ_OFFSET][psCh][1]); +- +- } /* no_col loop i */ +- +- psQmfScale[psCh] = hQmfAnalysis[psCh]->outScalefactor; +- +- } /* for psCh */ +- +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 4 * 64) +- +- /* find best scaling in new QMF and Hybrid data */ +- psFindBestScaling( +- hParametricStereo, &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], +- hParametricStereo->dynBandScale, hParametricStereo->maxBandValue, +- &hParametricStereo->dmxScale); +- +- /* extract the ps parameters */ +- if (PSENC_OK != +- (error = ExtractPSParameters(hParametricStereo, sendHeader, +- &hParametricStereo->pHybridData[0]))) { +- goto bail; +- } +- +- /* save hybrid date for next frame */ +- for (i = 0; i < HYBRID_READ_OFFSET; i++) { +- FDKmemcpy( +- hParametricStereo->pHybridData[i][0][0], +- hParametricStereo->pHybridData[hParametricStereo->noQmfSlots + i][0][0], +- MAX_HYBRID_BANDS * sizeof(FIXP_DBL)); /* left, real */ +- FDKmemcpy( +- hParametricStereo->pHybridData[i][0][1], +- hParametricStereo->pHybridData[hParametricStereo->noQmfSlots + i][0][1], +- MAX_HYBRID_BANDS * sizeof(FIXP_DBL)); /* left, imag */ +- FDKmemcpy( +- hParametricStereo->pHybridData[i][1][0], +- hParametricStereo->pHybridData[hParametricStereo->noQmfSlots + i][1][0], +- MAX_HYBRID_BANDS * sizeof(FIXP_DBL)); /* right, real */ +- FDKmemcpy( +- hParametricStereo->pHybridData[i][1][1], +- hParametricStereo->pHybridData[hParametricStereo->noQmfSlots + i][1][1], +- MAX_HYBRID_BANDS * sizeof(FIXP_DBL)); /* right, imag */ +- } +- +- /* downmix and hybrid synthesis */ +- if (PSENC_OK != +- (error = DownmixPSQmfData( +- hParametricStereo, sbrSynthQmf, downmixedRealQmfData, +- downmixedImagQmfData, downsampledOutSignal, samplesBufSize, +- &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], +- hParametricStereo->noQmfSlots, psQmfScale, qmfScale))) { +- goto bail; +- } +- +-bail: +- +- return error; +-} +- +-static void psFindBestScaling( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, +- FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], +- UCHAR *dynBandScale, FIXP_DBL *maxBandValue, SCHAR *dmxScale) { +- HANDLE_PS_ENCODE hPsEncode = hParametricStereo->hPsEncode; +- +- INT group, bin, col, band; +- const INT frameSize = hParametricStereo->noQmfSlots; +- const INT psBands = (INT)hPsEncode->psEncMode; +- const INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; +- +- /* group wise scaling */ +- FIXP_DBL maxVal[2][PS_MAX_BANDS]; +- FIXP_DBL maxValue = FL2FXCONST_DBL(0.f); +- +- FDKmemclear(maxVal, sizeof(maxVal)); +- +- /* start with hybrid data */ +- for (group = 0; group < nIidGroups; group++) { +- /* Translate group to bin */ +- bin = hPsEncode->subband2parameterIndex[group]; +- +- /* Translate from 20 bins to 10 bins */ +- if (hPsEncode->psEncMode == PS_BANDS_COARSE) { +- bin >>= 1; +- } +- +- /* QMF downmix scaling */ +- for (col = 0; col < frameSize; col++) { +- int i, section = (col < frameSize - HYBRID_READ_OFFSET) ? 0 : 1; +- FIXP_DBL tmp = maxVal[section][bin]; +- for (i = hPsEncode->iidGroupBorders[group]; +- i < hPsEncode->iidGroupBorders[group + 1]; i++) { +- tmp = fixMax(tmp, (FIXP_DBL)fixp_abs(hybridData[col][0][0][i])); +- tmp = fixMax(tmp, (FIXP_DBL)fixp_abs(hybridData[col][0][1][i])); +- tmp = fixMax(tmp, (FIXP_DBL)fixp_abs(hybridData[col][1][0][i])); +- tmp = fixMax(tmp, (FIXP_DBL)fixp_abs(hybridData[col][1][1][i])); +- } +- maxVal[section][bin] = tmp; +- } +- } /* nIidGroups */ +- +- /* convert maxSpec to maxScaling, find scaling space */ +- for (band = 0; band < psBands; band++) { +-#ifndef MULT_16x16 +- dynBandScale[band] = +- CountLeadingBits(fixMax(maxVal[0][band], maxBandValue[band])); +-#else +- dynBandScale[band] = fixMax( +- 0, CountLeadingBits(fixMax(maxVal[0][band], maxBandValue[band])) - +- FRACT_BITS); +-#endif +- maxValue = fixMax(maxValue, fixMax(maxVal[0][band], maxVal[1][band])); +- maxBandValue[band] = fixMax(maxVal[0][band], maxVal[1][band]); +- } +- +- /* calculate maximal scaling for QMF downmix */ +-#ifndef MULT_16x16 +- *dmxScale = fixMin(DFRACT_BITS, CountLeadingBits(maxValue)); +-#else +- *dmxScale = fixMax(0, fixMin(FRACT_BITS, CountLeadingBits((maxValue)))); +-#endif +-} +diff --git a/libSBRenc/src/ps_main.h b/libSBRenc/src/ps_main.h +deleted file mode 100644 +index 88b2993..0000000 +--- a/libSBRenc/src/ps_main.h ++++ /dev/null +@@ -1,270 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): Markus Multrus +- +- Description: PS Wrapper, Downmix header file +- +-*******************************************************************************/ +- +-#ifndef PS_MAIN_H +-#define PS_MAIN_H +- +-/* Includes ******************************************************************/ +- +-#include "sbr_def.h" +-#include "qmf.h" +-#include "ps_encode.h" +-#include "FDK_bitstream.h" +-#include "FDK_hybrid.h" +- +-/* Data Types ****************************************************************/ +-typedef enum { +- PSENC_STEREO_BANDS_INVALID = 0, +- PSENC_STEREO_BANDS_10 = 10, +- PSENC_STEREO_BANDS_20 = 20 +- +-} PSENC_STEREO_BANDS_CONFIG; +- +-typedef enum { +- PSENC_NENV_1 = 1, +- PSENC_NENV_2 = 2, +- PSENC_NENV_4 = 4, +- PSENC_NENV_DEFAULT = PSENC_NENV_2, +- PSENC_NENV_MAX = PSENC_NENV_4 +- +-} PSENC_NENV_CONFIG; +- +-typedef struct { +- UINT bitrateFrom; /* inclusive */ +- UINT bitrateTo; /* exclusive */ +- PSENC_STEREO_BANDS_CONFIG nStereoBands; +- PSENC_NENV_CONFIG nEnvelopes; +- LONG iidQuantErrorThreshold; /* quantization threshold to switch between +- coarse and fine iid quantization */ +- +-} psTuningTable_t; +- +-/* Function / Class Declarations *********************************************/ +- +-typedef struct T_PARAMETRIC_STEREO { +- HANDLE_PS_ENCODE hPsEncode; +- PS_OUT psOut[2]; +- +- FIXP_DBL __staticHybridData[HYBRID_READ_OFFSET][MAX_PS_CHANNELS][2] +- [MAX_HYBRID_BANDS]; +- FIXP_DBL +- *pHybridData[HYBRID_READ_OFFSET + HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2]; +- +- FIXP_DBL qmfDelayLines[2][32 >> 1][64]; +- int qmfDelayScale; +- +- INT psDelay; +- UINT maxEnvelopes; +- UCHAR dynBandScale[PS_MAX_BANDS]; +- FIXP_DBL maxBandValue[PS_MAX_BANDS]; +- SCHAR dmxScale; +- INT initPS; +- INT noQmfSlots; +- INT noQmfBands; +- +- FIXP_DBL __staticHybAnaStatesLF[MAX_PS_CHANNELS][2 * HYBRID_FILTER_LENGTH * +- HYBRID_MAX_QMF_BANDS]; +- FIXP_DBL __staticHybAnaStatesHF[MAX_PS_CHANNELS][2 * HYBRID_FILTER_DELAY * +- (64 - HYBRID_MAX_QMF_BANDS)]; +- FDK_ANA_HYB_FILTER fdkHybAnaFilter[MAX_PS_CHANNELS]; +- FDK_SYN_HYB_FILTER fdkHybSynFilter; +- +-} PARAMETRIC_STEREO; +- +-typedef struct T_PSENC_CONFIG { +- INT frameSize; +- INT qmfFilterMode; +- INT sbrPsDelay; +- PSENC_STEREO_BANDS_CONFIG nStereoBands; +- PSENC_NENV_CONFIG maxEnvelopes; +- FIXP_DBL iidQuantErrorThreshold; +- +-} PSENC_CONFIG, *HANDLE_PSENC_CONFIG; +- +-typedef struct T_PARAMETRIC_STEREO *HANDLE_PARAMETRIC_STEREO; +- +-/** +- * \brief Create a parametric stereo encoder instance. +- * +- * \param phParametricStereo A pointer to a parametric stereo handle to be +- * allocated. Initialized on return. +- * +- * \return +- * - PSENC_OK, on succes. +- * - PSENC_INVALID_HANDLE, PSENC_MEMORY_ERROR, on failure. +- */ +-FDK_PSENC_ERROR PSEnc_Create(HANDLE_PARAMETRIC_STEREO *phParametricStereo); +- +-/** +- * \brief Initialize a parametric stereo encoder instance. +- * +- * \param hParametricStereo Meta Data handle. +- * \param hPsEncConfig Filled parametric stereo configuration +- * structure. +- * \param noQmfSlots Number of slots within one audio frame. +- * \param noQmfBands Number of QMF bands. +- * \param dynamic_RAM Pointer to preallocated workbuffer. +- * +- * \return +- * - PSENC_OK, on succes. +- * - PSENC_INVALID_HANDLE, PSENC_INIT_ERROR, on failure. +- */ +-FDK_PSENC_ERROR PSEnc_Init(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- const HANDLE_PSENC_CONFIG hPsEncConfig, +- INT noQmfSlots, INT noQmfBands, UCHAR *dynamic_RAM); +- +-/** +- * \brief Destroy parametric stereo encoder instance. +- * +- * Deallocate instance and free whole memory. +- * +- * \param phParametricStereo Pointer to the parametric stereo handle to be +- * deallocated. +- * +- * \return +- * - PSENC_OK, on succes. +- * - PSENC_INVALID_HANDLE, on failure. +- */ +-FDK_PSENC_ERROR PSEnc_Destroy(HANDLE_PARAMETRIC_STEREO *phParametricStereo); +- +-/** +- * \brief Apply parametric stereo processing. +- * +- * \param hParametricStereo Meta Data handle. +- * \param samples Pointer to 2 channel audio input signal. +- * \param timeInStride, Stride factor of input buffer. +- * \param hQmfAnalysis, Pointer to QMF analysis filterbanks. +- * \param downmixedRealQmfData Pointer to real QMF buffer to be written to. +- * \param downmixedImagQmfData Pointer to imag QMF buffer to be written to. +- * \param downsampledOutSignal Pointer to buffer where to write downmixed +- * timesignal. +- * \param sbrSynthQmf Pointer to QMF synthesis filterbank. +- * \param qmfScale Return scaling factor of the qmf data. +- * \param sendHeader Signal whether to write header data. +- * +- * \return +- * - PSENC_OK, on succes. +- * - PSENC_INVALID_HANDLE, PSENC_ENCODE_ERROR, on failure. +- */ +-FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( +- HANDLE_PARAMETRIC_STEREO hParametricStereo, INT_PCM *samples[2], +- UINT timeInStride, QMF_FILTER_BANK **hQmfAnalysis, +- FIXP_DBL **RESTRICT downmixedRealQmfData, +- FIXP_DBL **RESTRICT downmixedImagQmfData, INT_PCM *downsampledOutSignal, +- HANDLE_QMF_FILTER_BANK sbrSynthQmf, SCHAR *qmfScale, const int sendHeader); +- +-/** +- * \brief Write parametric stereo bitstream. +- * +- * Write ps_data() element to bitstream and return number of written bits. +- * Returns number of written bits only, if hBitstream == NULL. +- * +- * \param hParametricStereo Meta Data handle. +- * \param hBitstream Bitstream buffer handle. +- * +- * \return +- * - number of written bits. +- */ +-INT FDKsbrEnc_PSEnc_WritePSData(HANDLE_PARAMETRIC_STEREO hParametricStereo, +- HANDLE_FDK_BITSTREAM hBitstream); +- +-#endif /* PS_MAIN_H */ +diff --git a/libSBRenc/src/resampler.cpp b/libSBRenc/src/resampler.cpp +deleted file mode 100644 +index b1781a7..0000000 +--- a/libSBRenc/src/resampler.cpp ++++ /dev/null +@@ -1,444 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief FDK resampler tool box:$Revision: 91655 $ +- \author M. Werner +-*/ +- +-#include "resampler.h" +- +-#include "genericStds.h" +- +-/**************************************************************************/ +-/* BIQUAD Filter Specifications */ +-/**************************************************************************/ +- +-#define B1 0 +-#define B2 1 +-#define A1 2 +-#define A2 3 +- +-#define BQC(x) FL2FXCONST_SGL(x / 2) +- +-struct FILTER_PARAM { +- const FIXP_SGL *coeffa; /*! SOS matrix One row/section. Scaled using BQC(). +- Order of coefficients: B1,B2,A1,A2. B0=A0=1.0 */ +- FIXP_DBL g; /*! overall gain */ +- int Wc; /*! normalized passband bandwidth at input samplerate * 1000 */ +- int noCoeffs; /*! number of filter coeffs */ +- int delay; /*! delay in samples at input samplerate */ +-}; +- +-#define BIQUAD_COEFSTEP 4 +- +-/** +- *\brief Low Pass +- Wc = 0,5, order 30, Stop Band -96dB. Wc criteria is "almost 0dB passband", not +- the usual -3db gain point. [b,a]=cheby2(30,96,0.505) [sos,g]=tf2sos(b,a) +- bandwidth 0.48 +- */ +-static const FIXP_SGL sos48[] = { +- BQC(1.98941075681938), BQC(0.999999996890811), +- BQC(0.863264527201963), BQC(0.189553799960663), +- BQC(1.90733804822445), BQC(1.00000001736189), +- BQC(0.836321575841691), BQC(0.203505809266564), +- BQC(1.75616665495325), BQC(0.999999946079721), +- BQC(0.784699225121588), BQC(0.230471265506986), +- BQC(1.55727745512726), BQC(1.00000011737815), +- BQC(0.712515423588351), BQC(0.268752723900498), +- BQC(1.33407591943643), BQC(0.999999795953228), +- BQC(0.625059117330989), BQC(0.316194685288965), +- BQC(1.10689898412458), BQC(1.00000035057114), +- BQC(0.52803514366398), BQC(0.370517843224669), +- BQC(0.89060371078454), BQC(0.999999343962822), +- BQC(0.426920462165257), BQC(0.429608200207746), +- BQC(0.694438261209433), BQC(1.0000008629792), +- BQC(0.326530699561716), BQC(0.491714450654174), +- BQC(0.523237800935322), BQC(1.00000101349782), +- BQC(0.230829556274851), BQC(0.555559034843281), +- BQC(0.378631165929563), BQC(0.99998986482665), +- BQC(0.142906422036095), BQC(0.620338874442411), +- BQC(0.260786911308437), BQC(1.00003261460178), +- BQC(0.0651008576256505), BQC(0.685759923926262), +- BQC(0.168409429188098), BQC(0.999933049695828), +- BQC(-0.000790067789975562), BQC(0.751905896602325), +- BQC(0.100724533818628), BQC(1.00009472669872), +- BQC(-0.0533772830257041), BQC(0.81930744384525), +- BQC(0.0561434357867363), BQC(0.999911636304276), +- BQC(-0.0913550299236405), BQC(0.88883625875915), +- BQC(0.0341680678662057), BQC(1.00003667508676), +- BQC(-0.113405185536697), BQC(0.961756638268446)}; +- +-static const FIXP_DBL g48 = +- FL2FXCONST_DBL(0.002712866530047) - (FIXP_DBL)0x8000; +- +-static const struct FILTER_PARAM param_set48 = { +- sos48, g48, 480, 15, 4 /* LF 2 */ +-}; +- +-/** +- *\brief Low Pass +- Wc = 0,5, order 24, Stop Band -96dB. Wc criteria is "almost 0dB passband", not +- the usual -3db gain point. [b,a]=cheby2(24,96,0.5) [sos,g]=tf2sos(b,a) +- bandwidth 0.45 +- */ +-static const FIXP_SGL sos45[] = { +- BQC(1.982962601444), BQC(1.00000000007504), BQC(0.646113303737836), +- BQC(0.10851149979981), BQC(1.85334094281111), BQC(0.999999999677192), +- BQC(0.612073220102006), BQC(0.130022141698044), BQC(1.62541051415425), +- BQC(1.00000000080398), BQC(0.547879702855959), BQC(0.171165825133192), +- BQC(1.34554656923247), BQC(0.9999999980169), BQC(0.460373914508491), +- BQC(0.228677463376354), BQC(1.05656568503116), BQC(1.00000000569363), +- BQC(0.357891894038287), BQC(0.298676843912185), BQC(0.787967587877312), +- BQC(0.999999984415017), BQC(0.248826893211877), BQC(0.377441803512978), +- BQC(0.555480971120497), BQC(1.00000003583307), BQC(0.140614263345315), +- BQC(0.461979302213679), BQC(0.364986207070964), BQC(0.999999932084303), +- BQC(0.0392669446074516), BQC(0.55033451180825), BQC(0.216827267631558), +- BQC(1.00000010534682), BQC(-0.0506232228865103), BQC(0.641691581560946), +- BQC(0.108951672277119), BQC(0.999999871167516), BQC(-0.125584840183225), +- BQC(0.736367748771803), BQC(0.0387988607229035), BQC(1.00000011205574), +- BQC(-0.182814849097974), BQC(0.835802108714964), BQC(0.0042866175809225), +- BQC(0.999999954830813), BQC(-0.21965740617151), BQC(0.942623047782363)}; +- +-static const FIXP_DBL g45 = +- FL2FXCONST_DBL(0.00242743980909524) - (FIXP_DBL)0x8000; +- +-static const struct FILTER_PARAM param_set45 = { +- sos45, g45, 450, 12, 4 /* LF 2 */ +-}; +- +-/* +- Created by Octave 2.1.73, Mon Oct 13 17:31:32 2008 CEST +- Wc = 0,5, order 16, Stop Band -96dB damping. +- [b,a]=cheby2(16,96,0.5) +- [sos,g]=tf2sos(b,a) +- bandwidth = 0.41 +- */ +- +-static const FIXP_SGL sos41[] = { +- BQC(1.96193625292), BQC(0.999999999999964), BQC(0.169266178786789), +- BQC(0.0128823300475907), BQC(1.68913437662092), BQC(1.00000000000053), +- BQC(0.124751503206552), BQC(0.0537472273950989), BQC(1.27274692366017), +- BQC(0.999999999995674), BQC(0.0433108625178357), BQC(0.131015753236317), +- BQC(0.85214175088395), BQC(1.00000000001813), BQC(-0.0625658152550408), +- BQC(0.237763778993806), BQC(0.503841579939009), BQC(0.999999999953223), +- BQC(-0.179176128722865), BQC(0.367475236424474), BQC(0.249990711986162), +- BQC(1.00000000007952), BQC(-0.294425165824676), BQC(0.516594857170212), +- BQC(0.087971668680286), BQC(0.999999999915528), BQC(-0.398956566777928), +- BQC(0.686417767801123), BQC(0.00965373325350294), BQC(1.00000000003744), +- BQC(-0.48579173764817), BQC(0.884931534239068)}; +- +-static const FIXP_DBL g41 = FL2FXCONST_DBL(0.00155956951169248); +- +-static const struct FILTER_PARAM param_set41 = { +- sos41, g41, 410, 8, 5 /* LF 3 */ +-}; +- +-/* +- # Created by Octave 2.1.73, Mon Oct 13 17:55:33 2008 CEST +- Wc = 0,5, order 12, Stop Band -96dB damping. +- [b,a]=cheby2(12,96,0.5); +- [sos,g]=tf2sos(b,a) +-*/ +-static const FIXP_SGL sos35[] = { +- BQC(1.93299325235762), BQC(0.999999999999985), BQC(-0.140733187246596), +- BQC(0.0124139497836062), BQC(1.4890416764109), BQC(1.00000000000011), +- BQC(-0.198215402588504), BQC(0.0746730616584138), BQC(0.918450161309795), +- BQC(0.999999999999619), BQC(-0.30133912791941), BQC(0.192276468839529), +- BQC(0.454877024246818), BQC(1.00000000000086), BQC(-0.432337328809815), +- BQC(0.356852933642815), BQC(0.158017147118507), BQC(0.999999999998876), +- BQC(-0.574817494249777), BQC(0.566380436970833), BQC(0.0171834649478749), +- BQC(1.00000000000055), BQC(-0.718581178041165), BQC(0.83367484487889)}; +- +-static const FIXP_DBL g35 = FL2FXCONST_DBL(0.00162580994125131); +- +-static const struct FILTER_PARAM param_set35 = {sos35, g35, 350, 6, 4}; +- +-/* +- # Created by Octave 2.1.73, Mon Oct 13 18:15:38 2008 CEST +- Wc = 0,5, order 8, Stop Band -96dB damping. +- [b,a]=cheby2(8,96,0.5); +- [sos,g]=tf2sos(b,a) +-*/ +-static const FIXP_SGL sos25[] = { +- BQC(1.85334094301225), BQC(1.0), +- BQC(-0.702127214212663), BQC(0.132452403998767), +- BQC(1.056565682167), BQC(0.999999999999997), +- BQC(-0.789503667880785), BQC(0.236328693569128), +- BQC(0.364986307455489), BQC(0.999999999999996), +- BQC(-0.955191189843375), BQC(0.442966457936379), +- BQC(0.0387985751642125), BQC(1.0), +- BQC(-1.19817786088084), BQC(0.770493895456328)}; +- +-static const FIXP_DBL g25 = FL2FXCONST_DBL(0.000945182835294559); +- +-static const struct FILTER_PARAM param_set25 = {sos25, g25, 250, 4, 5}; +- +-/* Must be sorted in descending order */ +-static const struct FILTER_PARAM *const filter_paramSet[] = { +- ¶m_set48, ¶m_set45, ¶m_set41, ¶m_set35, ¶m_set25}; +- +-/**************************************************************************/ +-/* Resampler Functions */ +-/**************************************************************************/ +- +-/*! +- \brief Reset downsampler instance and clear delay lines +- +- \return success of operation +-*/ +- +-INT FDKaacEnc_InitDownsampler( +- DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ +- int Wc, /*!< normalized cutoff freq * 1000* */ +- int ratio) /*!< downsampler ratio */ +- +-{ +- UINT i; +- const struct FILTER_PARAM *currentSet = NULL; +- +- FDKmemclear(DownSampler->downFilter.states, +- sizeof(DownSampler->downFilter.states)); +- DownSampler->downFilter.ptr = 0; +- +- /* +- find applicable parameter set +- */ +- currentSet = filter_paramSet[0]; +- for (i = 1; i < sizeof(filter_paramSet) / sizeof(struct FILTER_PARAM *); +- i++) { +- if (filter_paramSet[i]->Wc <= Wc) { +- break; +- } +- currentSet = filter_paramSet[i]; +- } +- +- DownSampler->downFilter.coeffa = currentSet->coeffa; +- +- DownSampler->downFilter.gain = currentSet->g; +- FDK_ASSERT(currentSet->noCoeffs <= MAXNR_SECTIONS * 2); +- +- DownSampler->downFilter.noCoeffs = currentSet->noCoeffs; +- DownSampler->delay = currentSet->delay; +- DownSampler->downFilter.Wc = currentSet->Wc; +- +- DownSampler->ratio = ratio; +- DownSampler->pending = ratio - 1; +- return (1); +-} +- +-/*! +- \brief faster simple folding operation +- Filter: +- H(z) = A(z)/B(z) +- with +- A(z) = a[0]*z^0 + a[1]*z^1 + a[2]*z^2 ... a[n]*z^n +- +- \return filtered value +-*/ +- +-static inline INT_PCM AdvanceFilter( +- LP_FILTER *downFilter, /*!< pointer to iir filter instance */ +- INT_PCM *pInput, /*!< input of filter */ +- int downRatio) { +- INT_PCM output; +- int i, n; +- +-#define BIQUAD_SCALE 12 +- +- FIXP_DBL y = FL2FXCONST_DBL(0.0f); +- FIXP_DBL input; +- +- for (n = 0; n < downRatio; n++) { +- FIXP_BQS(*states)[2] = downFilter->states; +- const FIXP_SGL *coeff = downFilter->coeffa; +- int s1, s2; +- +- s1 = downFilter->ptr; +- s2 = s1 ^ 1; +- +-#if (SAMPLE_BITS == 16) +- input = ((FIXP_DBL)pInput[n]) << (DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE); +-#elif (SAMPLE_BITS == 32) +- input = pInput[n] >> BIQUAD_SCALE; +-#else +-#error NOT IMPLEMENTED +-#endif +- +- FIXP_BQS state1, state2, state1b, state2b; +- +- state1 = states[0][s1]; +- state2 = states[0][s2]; +- +- /* Loop over sections */ +- for (i = 0; i < downFilter->noCoeffs; i++) { +- FIXP_DBL state0; +- +- /* Load merged states (from next section) */ +- state1b = states[i + 1][s1]; +- state2b = states[i + 1][s2]; +- +- state0 = input + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]); +- y = state0 - fMult(state1b, coeff[A1]) - fMult(state2b, coeff[A2]); +- +- /* Store new feed forward merge state */ +- states[i + 1][s2] = y << 1; +- /* Store new feed backward state */ +- states[i][s2] = input << 1; +- +- /* Feedback output to next section. */ +- input = y; +- +- /* Transfer merged states */ +- state1 = state1b; +- state2 = state2b; +- +- /* Step to next coef set */ +- coeff += BIQUAD_COEFSTEP; +- } +- downFilter->ptr ^= 1; +- } +- /* Apply global gain */ +- y = fMult(y, downFilter->gain); +- +- /* Apply final gain/scaling to output */ +-#if (SAMPLE_BITS == 16) +- output = (INT_PCM)SATURATE_RIGHT_SHIFT( +- y + (FIXP_DBL)(1 << (DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE - 1)), +- DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE, SAMPLE_BITS); +- // output = (INT_PCM) SATURATE_RIGHT_SHIFT(y, +- // DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS); +-#else +- output = SATURATE_LEFT_SHIFT(y, BIQUAD_SCALE, SAMPLE_BITS); +-#endif +- +- return output; +-} +- +-/*! +- \brief FDKaacEnc_Downsample numInSamples of type INT_PCM +- Returns number of output samples in numOutSamples +- +- \return success of operation +-*/ +- +-INT FDKaacEnc_Downsample( +- DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ +- INT_PCM *inSamples, /*!< pointer to input samples */ +- INT numInSamples, /*!< number of input samples */ +- INT_PCM *outSamples, /*!< pointer to output samples */ +- INT *numOutSamples /*!< pointer tp number of output samples */ +-) { +- INT i; +- *numOutSamples = 0; +- +- for (i = 0; i < numInSamples; i += DownSampler->ratio) { +- *outSamples = AdvanceFilter(&(DownSampler->downFilter), &inSamples[i], +- DownSampler->ratio); +- outSamples++; +- } +- *numOutSamples = numInSamples / DownSampler->ratio; +- +- return 0; +-} +diff --git a/libSBRenc/src/resampler.h b/libSBRenc/src/resampler.h +deleted file mode 100644 +index 7aa1cae..0000000 +--- a/libSBRenc/src/resampler.h ++++ /dev/null +@@ -1,159 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#ifndef RESAMPLER_H +-#define RESAMPLER_H +-/*! +- \file +- \brief Fixed Point Resampler Tool Box $Revision: 92790 $ +-*/ +- +-#include "common_fix.h" +- +-/**************************************************************************/ +-/* BIQUAD Filter Structure */ +-/**************************************************************************/ +- +-#define MAXNR_SECTIONS (15) +- +-typedef FIXP_DBL FIXP_BQS; +- +-typedef struct { +- FIXP_BQS states[MAXNR_SECTIONS + 1][2]; /*! state buffer */ +- const FIXP_SGL *coeffa; /*! pointer to filter coeffs */ +- FIXP_DBL gain; /*! overall gain factor */ +- int Wc; /*! normalized cutoff freq * 1000 */ +- int noCoeffs; /*! number of filter coeffs sets */ +- int ptr; /*! index to rinbuffers */ +-} LP_FILTER; +- +-/**************************************************************************/ +-/* Downsampler Structure */ +-/**************************************************************************/ +- +-typedef struct { +- LP_FILTER downFilter; /*! filter instance */ +- int ratio; /*! downsampling ration */ +- int delay; /*! downsampling delay (source fs) */ +- int pending; /*! number of pending output samples */ +-} DOWNSAMPLER; +- +-/** +- * \brief Initialized a given downsampler structure. +- */ +-INT FDKaacEnc_InitDownsampler( +- DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ +- INT Wc, /*!< normalized cutoff freq * 1000 */ +- INT ratio); /*!< downsampler ratio */ +- +-/** +- * \brief Downsample a set of audio samples. numInSamples must be at least equal +- * to the downsampler ratio. +- */ +-INT FDKaacEnc_Downsample( +- DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ +- INT_PCM *inSamples, /*!< pointer to input samples */ +- INT numInSamples, /*!< number of input samples */ +- INT_PCM *outSamples, /*!< pointer to output samples */ +- INT *numOutSamples); /*!< pointer tp number of output samples */ +- +-#endif /* RESAMPLER_H */ +diff --git a/libSBRenc/src/sbr.h b/libSBRenc/src/sbr.h +deleted file mode 100644 +index 341dcab..0000000 +--- a/libSBRenc/src/sbr.h ++++ /dev/null +@@ -1,194 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Main SBR structs definitions $Revision: 92790 $ +-*/ +- +-#ifndef SBR_H +-#define SBR_H +- +-#include "fram_gen.h" +-#include "bit_sbr.h" +-#include "tran_det.h" +-#include "code_env.h" +-#include "env_est.h" +-#include "cmondata.h" +- +-#include "qmf.h" +-#include "resampler.h" +- +-#include "ton_corr.h" +- +-/* SBR bitstream delay */ +-#define MAX_DELAY_FRAMES 2 +- +-/* sbr encoder downsampling type */ +-typedef enum { SBRENC_DS_NONE, SBRENC_DS_TIME, SBRENC_DS_QMF } SBRENC_DS_TYPE; +- +-typedef struct SBR_CHANNEL { +- struct ENV_CHANNEL hEnvChannel; +- // INT_PCM *pDSOutBuffer; /**< Pointer to +- // downsampled audio output of SBR encoder */ +- DOWNSAMPLER downSampler; +- +-} SBR_CHANNEL; +-typedef SBR_CHANNEL* HANDLE_SBR_CHANNEL; +- +-typedef struct SBR_ELEMENT { +- HANDLE_SBR_CHANNEL sbrChannel[2]; +- QMF_FILTER_BANK* hQmfAnalysis[2]; +- SBR_CONFIG_DATA sbrConfigData; +- SBR_HEADER_DATA sbrHeaderData; +- SBR_BITSTREAM_DATA sbrBitstreamData; +- COMMON_DATA CmonData; +- INT dynXOverFreqDelay[5]; /**< to delay a frame (I don't like it that much +- that way - hrc) */ +- SBR_ELEMENT_INFO elInfo; +- +- UCHAR payloadDelayLine[1 + MAX_DELAY_FRAMES][MAX_PAYLOAD_SIZE]; +- UINT payloadDelayLineSize[1 + MAX_DELAY_FRAMES]; /* Sizes in bits */ +- +-} SBR_ELEMENT, *HANDLE_SBR_ELEMENT; +- +-typedef struct SBR_ENCODER { +- HANDLE_SBR_ELEMENT sbrElement[(8)]; +- HANDLE_SBR_CHANNEL pSbrChannel[(8)]; +- QMF_FILTER_BANK QmfAnalysis[(8)]; +- DOWNSAMPLER lfeDownSampler; +- int lfeChIdx; /* -1 default for no lfe, else assign channel index. */ +- int noElements; /* Number of elements. */ +- int nChannels; /* Total channel count across all elements. */ +- int frameSize; /* SBR framelength. */ +- int bufferOffset; /* Offset for SBR parameter extraction in time domain input +- buffer. */ +- int downsampledOffset; /* Offset of downsampled/mixed output for core encoder. +- */ +- int downmixSize; /* Size in samples of downsampled/mixed output for core +- encoder. */ +- INT downSampleFactor; /* Sampling rate relation between the SBR and the core +- encoder. */ +- SBRENC_DS_TYPE +- downsamplingMethod; /* Method of downsmapling, time-domain, QMF or none. +- */ +- int nBitstrDelay; /* Amount of SBR frames to be delayed in bitstream domain. +- */ +- int sbrDecDelay; /* SBR decoder delay in samples */ +- INT estimateBitrate; /* Estimate bitrate of SBR encoder. */ +- INT inputDataDelay; /* Delay caused by downsampler, in/out buffer at +- sbrEncoder_EncodeFrame. */ +- +- UCHAR* dynamicRam; +- UCHAR* pSBRdynamic_RAM; +- +- HANDLE_PARAMETRIC_STEREO hParametricStereo; +- QMF_FILTER_BANK qmfSynthesisPS; +- +- /* parameters describing allocation volume of present instance */ +- INT maxElements; +- INT maxChannels; +- INT supportPS; +- +-} SBR_ENCODER; +- +-#endif /* SBR_H */ +diff --git a/libSBRenc/src/sbr_def.h b/libSBRenc/src/sbr_def.h +deleted file mode 100644 +index 53eba71..0000000 +--- a/libSBRenc/src/sbr_def.h ++++ /dev/null +@@ -1,276 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief SBR main definitions $Revision: 92790 $ +-*/ +-#ifndef SBR_DEF_H +-#define SBR_DEF_H +- +-#include "common_fix.h" +- +-#define noError 0 +-#define HANDLE_ERROR_INFO INT +-#define ERROR(a, b) 1 +- +-/* #define SBR_ENV_STATISTICS_BITRATE */ +-#undef SBR_ENV_STATISTICS_BITRATE +- +-/* #define SBR_ENV_STATISTICS */ +-#undef SBR_ENV_STATISTICS +- +-/* #define SBR_PAYLOAD_MONITOR */ +-#undef SBR_PAYLOAD_MONITOR +- +-#define SWAP(a, b) tempr = a, a = b, b = tempr +-#define TRUE 1 +-#define FALSE 0 +- +-/* Constants */ +-#define EPS 1e-12 +-#define LOG2 0.69314718056f /* natural logarithm of 2 */ +-#define ILOG2 1.442695041f /* 1/LOG2 */ +-#define RELAXATION_FLOAT (1e-6f) +-#define RELAXATION (FL2FXCONST_DBL(RELAXATION_FLOAT)) +-#define RELAXATION_FRACT \ +- (FL2FXCONST_DBL(0.524288f)) /* 0.524288f is fractional part of RELAXATION */ +-#define RELAXATION_SHIFT (19) +-#define RELAXATION_LD64 \ +- (FL2FXCONST_DBL(0.31143075889f)) /* (ld64(RELAXATION) \ +- */ +- +-/************ Definitions ***************/ +-#define SBR_COMP_MODE_DELTA 0 +-#define SBR_COMP_MODE_CTS 1 +-#define SBR_MAX_ENERGY_VALUES 5 +-#define SBR_GLOBAL_TONALITY_VALUES 2 +- +-#define MAX_NUM_CHANNELS 2 +- +-#define MAX_NOISE_ENVELOPES 2 +-#define MAX_NUM_NOISE_COEFFS 5 +-#define MAX_NUM_NOISE_VALUES (MAX_NUM_NOISE_COEFFS * MAX_NOISE_ENVELOPES) +- +-#define MAX_NUM_ENVELOPE_VALUES (MAX_ENVELOPES * MAX_FREQ_COEFFS) +-#define MAX_ENVELOPES 5 +-#define MAX_FREQ_COEFFS 48 +- +-#define MAX_FREQ_COEFFS_FS44100 35 +-#define MAX_FREQ_COEFFS_FS48000 32 +- +-#define NO_OF_ESTIMATES_LC 4 +-#define NO_OF_ESTIMATES_LD 3 +-#define MAX_NO_OF_ESTIMATES 4 +- +-#define NOISE_FLOOR_OFFSET 6 +-#define NOISE_FLOOR_OFFSET_64 (FL2FXCONST_DBL(0.09375f)) +- +-#define LOW_RES 0 +-#define HIGH_RES 1 +- +-#define LO 0 +-#define HI 1 +- +-#define LENGTH_SBR_FRAME_INFO 35 /* 19 */ +- +-#define SBR_NSFB_LOW_RES 9 /* 8 */ +-#define SBR_NSFB_HIGH_RES 18 /* 16 */ +- +-#define SBR_XPOS_CTRL_DEFAULT 2 +- +-#define SBR_FREQ_SCALE_DEFAULT 2 +-#define SBR_ALTER_SCALE_DEFAULT 1 +-#define SBR_NOISE_BANDS_DEFAULT 2 +- +-#define SBR_LIMITER_BANDS_DEFAULT 2 +-#define SBR_LIMITER_GAINS_DEFAULT 2 +-#define SBR_LIMITER_GAINS_INFINITE 3 +-#define SBR_INTERPOL_FREQ_DEFAULT 1 +-#define SBR_SMOOTHING_LENGTH_DEFAULT 0 +- +-/* sbr_header */ +-#define SI_SBR_AMP_RES_BITS 1 +-#define SI_SBR_COUPLING_BITS 1 +-#define SI_SBR_START_FREQ_BITS 4 +-#define SI_SBR_STOP_FREQ_BITS 4 +-#define SI_SBR_XOVER_BAND_BITS 3 +-#define SI_SBR_RESERVED_BITS 2 +-#define SI_SBR_DATA_EXTRA_BITS 1 +-#define SI_SBR_HEADER_EXTRA_1_BITS 1 +-#define SI_SBR_HEADER_EXTRA_2_BITS 1 +- +-/* sbr_header extra 1 */ +-#define SI_SBR_FREQ_SCALE_BITS 2 +-#define SI_SBR_ALTER_SCALE_BITS 1 +-#define SI_SBR_NOISE_BANDS_BITS 2 +- +-/* sbr_header extra 2 */ +-#define SI_SBR_LIMITER_BANDS_BITS 2 +-#define SI_SBR_LIMITER_GAINS_BITS 2 +-#define SI_SBR_INTERPOL_FREQ_BITS 1 +-#define SI_SBR_SMOOTHING_LENGTH_BITS 1 +- +-/* sbr_grid */ +-#define SBR_CLA_BITS 2 /*!< size of bs_frame_class */ +-#define SBR_CLA_BITS_LD 1 /*!< size of bs_frame_class */ +-#define SBR_ENV_BITS 2 /*!< size of bs_num_env_raw */ +-#define SBR_ABS_BITS 2 /*!< size of bs_abs_bord_raw for HE-AAC */ +-#define SBR_NUM_BITS 2 /*!< size of bs_num_rel */ +-#define SBR_REL_BITS 2 /*!< size of bs_rel_bord_raw */ +-#define SBR_RES_BITS 1 /*!< size of bs_freq_res_flag */ +-#define SBR_DIR_BITS 1 /*!< size of bs_df_flag */ +- +-/* sbr_data */ +-#define SI_SBR_INVF_MODE_BITS 2 +- +-#define SI_SBR_START_ENV_BITS_AMP_RES_3_0 6 +-#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0 5 +-#define SI_SBR_START_NOISE_BITS_AMP_RES_3_0 5 +-#define SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0 5 +- +-#define SI_SBR_START_ENV_BITS_AMP_RES_1_5 7 +-#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5 6 +- +-#define SI_SBR_EXTENDED_DATA_BITS 1 +-#define SI_SBR_EXTENSION_SIZE_BITS 4 +-#define SI_SBR_EXTENSION_ESC_COUNT_BITS 8 +-#define SI_SBR_EXTENSION_ID_BITS 2 +- +-#define SBR_EXTENDED_DATA_MAX_CNT (15 + 255) +- +-#define EXTENSION_ID_PS_CODING 2 +- +-/* Envelope coding constants */ +-#define FREQ 0 +-#define TIME 1 +- +-/* qmf data scaling */ +-#define QMF_SCALE_OFFSET 7 +- +-/* huffman tables */ +-#define CODE_BOOK_SCF_LAV00 60 +-#define CODE_BOOK_SCF_LAV01 31 +-#define CODE_BOOK_SCF_LAV10 60 +-#define CODE_BOOK_SCF_LAV11 31 +-#define CODE_BOOK_SCF_LAV_BALANCE11 12 +-#define CODE_BOOK_SCF_LAV_BALANCE10 24 +- +-typedef enum { SBR_AMP_RES_1_5 = 0, SBR_AMP_RES_3_0 } AMP_RES; +- +-typedef enum { +- XPOS_MDCT, +- XPOS_MDCT_CROSS, +- XPOS_LC, +- XPOS_RESERVED, +- XPOS_SWITCHED /* not a real choice but used here to control behaviour */ +-} XPOS_MODE; +- +-typedef enum { +- INVF_OFF = 0, +- INVF_LOW_LEVEL, +- INVF_MID_LEVEL, +- INVF_HIGH_LEVEL, +- INVF_SWITCHED /* not a real choice but used here to control behaviour */ +-} INVF_MODE; +- +-#endif +diff --git a/libSBRenc/src/sbr_encoder.cpp b/libSBRenc/src/sbr_encoder.cpp +deleted file mode 100644 +index df9e996..0000000 +--- a/libSBRenc/src/sbr_encoder.cpp ++++ /dev/null +@@ -1,2577 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): Andreas Ehret, Tobias Chalupka +- +- Description: SBR encoder top level processing. +- +-*******************************************************************************/ +- +-#include "sbr_encoder.h" +- +-#include "sbrenc_ram.h" +-#include "sbrenc_rom.h" +-#include "sbrenc_freq_sca.h" +-#include "env_bit.h" +-#include "cmondata.h" +-#include "sbr_misc.h" +-#include "sbr.h" +-#include "qmf.h" +- +-#include "ps_main.h" +- +-#define SBRENCODER_LIB_VL0 4 +-#define SBRENCODER_LIB_VL1 0 +-#define SBRENCODER_LIB_VL2 0 +- +-/***************************************************************************/ +-/* +- * SBR Delay balancing definitions. +- */ +- +-/* +- input buffer (1ch) +- +- |------------ 1537 -------------|-----|---------- 2048 -------------| +- (core2sbr delay ) ds (read, core and ds area) +-*/ +- +-#define SFB(dwnsmp) \ +- (32 << (dwnsmp - \ +- 1)) /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */ +-#define STS(fl) \ +- (((fl) == 1024) ? 32 \ +- : 30) /* SBR Time Slots: 32 for core frame length 1024, 30 \ +- for core frame length 960 */ +- +-#define DELAY_QMF_ANA(dwnsmp) \ +- ((320 << ((dwnsmp)-1)) - (32 << ((dwnsmp)-1))) /* Full bandwidth */ +-#define DELAY_HYB_ANA (10 * 64) /* + 0.5 */ /* */ +-#define DELAY_HYB_SYN (6 * 64 - 32) /* */ +-#define DELAY_QMF_POSTPROC(dwnsmp) \ +- (32 * (dwnsmp)) /* QMF postprocessing delay */ +-#define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp)) /* Decoder QMF overlap */ +-#define DELAY_QMF_SYN(dwnsmp) \ +- (1 << (dwnsmp - \ +- 1)) /* QMF_NO_POLY/2=2.5, rounded down to 2, half for single-rate */ +-#define DELAY_QMF_DS (32) /* QMF synthesis for downsampled time signal */ +- +-/* Delay in QMF paths */ +-#define DELAY_SBR(fl, dwnsmp) \ +- (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp) * STS(fl) - 1) + DELAY_QMF_SYN(dwnsmp)) +-#define DELAY_PS(fl, dwnsmp) \ +- (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + \ +- (SFB(dwnsmp) * STS(fl) - 1) + DELAY_HYB_SYN + DELAY_QMF_SYN(dwnsmp)) +-#define DELAY_ELDSBR(fl, dwnsmp) \ +- ((((fl) / 2) * (dwnsmp)) - 1 + DELAY_QMF_POSTPROC(dwnsmp)) +-#define DELAY_ELDv2SBR(fl, dwnsmp) \ +- ((((fl) / 2) * (dwnsmp)) - 1 + 80 * (dwnsmp)) /* 80 is the delay caused \ +- by the sum of the CLD \ +- analysis and the MPSLD \ +- synthesis filterbank */ +- +-/* Delay in core path (core and downsampler not taken into account) */ +-#define DELAY_COREPATH_SBR(fl, dwnsmp) \ +- ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN(dwnsmp))) +-#define DELAY_COREPATH_ELDSBR(fl, dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp))) +-#define DELAY_COREPATH_ELDv2SBR(fl, dwnsmp) (128 * (dwnsmp)) /* 4 slots */ +-#define DELAY_COREPATH_PS(fl, dwnsmp) \ +- ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + \ +- /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + \ +- DELAY_HYB_SYN + DELAY_QMF_SYN(dwnsmp))) /* 2048 - 463*2 */ +- +-/* Delay differences between SBR- and downsampled path for SBR and SBR+PS */ +-#define DELAY_AAC2SBR(fl, dwnsmp) \ +- ((DELAY_COREPATH_SBR(fl, dwnsmp)) - DELAY_SBR((fl), (dwnsmp))) +-#define DELAY_ELD2SBR(fl, dwnsmp) \ +- ((DELAY_COREPATH_ELDSBR(fl, dwnsmp)) - DELAY_ELDSBR(fl, dwnsmp)) +-#define DELAY_AAC2PS(fl, dwnsmp) \ +- ((DELAY_COREPATH_PS(fl, dwnsmp)) - DELAY_PS(fl, dwnsmp)) /* 2048 - 463*2 */ +- +-/* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller +- * than the sample delay implied by DELAY_AAC2SBR */ +-#define MAX_DS_FILTER_DELAY \ +- (5) /* the additional max downsampler filter delay (source fs) */ +-#define MAX_SAMPLE_DELAY \ +- (DELAY_AAC2SBR(1024, 2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame \ +- length of 1024 and \ +- dual-rate sbr */ +- +-/***************************************************************************/ +- +-/*************** Delay parameters for sbrEncoder_Init_delay() **************/ +-typedef struct { +- int dsDelay; /* the delay of the (time-domain) downsampler itself */ +- int delay; /* overall delay / samples */ +- int sbrDecDelay; /* SBR decoder's delay */ +- int corePathOffset; /* core path offset / samples; added by +- sbrEncoder_Init_delay() */ +- int sbrPathOffset; /* SBR path offset / samples; added by +- sbrEncoder_Init_delay() */ +- int bitstrDelay; /* bitstream delay / frames; added by sbrEncoder_Init_delay() +- */ +- int delayInput2Core; /* delay of the input to the core / samples */ +-} DELAY_PARAM; +-/***************************************************************************/ +- +-#define INVALID_TABLE_IDX -1 +- +-/***************************************************************************/ +-/*! +- +- \brief Selects the SBR tuning settings to use dependent on number of +- channels, bitrate, sample rate and core coder +- +- \return Index to the appropriate table +- +-****************************************************************************/ +-#define DISTANCE_CEIL_VALUE 5000000 +-static INT getSbrTuningTableIndex( +- UINT bitrate, /*! the total bitrate in bits/sec */ +- UINT numChannels, /*! the number of channels for the core coder */ +- UINT sampleRate, /*! the sampling rate of the core coder */ +- AUDIO_OBJECT_TYPE core, UINT *pBitRateClosest) { +- int i, bitRateClosestLowerIndex = -1, bitRateClosestUpperIndex = -1, +- found = 0; +- UINT bitRateClosestUpper = 0, bitRateClosestLower = DISTANCE_CEIL_VALUE; +- +-#define isForThisCore(i) \ +- ((sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD) || \ +- (sbrTuningTable[i].coreCoder == CODEC_AAC && core != AOT_ER_AAC_ELD)) +- +- for (i = 0; i < sbrTuningTableSize; i++) { +- if (isForThisCore(i)) /* tuning table is for this core codec */ +- { +- if (numChannels == sbrTuningTable[i].numChannels && +- sampleRate == sbrTuningTable[i].sampleRate) { +- found = 1; +- if ((bitrate >= sbrTuningTable[i].bitrateFrom) && +- (bitrate < sbrTuningTable[i].bitrateTo)) { +- return i; +- } else { +- if (sbrTuningTable[i].bitrateFrom > bitrate) { +- if (sbrTuningTable[i].bitrateFrom < bitRateClosestLower) { +- bitRateClosestLower = sbrTuningTable[i].bitrateFrom; +- bitRateClosestLowerIndex = i; +- } +- } +- if (sbrTuningTable[i].bitrateTo <= bitrate) { +- if (sbrTuningTable[i].bitrateTo > bitRateClosestUpper) { +- bitRateClosestUpper = sbrTuningTable[i].bitrateTo - 1; +- bitRateClosestUpperIndex = i; +- } +- } +- } +- } +- } +- } +- +- if (bitRateClosestUpperIndex >= 0) { +- return bitRateClosestUpperIndex; +- } +- +- if (pBitRateClosest != NULL) { +- /* If there was at least one matching tuning entry pick the least distance +- * bit rate */ +- if (found) { +- int distanceUpper = DISTANCE_CEIL_VALUE, +- distanceLower = DISTANCE_CEIL_VALUE; +- if (bitRateClosestLowerIndex >= 0) { +- distanceLower = +- sbrTuningTable[bitRateClosestLowerIndex].bitrateFrom - bitrate; +- } +- if (bitRateClosestUpperIndex >= 0) { +- distanceUpper = +- bitrate - sbrTuningTable[bitRateClosestUpperIndex].bitrateTo; +- } +- if (distanceUpper < distanceLower) { +- *pBitRateClosest = bitRateClosestUpper; +- } else { +- *pBitRateClosest = bitRateClosestLower; +- } +- } else { +- *pBitRateClosest = 0; +- } +- } +- +- return INVALID_TABLE_IDX; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Selects the PS tuning settings to use dependent on bitrate +- and core coder +- +- \return Index to the appropriate table +- +-****************************************************************************/ +-static INT getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest) { +- INT i, paramSets = sizeof(psTuningTable) / sizeof(psTuningTable[0]); +- int bitRateClosestLowerIndex = -1, bitRateClosestUpperIndex = -1; +- UINT bitRateClosestUpper = 0, bitRateClosestLower = DISTANCE_CEIL_VALUE; +- +- for (i = 0; i < paramSets; i++) { +- if ((bitrate >= psTuningTable[i].bitrateFrom) && +- (bitrate < psTuningTable[i].bitrateTo)) { +- return i; +- } else { +- if (psTuningTable[i].bitrateFrom > bitrate) { +- if (psTuningTable[i].bitrateFrom < bitRateClosestLower) { +- bitRateClosestLower = psTuningTable[i].bitrateFrom; +- bitRateClosestLowerIndex = i; +- } +- } +- if (psTuningTable[i].bitrateTo <= bitrate) { +- if (psTuningTable[i].bitrateTo > bitRateClosestUpper) { +- bitRateClosestUpper = psTuningTable[i].bitrateTo - 1; +- bitRateClosestUpperIndex = i; +- } +- } +- } +- } +- +- if (bitRateClosestUpperIndex >= 0) { +- return bitRateClosestUpperIndex; +- } +- +- if (pBitRateClosest != NULL) { +- int distanceUpper = DISTANCE_CEIL_VALUE, +- distanceLower = DISTANCE_CEIL_VALUE; +- if (bitRateClosestLowerIndex >= 0) { +- distanceLower = +- sbrTuningTable[bitRateClosestLowerIndex].bitrateFrom - bitrate; +- } +- if (bitRateClosestUpperIndex >= 0) { +- distanceUpper = +- bitrate - sbrTuningTable[bitRateClosestUpperIndex].bitrateTo; +- } +- if (distanceUpper < distanceLower) { +- *pBitRateClosest = bitRateClosestUpper; +- } else { +- *pBitRateClosest = bitRateClosestLower; +- } +- } +- +- return INVALID_TABLE_IDX; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief In case of downsampled SBR we may need to lower the stop freq +- of a tuning setting to fit into the lower half of the +- spectrum ( which is sampleRate/4 ) +- +- \return the adapted stop frequency index (-1 -> error) +- +- \ingroup SbrEncCfg +- +-****************************************************************************/ +-static INT FDKsbrEnc_GetDownsampledStopFreq(const INT sampleRateCore, +- const INT startFreq, INT stopFreq, +- const INT downSampleFactor) { +- INT maxStopFreqRaw = sampleRateCore / 2; +- INT startBand, stopBand; +- HANDLE_ERROR_INFO err; +- +- while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > +- maxStopFreqRaw) { +- stopFreq--; +- } +- +- if (FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) +- return -1; +- +- err = FDKsbrEnc_FindStartAndStopBand( +- sampleRateCore << (downSampleFactor - 1), sampleRateCore, +- 32 << (downSampleFactor - 1), startFreq, stopFreq, &startBand, &stopBand); +- if (err) return -1; +- +- return stopFreq; +-} +- +-/***************************************************************************/ +-/*! +- +- \brief tells us, if for the given coreCoder, bitrate, number of channels +- and input sampling rate an SBR setting is available. If yes, it +- tells us also the core sampling rate we would need to run with +- +- \return a flag indicating success: yes (1) or no (0) +- +-****************************************************************************/ +-static UINT FDKsbrEnc_IsSbrSettingAvail( +- UINT bitrate, /*! the total bitrate in bits/sec */ +- UINT vbrMode, /*! the vbr paramter, 0 means constant bitrate */ +- UINT numOutputChannels, /*! the number of channels for the core coder */ +- UINT sampleRateInput, /*! the input sample rate [in Hz] */ +- UINT sampleRateCore, /*! the core's sampling rate */ +- AUDIO_OBJECT_TYPE core) { +- INT idx = INVALID_TABLE_IDX; +- +- if (sampleRateInput < 16000) return 0; +- +- if (bitrate == 0) { +- /* map vbr quality to bitrate */ +- if (vbrMode < 30) +- bitrate = 24000; +- else if (vbrMode < 40) +- bitrate = 28000; +- else if (vbrMode < 60) +- bitrate = 32000; +- else if (vbrMode < 75) +- bitrate = 40000; +- else +- bitrate = 48000; +- bitrate *= numOutputChannels; +- } +- +- idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, +- NULL); +- +- return (idx == INVALID_TABLE_IDX ? 0 : 1); +-} +- +-/***************************************************************************/ +-/*! +- +- \brief Adjusts the SBR settings according to the chosen core coder +- settings which are accessible via config->codecSettings +- +- \return A flag indicating success: yes (1) or no (0) +- +-****************************************************************************/ +-static UINT FDKsbrEnc_AdjustSbrSettings( +- const sbrConfigurationPtr config, /*! output, modified */ +- UINT bitRate, /*! the total bitrate in bits/sec */ +- UINT numChannels, /*! the core coder number of channels */ +- UINT sampleRateCore, /*! the core coder sampling rate in Hz */ +- UINT sampleRateSbr, /*! the sbr coder sampling rate in Hz */ +- UINT transFac, /*! the short block to long block ratio */ +- UINT standardBitrate, /*! the standard bitrate per channel in bits/sec */ +- UINT vbrMode, /*! the vbr paramter, 0 poor quality .. 100 high quality*/ +- UINT useSpeechConfig, /*!< adapt tuning parameters for speech ? */ +- UINT lcsMode, /*! the low complexity stereo mode */ +- UINT bParametricStereo, /*!< use parametric stereo */ +- AUDIO_OBJECT_TYPE core) /* Core audio codec object type */ +-{ +- INT idx = INVALID_TABLE_IDX; +- /* set the core codec settings */ +- config->codecSettings.bitRate = bitRate; +- config->codecSettings.nChannels = numChannels; +- config->codecSettings.sampleFreq = sampleRateCore; +- config->codecSettings.transFac = transFac; +- config->codecSettings.standardBitrate = standardBitrate; +- +- if (bitRate < 28000) { +- config->threshold_AmpRes_FF_m = (FIXP_DBL)MAXVAL_DBL; +- config->threshold_AmpRes_FF_e = 7; +- } else if (bitRate >= 28000 && bitRate <= 48000) { +- /* The float threshold is 75 +- 0.524288f is fractional part of RELAXATION, the quotaMatrix and therefore +- tonality are scaled by this 2/3 is because the original implementation +- divides the tonality values by 3, here it's divided by 2 128 compensates +- the necessary shiftfactor of 7 */ +- config->threshold_AmpRes_FF_m = +- FL2FXCONST_DBL(75.0f * 0.524288f / (2.0f / 3.0f) / 128.0f); +- config->threshold_AmpRes_FF_e = 7; +- } else if (bitRate > 48000) { +- config->threshold_AmpRes_FF_m = FL2FXCONST_DBL(0); +- config->threshold_AmpRes_FF_e = 0; +- } +- +- if (bitRate == 0) { +- /* map vbr quality to bitrate */ +- if (vbrMode < 30) +- bitRate = 24000; +- else if (vbrMode < 40) +- bitRate = 28000; +- else if (vbrMode < 60) +- bitRate = 32000; +- else if (vbrMode < 75) +- bitRate = 40000; +- else +- bitRate = 48000; +- bitRate *= numChannels; +- /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */ +- if (numChannels == 1) { +- if (sampleRateSbr == 44100 || sampleRateSbr == 48000) { +- if (vbrMode < 40) bitRate = 32000; +- } +- } +- } +- +- idx = +- getSbrTuningTableIndex(bitRate, numChannels, sampleRateCore, core, NULL); +- +- if (idx != INVALID_TABLE_IDX) { +- config->startFreq = sbrTuningTable[idx].startFreq; +- config->stopFreq = sbrTuningTable[idx].stopFreq; +- if (useSpeechConfig) { +- config->startFreq = sbrTuningTable[idx].startFreqSpeech; +- config->stopFreq = sbrTuningTable[idx].stopFreqSpeech; +- } +- +- /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */ +- if (1 == config->downSampleFactor) { +- INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq( +- sampleRateCore, config->startFreq, config->stopFreq, +- config->downSampleFactor); +- if (dsStopFreq < 0) { +- return 0; +- } +- +- config->stopFreq = dsStopFreq; +- } +- +- config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands; +- if (core == AOT_ER_AAC_ELD) config->init_amp_res_FF = SBR_AMP_RES_1_5; +- config->noiseFloorOffset = sbrTuningTable[idx].noiseFloorOffset; +- +- config->ana_max_level = sbrTuningTable[idx].noiseMaxLevel; +- config->stereoMode = sbrTuningTable[idx].stereoMode; +- config->freqScale = sbrTuningTable[idx].freqScale; +- +- if (numChannels == 1) { +- /* stereo case */ +- switch (core) { +- case AOT_AAC_LC: +- if (bitRate <= (useSpeechConfig ? 24000U : 20000U)) { +- config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency +- resolution for +- non-split frames */ +- config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency +- resolution for split +- frames */ +- } +- break; +- case AOT_ER_AAC_ELD: +- if (bitRate < 36000) +- config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency +- resolution for split +- frames */ +- if (bitRate < 26000) { +- config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency +- resolution for +- non-split frames */ +- config->fResTransIsLow = +- 1; /* for transient frames, set low frequency resolution */ +- } +- break; +- default: +- break; +- } +- } else { +- /* stereo case */ +- switch (core) { +- case AOT_AAC_LC: +- if (bitRate <= 28000) { +- config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency +- resolution for +- non-split frames */ +- config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency +- resolution for split +- frames */ +- } +- break; +- case AOT_ER_AAC_ELD: +- if (bitRate < 72000) { +- config->freq_res_fixfix[1] = FREQ_RES_LOW; /* set low frequency +- resolution for split +- frames */ +- } +- if (bitRate < 52000) { +- config->freq_res_fixfix[0] = FREQ_RES_LOW; /* set low frequency +- resolution for +- non-split frames */ +- config->fResTransIsLow = +- 1; /* for transient frames, set low frequency resolution */ +- } +- break; +- default: +- break; +- } +- if (bitRate <= 28000) { +- /* +- additionally restrict frequency resolution in FIXFIX frames +- to further reduce SBR payload size */ +- config->freq_res_fixfix[0] = FREQ_RES_LOW; +- config->freq_res_fixfix[1] = FREQ_RES_LOW; +- } +- } +- +- /* adjust usage of parametric coding dependent on bitrate and speech config +- * flag */ +- if (useSpeechConfig) config->parametricCoding = 0; +- +- if (core == AOT_ER_AAC_ELD) { +- if (bitRate < 28000) config->init_amp_res_FF = SBR_AMP_RES_3_0; +- config->SendHeaderDataTime = -1; +- } +- +- if (numChannels == 1) { +- if (bitRate < 16000) { +- config->parametricCoding = 0; +- } +- } else { +- if (bitRate < 20000) { +- config->parametricCoding = 0; +- } +- } +- +- config->useSpeechConfig = useSpeechConfig; +- +- /* PS settings */ +- config->bParametricStereo = bParametricStereo; +- +- return 1; +- } else { +- return 0; +- } +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_InitializeSbrDefaults +- description: initializes the SBR configuration +- returns: error status +- input: - core codec type, +- - factor of SBR to core frame length, +- - core frame length +- output: initialized SBR configuration +- +-*****************************************************************************/ +-static UINT FDKsbrEnc_InitializeSbrDefaults(sbrConfigurationPtr config, +- INT downSampleFactor, +- UINT codecGranuleLen, +- const INT isLowDelay) { +- if ((downSampleFactor < 1 || downSampleFactor > 2) || +- (codecGranuleLen * downSampleFactor > 64 * 32)) +- return (0); /* error */ +- +- config->SendHeaderDataTime = 1000; +- config->useWaveCoding = 0; +- config->crcSbr = 0; +- config->dynBwSupported = 1; +- if (isLowDelay) +- config->tran_thr = 6000; +- else +- config->tran_thr = 13000; +- +- config->parametricCoding = 1; +- +- config->sbrFrameSize = codecGranuleLen * downSampleFactor; +- config->downSampleFactor = downSampleFactor; +- +- /* sbr default parameters */ +- config->sbr_data_extra = 0; +- config->amp_res = SBR_AMP_RES_3_0; +- config->tran_fc = 0; +- config->tran_det_mode = 1; +- config->spread = 1; +- config->stat = 0; +- config->e = 1; +- config->deltaTAcrossFrames = 1; +- config->dF_edge_1stEnv = FL2FXCONST_DBL(0.3f); +- config->dF_edge_incr = FL2FXCONST_DBL(0.3f); +- +- config->sbr_invf_mode = INVF_SWITCHED; +- config->sbr_xpos_mode = XPOS_LC; +- config->sbr_xpos_ctrl = SBR_XPOS_CTRL_DEFAULT; +- config->sbr_xpos_level = 0; +- config->useSaPan = 0; +- config->dynBwEnabled = 0; +- +- /* the following parameters are overwritten by the +- FDKsbrEnc_AdjustSbrSettings() function since they are included in the +- tuning table */ +- config->stereoMode = SBR_SWITCH_LRC; +- config->ana_max_level = 6; +- config->noiseFloorOffset = 0; +- config->startFreq = 5; /* 5.9 respectively 6.0 kHz at fs = 44.1/48 kHz */ +- config->stopFreq = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */ +- config->freq_res_fixfix[0] = FREQ_RES_HIGH; /* non-split case */ +- config->freq_res_fixfix[1] = FREQ_RES_HIGH; /* split case */ +- config->fResTransIsLow = 0; /* for transient frames, set variable frequency +- resolution according to freqResTable */ +- +- /* header_extra_1 */ +- config->freqScale = SBR_FREQ_SCALE_DEFAULT; +- config->alterScale = SBR_ALTER_SCALE_DEFAULT; +- config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT; +- +- /* header_extra_2 */ +- config->sbr_limiter_bands = SBR_LIMITER_BANDS_DEFAULT; +- config->sbr_limiter_gains = SBR_LIMITER_GAINS_DEFAULT; +- config->sbr_interpol_freq = SBR_INTERPOL_FREQ_DEFAULT; +- config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT; +- +- return 1; +-} +- +-/***************************************************************************** +- +- functionname: DeleteEnvChannel +- description: frees memory of one SBR channel +- returns: - +- input: handle of channel +- output: released handle +- +-*****************************************************************************/ +-static void deleteEnvChannel(HANDLE_ENV_CHANNEL hEnvCut) { +- if (hEnvCut) { +- FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr); +- +- FDKsbrEnc_deleteExtractSbrEnvelope(&hEnvCut->sbrExtractEnvelope); +- } +-} +- +-/***************************************************************************** +- +- functionname: sbrEncoder_ChannelClose +- description: close the channel coding handle +- returns: +- input: phSbrChannel +- output: +- +-*****************************************************************************/ +-static void sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel) { +- if (hSbrChannel != NULL) { +- deleteEnvChannel(&hSbrChannel->hEnvChannel); +- } +-} +- +-/***************************************************************************** +- +- functionname: sbrEncoder_ElementClose +- description: close the channel coding handle +- returns: +- input: phSbrChannel +- output: +- +-*****************************************************************************/ +-static void sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement) { +- HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement; +- +- if (hSbrElement != NULL) { +- if (hSbrElement->sbrConfigData.v_k_master) +- FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master); +- if (hSbrElement->sbrConfigData.freqBandTable[LO]) +- FreeRam_Sbr_freqBandTableLO( +- &hSbrElement->sbrConfigData.freqBandTable[LO]); +- if (hSbrElement->sbrConfigData.freqBandTable[HI]) +- FreeRam_Sbr_freqBandTableHI( +- &hSbrElement->sbrConfigData.freqBandTable[HI]); +- +- FreeRam_SbrElement(phSbrElement); +- } +- return; +-} +- +-void sbrEncoder_Close(HANDLE_SBR_ENCODER *phSbrEncoder) { +- HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder; +- +- if (hSbrEncoder != NULL) { +- int el, ch; +- +- for (el = 0; el < (8); el++) { +- if (hSbrEncoder->sbrElement[el] != NULL) { +- sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]); +- } +- } +- +- /* Close sbr Channels */ +- for (ch = 0; ch < (8); ch++) { +- if (hSbrEncoder->pSbrChannel[ch]) { +- sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]); +- FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]); +- } +- +- if (hSbrEncoder->QmfAnalysis[ch].FilterStates) +- FreeRam_Sbr_QmfStatesAnalysis( +- (FIXP_QAS **)&hSbrEncoder->QmfAnalysis[ch].FilterStates); +- } +- +- if (hSbrEncoder->hParametricStereo) +- PSEnc_Destroy(&hSbrEncoder->hParametricStereo); +- if (hSbrEncoder->qmfSynthesisPS.FilterStates) +- FreeRam_PsQmfStatesSynthesis( +- (FIXP_DBL **)&hSbrEncoder->qmfSynthesisPS.FilterStates); +- +- /* Release Overlay */ +- if (hSbrEncoder->pSBRdynamic_RAM) +- FreeRam_SbrDynamic_RAM((FIXP_DBL **)&hSbrEncoder->pSBRdynamic_RAM); +- +- FreeRam_SbrEncoder(phSbrEncoder); +- } +-} +- +-/***************************************************************************** +- +- functionname: updateFreqBandTable +- description: updates vk_master +- returns: - +- input: config handle +- output: error info +- +-*****************************************************************************/ +-static INT updateFreqBandTable(HANDLE_SBR_CONFIG_DATA sbrConfigData, +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- const INT downSampleFactor) { +- INT k0, k2; +- +- if (FDKsbrEnc_FindStartAndStopBand( +- sbrConfigData->sampleFreq, +- sbrConfigData->sampleFreq >> (downSampleFactor - 1), +- sbrConfigData->noQmfBands, sbrHeaderData->sbr_start_frequency, +- sbrHeaderData->sbr_stop_frequency, &k0, &k2)) +- return (1); +- +- if (FDKsbrEnc_UpdateFreqScale( +- sbrConfigData->v_k_master, &sbrConfigData->num_Master, k0, k2, +- sbrHeaderData->freqScale, sbrHeaderData->alterScale)) +- return (1); +- +- sbrHeaderData->sbr_xover_band = 0; +- +- if (FDKsbrEnc_UpdateHiRes(sbrConfigData->freqBandTable[HI], +- &sbrConfigData->nSfb[HI], sbrConfigData->v_k_master, +- sbrConfigData->num_Master, +- &sbrHeaderData->sbr_xover_band)) +- return (1); +- +- FDKsbrEnc_UpdateLoRes( +- sbrConfigData->freqBandTable[LO], &sbrConfigData->nSfb[LO], +- sbrConfigData->freqBandTable[HI], sbrConfigData->nSfb[HI]); +- +- sbrConfigData->xOverFreq = +- (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / +- sbrConfigData->noQmfBands + +- 1) >> +- 1; +- +- return (0); +-} +- +-/***************************************************************************** +- +- functionname: resetEnvChannel +- description: resets parameters and allocates memory +- returns: error status +- input: +- output: hEnv +- +-*****************************************************************************/ +-static INT resetEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData, +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_ENV_CHANNEL hEnv) { +- /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function +- * FDKsbrEnc_extractSbrEnvelope !!!*/ +- hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands = +- sbrHeaderData->sbr_noise_bands; +- +- if (FDKsbrEnc_ResetTonCorrParamExtr( +- &hEnv->TonCorr, sbrConfigData->xposCtrlSwitch, +- sbrConfigData->freqBandTable[HI][0], sbrConfigData->v_k_master, +- sbrConfigData->num_Master, sbrConfigData->sampleFreq, +- sbrConfigData->freqBandTable, sbrConfigData->nSfb, +- sbrConfigData->noQmfBands)) +- return (1); +- +- hEnv->sbrCodeNoiseFloor.nSfb[LO] = +- hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; +- hEnv->sbrCodeNoiseFloor.nSfb[HI] = +- hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; +- +- hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO]; +- hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI]; +- +- hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; +- +- hEnv->sbrCodeEnvelope.upDate = 0; +- hEnv->sbrCodeNoiseFloor.upDate = 0; +- +- return (0); +-} +- +-/* ****************************** FDKsbrEnc_SbrGetXOverFreq +- * ******************************/ +-/** +- * @fn +- * @brief calculates the closest possible crossover frequency +- * @return the crossover frequency SBR accepts +- * +- */ +-static INT FDKsbrEnc_SbrGetXOverFreq( +- HANDLE_SBR_ELEMENT hEnv, /*!< handle to SBR encoder instance */ +- INT xoverFreq) /*!< from core coder suggested crossover frequency */ +-{ +- INT band; +- INT lastDiff, newDiff; +- INT cutoffSb; +- +- UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master; +- +- /* Check if there is a matching cutoff frequency in the master table */ +- cutoffSb = (4 * xoverFreq * hEnv->sbrConfigData.noQmfBands / +- hEnv->sbrConfigData.sampleFreq + +- 1) >> +- 1; +- lastDiff = cutoffSb; +- for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) { +- newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb); +- +- if (newDiff >= lastDiff) { +- band--; +- break; +- } +- +- lastDiff = newDiff; +- } +- +- return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq / +- hEnv->sbrConfigData.noQmfBands + +- 1) >> +- 1); +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_EnvEncodeFrame +- description: performs the sbr envelope calculation for one element +- returns: +- input: +- output: +- +-*****************************************************************************/ +-INT FDKsbrEnc_EnvEncodeFrame( +- HANDLE_SBR_ENCODER hEnvEncoder, int iElement, +- INT_PCM *samples, /*!< time samples, always deinterleaved */ +- UINT samplesBufSize, /*!< time buffer channel stride */ +- UINT *sbrDataBits, /*!< Size of SBR payload */ +- UCHAR *sbrData, /*!< SBR payload */ +- int clearOutput /*!< Do not consider any input signal */ +-) { +- HANDLE_SBR_ELEMENT hSbrElement = NULL; +- FDK_CRCINFO crcInfo; +- INT crcReg; +- INT ch; +- INT band; +- INT cutoffSb; +- INT newXOver; +- +- if (hEnvEncoder == NULL) return -1; +- +- hSbrElement = hEnvEncoder->sbrElement[iElement]; +- +- if (hSbrElement == NULL) return -1; +- +- /* header bitstream handling */ +- HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData; +- +- INT psHeaderActive = 0; +- sbrBitstreamData->HeaderActive = 0; +- +- /* Anticipate PS header because of internal PS bitstream delay in order to be +- * in sync with SBR header. */ +- if (sbrBitstreamData->CountSendHeaderData == +- (sbrBitstreamData->NrSendHeaderData - 1)) { +- psHeaderActive = 1; +- } +- +- /* Signal SBR header to be written into bitstream */ +- if (sbrBitstreamData->CountSendHeaderData == 0) { +- sbrBitstreamData->HeaderActive = 1; +- } +- +- /* Increment header interval counter */ +- if (sbrBitstreamData->NrSendHeaderData == 0) { +- sbrBitstreamData->CountSendHeaderData = 1; +- } else { +- if (sbrBitstreamData->CountSendHeaderData >= 0) { +- sbrBitstreamData->CountSendHeaderData++; +- sbrBitstreamData->CountSendHeaderData %= +- sbrBitstreamData->NrSendHeaderData; +- } +- } +- +- if (hSbrElement->CmonData.dynBwEnabled) { +- INT i; +- for (i = 4; i > 0; i--) +- hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i - 1]; +- +- hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc; +- if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2]) +- newXOver = hSbrElement->dynXOverFreqDelay[2]; +- else +- newXOver = hSbrElement->dynXOverFreqDelay[1]; +- +- /* has the crossover frequency changed? */ +- if (hSbrElement->sbrConfigData.dynXOverFreq != newXOver) { +- /* get corresponding master band */ +- cutoffSb = ((4 * newXOver * hSbrElement->sbrConfigData.noQmfBands / +- hSbrElement->sbrConfigData.sampleFreq) + +- 1) >> +- 1; +- +- for (band = 0; band < hSbrElement->sbrConfigData.num_Master; band++) { +- if (cutoffSb == hSbrElement->sbrConfigData.v_k_master[band]) break; +- } +- FDK_ASSERT(band < hSbrElement->sbrConfigData.num_Master); +- +- hSbrElement->sbrConfigData.dynXOverFreq = newXOver; +- hSbrElement->sbrHeaderData.sbr_xover_band = band; +- hSbrElement->sbrBitstreamData.HeaderActive = 1; +- psHeaderActive = 1; /* ps header is one frame delayed */ +- +- /* +- update vk_master table +- */ +- if (updateFreqBandTable(&hSbrElement->sbrConfigData, +- &hSbrElement->sbrHeaderData, +- hEnvEncoder->downSampleFactor)) +- return (1); +- +- /* reset SBR channels */ +- INT nEnvCh = hSbrElement->sbrConfigData.nChannels; +- for (ch = 0; ch < nEnvCh; ch++) { +- if (resetEnvChannel(&hSbrElement->sbrConfigData, +- &hSbrElement->sbrHeaderData, +- &hSbrElement->sbrChannel[ch]->hEnvChannel)) +- return (1); +- } +- } +- } +- +- /* +- allocate space for dummy header and crc +- */ +- crcReg = FDKsbrEnc_InitSbrBitstream( +- &hSbrElement->CmonData, +- hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay], +- MAX_PAYLOAD_SIZE * sizeof(UCHAR), &crcInfo, +- hSbrElement->sbrConfigData.sbrSyntaxFlags); +- +- /* Temporal Envelope Data */ +- SBR_FRAME_TEMP_DATA _fData; +- SBR_FRAME_TEMP_DATA *fData = &_fData; +- SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS]; +- +- /* Init Temporal Envelope Data */ +- { +- int i; +- +- FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA)); +- FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA)); +- FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA)); +- +- for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) fData->res[i] = FREQ_RES_HIGH; +- } +- +- if (!clearOutput) { +- /* +- * Transform audio data into QMF domain +- */ +- for (ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) { +- HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel; +- HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope; +- +- if (hSbrElement->elInfo.fParametricStereo == 0) { +- QMF_SCALE_FACTOR tmpScale; +- FIXP_DBL **pQmfReal, **pQmfImag; +- C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, 64 * 2) +- +- /* Obtain pointers to QMF buffers. */ +- pQmfReal = sbrExtrEnv->rBuffer; +- pQmfImag = sbrExtrEnv->iBuffer; +- +- qmfAnalysisFiltering( +- hSbrElement->hQmfAnalysis[ch], pQmfReal, pQmfImag, &tmpScale, +- samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, 0, +- 1, qmfWorkBuffer); +- +- h_envChan->qmfScale = tmpScale.lb_scale + 7; +- +- C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, 64 * 2) +- +- } /* fParametricStereo == 0 */ +- +- /* +- Parametric Stereo processing +- */ +- if (hSbrElement->elInfo.fParametricStereo) { +- INT error = noError; +- +- /* Limit Parametric Stereo to one instance */ +- FDK_ASSERT(ch == 0); +- +- if (error == noError) { +- /* parametric stereo processing: +- - input: +- o left and right time domain samples +- - processing: +- o stereo qmf analysis +- o stereo hybrid analysis +- o ps parameter extraction +- o downmix + hybrid synthesis +- - output: +- o downmixed qmf data is written to sbrExtrEnv->rBuffer and +- sbrExtrEnv->iBuffer +- */ +- SCHAR qmfScale; +- INT_PCM *pSamples[2] = { +- samples + hSbrElement->elInfo.ChannelIndex[0] * samplesBufSize, +- samples + hSbrElement->elInfo.ChannelIndex[1] * samplesBufSize}; +- error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( +- hEnvEncoder->hParametricStereo, pSamples, samplesBufSize, +- hSbrElement->hQmfAnalysis, sbrExtrEnv->rBuffer, +- sbrExtrEnv->iBuffer, +- samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, +- &hEnvEncoder->qmfSynthesisPS, &qmfScale, psHeaderActive); +- h_envChan->qmfScale = (int)qmfScale; +- } +- +- } /* if (hEnvEncoder->hParametricStereo) */ +- +- /* +- +- Extract Envelope relevant things from QMF data +- +- */ +- FDKsbrEnc_extractSbrEnvelope1(&hSbrElement->sbrConfigData, +- &hSbrElement->sbrHeaderData, +- &hSbrElement->sbrBitstreamData, h_envChan, +- &hSbrElement->CmonData, &eData[ch], fData); +- +- } /* hEnvEncoder->sbrConfigData.nChannels */ +- } +- +- /* +- Process Envelope relevant things and calculate envelope data and write +- payload +- */ +- FDKsbrEnc_extractSbrEnvelope2( +- &hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, +- (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo +- : NULL, +- &hSbrElement->sbrBitstreamData, &hSbrElement->sbrChannel[0]->hEnvChannel, +- (hSbrElement->sbrConfigData.stereoMode != SBR_MONO) +- ? &hSbrElement->sbrChannel[1]->hEnvChannel +- : NULL, +- &hSbrElement->CmonData, eData, fData, clearOutput); +- +- hSbrElement->sbrBitstreamData.rightBorderFIX = 0; +- +- /* +- format payload, calculate crc +- */ +- FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, +- hSbrElement->sbrConfigData.sbrSyntaxFlags); +- +- /* +- save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE +- */ +- hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = +- FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf); +- +- if (hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > +- (MAX_PAYLOAD_SIZE << 3)) +- hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = 0; +- +- /* While filling the Delay lines, sbrData is NULL */ +- if (sbrData) { +- *sbrDataBits = hSbrElement->payloadDelayLineSize[0]; +- FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], +- (hSbrElement->payloadDelayLineSize[0] + 7) >> 3); +- } +- +- /* delay header active flag */ +- if (hSbrElement->sbrBitstreamData.HeaderActive == 1) { +- hSbrElement->sbrBitstreamData.HeaderActiveDelay = +- 1 + hEnvEncoder->nBitstrDelay; +- } else { +- if (hSbrElement->sbrBitstreamData.HeaderActiveDelay > 0) { +- hSbrElement->sbrBitstreamData.HeaderActiveDelay--; +- } +- } +- +- return (0); +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_Downsample +- description: performs downsampling and delay compensation of the core path +- returns: +- input: +- output: +- +-*****************************************************************************/ +-INT FDKsbrEnc_Downsample( +- HANDLE_SBR_ENCODER hSbrEncoder, +- INT_PCM *samples, /*!< time samples, always deinterleaved */ +- UINT samplesBufSize, /*!< time buffer size per channel */ +- UINT numChannels, /*!< number of channels */ +- UINT *sbrDataBits, /*!< Size of SBR payload */ +- UCHAR *sbrData, /*!< SBR payload */ +- int clearOutput /*!< Do not consider any input signal */ +-) { +- HANDLE_SBR_ELEMENT hSbrElement = NULL; +- INT nOutSamples; +- int el; +- if (hSbrEncoder->downSampleFactor > 1) { +- /* Do downsampling */ +- +- /* Loop over elements (LFE is handled later) */ +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- hSbrElement = hSbrEncoder->sbrElement[el]; +- if (hSbrEncoder->sbrElement[el] != NULL) { +- if (hSbrEncoder->downsamplingMethod == SBRENC_DS_TIME) { +- int ch; +- int nChannels = hSbrElement->sbrConfigData.nChannels; +- +- for (ch = 0; ch < nChannels; ch++) { +- FDKaacEnc_Downsample( +- &hSbrElement->sbrChannel[ch]->downSampler, +- samples + +- hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize + +- hSbrEncoder->bufferOffset / numChannels, +- hSbrElement->sbrConfigData.frameSize, +- samples + hSbrElement->elInfo.ChannelIndex[ch] * samplesBufSize, +- &nOutSamples); +- } +- } +- } +- } +- +- /* Handle LFE (if existing) */ +- if (hSbrEncoder->lfeChIdx != -1) { /* lfe downsampler */ +- FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler, +- samples + hSbrEncoder->lfeChIdx * samplesBufSize + +- hSbrEncoder->bufferOffset / numChannels, +- hSbrEncoder->frameSize, +- samples + hSbrEncoder->lfeChIdx * samplesBufSize, +- &nOutSamples); +- } +- } else { +- /* No downsampling. Still, some buffer shifting for correct delay */ +- int samples2Copy = hSbrEncoder->frameSize; +- if (hSbrEncoder->bufferOffset / (int)numChannels < samples2Copy) { +- for (int c = 0; c < (int)numChannels; c++) { +- /* Do memmove while taking care of overlapping memory areas. (memcpy +- does not necessarily take care) Distinguish between oeverlapping and +- non overlapping version due to reasons of complexity. */ +- FDKmemmove(samples + c * samplesBufSize, +- samples + c * samplesBufSize + +- hSbrEncoder->bufferOffset / numChannels, +- samples2Copy * sizeof(INT_PCM)); +- } +- } else { +- for (int c = 0; c < (int)numChannels; c++) { +- /* Simple memcpy since the memory areas are not overlapping */ +- FDKmemcpy(samples + c * samplesBufSize, +- samples + c * samplesBufSize + +- hSbrEncoder->bufferOffset / numChannels, +- samples2Copy * sizeof(INT_PCM)); +- } +- } +- } +- +- return 0; +-} +- +-/***************************************************************************** +- +- functionname: createEnvChannel +- description: initializes parameters and allocates memory +- returns: error status +- input: +- output: hEnv +- +-*****************************************************************************/ +- +-static INT createEnvChannel(HANDLE_ENV_CHANNEL hEnv, INT channel, +- UCHAR *dynamic_RAM) { +- FDKmemclear(hEnv, sizeof(struct ENV_CHANNEL)); +- +- if (FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr, channel)) { +- return (1); +- } +- +- if (FDKsbrEnc_CreateExtractSbrEnvelope(&hEnv->sbrExtractEnvelope, channel, +- /*chan*/ 0, dynamic_RAM)) { +- return (1); +- } +- +- return 0; +-} +- +-/***************************************************************************** +- +- functionname: initEnvChannel +- description: initializes parameters +- returns: error status +- input: +- output: +- +-*****************************************************************************/ +-static INT initEnvChannel(HANDLE_SBR_CONFIG_DATA sbrConfigData, +- HANDLE_SBR_HEADER_DATA sbrHeaderData, +- HANDLE_ENV_CHANNEL hEnv, sbrConfigurationPtr params, +- ULONG statesInitFlag, INT chanInEl, +- UCHAR *dynamic_RAM) { +- int frameShift, tran_off = 0; +- INT e; +- INT tran_fc; +- INT timeSlots, timeStep, startIndex; +- INT noiseBands[2] = {3, 3}; +- +- e = 1 << params->e; +- +- FDK_ASSERT(params->e >= 0); +- +- hEnv->encEnvData.freq_res_fixfix[0] = params->freq_res_fixfix[0]; +- hEnv->encEnvData.freq_res_fixfix[1] = params->freq_res_fixfix[1]; +- hEnv->encEnvData.fResTransIsLow = params->fResTransIsLow; +- +- hEnv->fLevelProtect = 0; +- +- hEnv->encEnvData.ldGrid = +- (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0; +- +- hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode; +- +- if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) { +- /* +- no other type than XPOS_MDCT or XPOS_SPEECH allowed, +- but enable switching +- */ +- sbrConfigData->switchTransposers = TRUE; +- hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT; +- } else { +- sbrConfigData->switchTransposers = FALSE; +- } +- +- hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl; +- +- /* extended data */ +- if (params->parametricCoding) { +- hEnv->encEnvData.extended_data = 1; +- } else { +- hEnv->encEnvData.extended_data = 0; +- } +- +- hEnv->encEnvData.extension_size = 0; +- +- startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands; +- +- switch (params->sbrFrameSize) { +- case 2304: +- timeSlots = 18; +- break; +- case 2048: +- case 1024: +- case 512: +- timeSlots = 16; +- break; +- case 1920: +- case 960: +- case 480: +- timeSlots = 15; +- break; +- case 1152: +- timeSlots = 9; +- break; +- default: +- return (1); /* Illegal frame size */ +- } +- +- timeStep = sbrConfigData->noQmfSlots / timeSlots; +- +- if (FDKsbrEnc_InitTonCorrParamExtr( +- params->sbrFrameSize, &hEnv->TonCorr, sbrConfigData, timeSlots, +- params->sbr_xpos_ctrl, params->ana_max_level, +- sbrHeaderData->sbr_noise_bands, params->noiseFloorOffset, +- params->useSpeechConfig)) +- return (1); +- +- hEnv->encEnvData.noOfnoisebands = +- hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; +- +- noiseBands[0] = hEnv->encEnvData.noOfnoisebands; +- noiseBands[1] = hEnv->encEnvData.noOfnoisebands; +- +- hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode; +- +- if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) { +- hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL; +- hEnv->TonCorr.switchInverseFilt = TRUE; +- } else { +- hEnv->TonCorr.switchInverseFilt = FALSE; +- } +- +- tran_fc = params->tran_fc; +- +- if (tran_fc == 0) { +- tran_fc = fixMin( +- 5000, FDKsbrEnc_getSbrStartFreqRAW(sbrHeaderData->sbr_start_frequency, +- params->codecSettings.sampleFreq)); +- } +- +- tran_fc = +- (tran_fc * 4 * sbrConfigData->noQmfBands / sbrConfigData->sampleFreq + +- 1) >> +- 1; +- +- if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- frameShift = LD_PRETRAN_OFF; +- tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD * timeStep; +- } else { +- frameShift = 0; +- switch (timeSlots) { +- /* The factor of 2 is by definition. */ +- case NUMBER_TIME_SLOTS_2048: +- tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; +- break; +- case NUMBER_TIME_SLOTS_1920: +- tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; +- break; +- default: +- return 1; +- } +- } +- if (FDKsbrEnc_InitExtractSbrEnvelope( +- &hEnv->sbrExtractEnvelope, sbrConfigData->noQmfSlots, +- sbrConfigData->noQmfBands, startIndex, timeSlots, timeStep, tran_off, +- statesInitFlag, chanInEl, dynamic_RAM, sbrConfigData->sbrSyntaxFlags)) +- return (1); +- +- if (FDKsbrEnc_InitSbrCodeEnvelope(&hEnv->sbrCodeEnvelope, sbrConfigData->nSfb, +- params->deltaTAcrossFrames, +- params->dF_edge_1stEnv, +- params->dF_edge_incr)) +- return (1); +- +- if (FDKsbrEnc_InitSbrCodeEnvelope(&hEnv->sbrCodeNoiseFloor, noiseBands, +- params->deltaTAcrossFrames, 0, 0)) +- return (1); +- +- sbrConfigData->initAmpResFF = params->init_amp_res_FF; +- +- if (FDKsbrEnc_InitSbrHuffmanTables(&hEnv->encEnvData, &hEnv->sbrCodeEnvelope, +- &hEnv->sbrCodeNoiseFloor, +- sbrHeaderData->sbr_amp_res)) +- return (1); +- +- FDKsbrEnc_initFrameInfoGenerator( +- &hEnv->SbrEnvFrame, params->spread, e, params->stat, timeSlots, +- hEnv->encEnvData.freq_res_fixfix, hEnv->encEnvData.fResTransIsLow, +- hEnv->encEnvData.ldGrid); +- +- if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) +- +- { +- INT bandwidth_qmf_slot = +- (sbrConfigData->sampleFreq >> 1) / (sbrConfigData->noQmfBands); +- if (FDKsbrEnc_InitSbrFastTransientDetector( +- &hEnv->sbrFastTransientDetector, sbrConfigData->noQmfSlots, +- bandwidth_qmf_slot, sbrConfigData->noQmfBands, +- sbrConfigData->freqBandTable[0][0])) +- return (1); +- } +- +- /* The transient detector has to be initialized also if the fast transient +- detector was active, because the values from the transient detector +- structure are used. */ +- if (FDKsbrEnc_InitSbrTransientDetector( +- &hEnv->sbrTransientDetector, sbrConfigData->sbrSyntaxFlags, +- sbrConfigData->frameSize, sbrConfigData->sampleFreq, params, tran_fc, +- sbrConfigData->noQmfSlots, sbrConfigData->noQmfBands, +- hEnv->sbrExtractEnvelope.YBufferWriteOffset, +- hEnv->sbrExtractEnvelope.YBufferSzShift, frameShift, tran_off)) +- return (1); +- +- sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl; +- +- hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; +- hEnv->encEnvData.addHarmonicFlag = 0; +- +- return (0); +-} +- +-INT sbrEncoder_Open(HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, +- INT nChannels, INT supportPS) { +- INT i; +- INT errorStatus = 1; +- HANDLE_SBR_ENCODER hSbrEncoder = NULL; +- +- if (phSbrEncoder == NULL) { +- goto bail; +- } +- +- hSbrEncoder = GetRam_SbrEncoder(); +- if (hSbrEncoder == NULL) { +- goto bail; +- } +- FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER)); +- +- if (NULL == +- (hSbrEncoder->pSBRdynamic_RAM = (UCHAR *)GetRam_SbrDynamic_RAM())) { +- goto bail; +- } +- hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM; +- +- /* Create SBR elements */ +- for (i = 0; i < nElements; i++) { +- hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i); +- if (hSbrEncoder->sbrElement[i] == NULL) { +- goto bail; +- } +- FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT)); +- hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] = +- GetRam_Sbr_freqBandTableLO(i); +- hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] = +- GetRam_Sbr_freqBandTableHI(i); +- hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master = +- GetRam_Sbr_v_k_master(i); +- if ((hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] == NULL) || +- (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] == NULL) || +- (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master == NULL)) { +- goto bail; +- } +- } +- +- /* Create SBR channels */ +- for (i = 0; i < nChannels; i++) { +- hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i); +- if (hSbrEncoder->pSbrChannel[i] == NULL) { +- goto bail; +- } +- +- if (createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel, i, +- hSbrEncoder->dynamicRam)) { +- goto bail; +- } +- } +- +- /* Create QMF States */ +- for (i = 0; i < fixMax(nChannels, (supportPS) ? 2 : 0); i++) { +- hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i); +- if (hSbrEncoder->QmfAnalysis[i].FilterStates == NULL) { +- goto bail; +- } +- } +- +- /* Create Parametric Stereo handle */ +- if (supportPS) { +- if (PSEnc_Create(&hSbrEncoder->hParametricStereo)) { +- goto bail; +- } +- +- hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis(); +- if (hSbrEncoder->qmfSynthesisPS.FilterStates == NULL) { +- goto bail; +- } +- } /* supportPS */ +- +- *phSbrEncoder = hSbrEncoder; +- +- errorStatus = 0; +- return errorStatus; +- +-bail: +- /* Close SBR encoder instance */ +- sbrEncoder_Close(&hSbrEncoder); +- return errorStatus; +-} +- +-static INT FDKsbrEnc_Reallocate(HANDLE_SBR_ENCODER hSbrEncoder, +- SBR_ELEMENT_INFO elInfo[(8)], +- const INT noElements) { +- INT totalCh = 0; +- INT totalQmf = 0; +- INT coreEl; +- INT el = -1; +- +- hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */ +- +- for (coreEl = 0; coreEl < noElements; coreEl++) { +- /* SBR only handles SCE and CPE's */ +- if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { +- el++; +- } else { +- if (elInfo[coreEl].elType == ID_LFE) { +- hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0]; +- } +- continue; +- } +- +- SBR_ELEMENT_INFO *pelInfo = &elInfo[coreEl]; +- HANDLE_SBR_ELEMENT hSbrElement = hSbrEncoder->sbrElement[el]; +- +- int ch; +- for (ch = 0; ch < pelInfo->nChannelsInEl; ch++) { +- hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh]; +- totalCh++; +- } +- /* analysis QMF */ +- for (ch = 0; +- ch < ((pelInfo->fParametricStereo) ? 2 : pelInfo->nChannelsInEl); +- ch++) { +- hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch]; +- hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++]; +- } +- +- /* Copy Element info */ +- hSbrElement->elInfo.elType = pelInfo->elType; +- hSbrElement->elInfo.instanceTag = pelInfo->instanceTag; +- hSbrElement->elInfo.nChannelsInEl = pelInfo->nChannelsInEl; +- hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo; +- hSbrElement->elInfo.fDualMono = pelInfo->fDualMono; +- } /* coreEl */ +- +- return 0; +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_bsBufInit +- description: initializes bitstream buffer +- returns: initialized bitstream buffer in env encoder +- input: +- output: hEnv +- +-*****************************************************************************/ +-static INT FDKsbrEnc_bsBufInit(HANDLE_SBR_ELEMENT hSbrElement, +- int nBitstrDelay) { +- UCHAR *bitstreamBuffer; +- +- /* initialize the bitstream buffer */ +- bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay]; +- FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, +- MAX_PAYLOAD_SIZE * sizeof(UCHAR), 0, BS_WRITER); +- +- return (0); +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_EnvInit +- description: initializes parameters +- returns: error status +- input: +- output: hEnv +- +-*****************************************************************************/ +-static INT FDKsbrEnc_EnvInit(HANDLE_SBR_ELEMENT hSbrElement, +- sbrConfigurationPtr params, INT *coreBandWith, +- AUDIO_OBJECT_TYPE aot, int nElement, +- const int headerPeriod, ULONG statesInitFlag, +- const SBRENC_DS_TYPE downsamplingMethod, +- UCHAR *dynamic_RAM) { +- int ch, i; +- +- if ((params->codecSettings.nChannels < 1) || +- (params->codecSettings.nChannels > MAX_NUM_CHANNELS)) { +- return (1); +- } +- +- /* init and set syntax flags */ +- hSbrElement->sbrConfigData.sbrSyntaxFlags = 0; +- +- switch (aot) { +- case AOT_ER_AAC_ELD: +- hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY; +- break; +- default: +- break; +- } +- if (params->crcSbr) { +- hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; +- } +- +- hSbrElement->sbrConfigData.noQmfBands = 64 >> (2 - params->downSampleFactor); +- switch (hSbrElement->sbrConfigData.noQmfBands) { +- case 64: +- hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 6; +- break; +- case 32: +- hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 5; +- break; +- default: +- hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize >> 6; +- return (2); +- } +- +- /* +- now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData, +- */ +- hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels; +- +- if (params->codecSettings.nChannels == 2) { +- if ((hSbrElement->elInfo.elType == ID_CPE) && +- ((hSbrElement->elInfo.fDualMono == 1))) { +- hSbrElement->sbrConfigData.stereoMode = SBR_LEFT_RIGHT; +- } else { +- hSbrElement->sbrConfigData.stereoMode = params->stereoMode; +- } +- } else { +- hSbrElement->sbrConfigData.stereoMode = SBR_MONO; +- } +- +- hSbrElement->sbrConfigData.frameSize = params->sbrFrameSize; +- +- hSbrElement->sbrConfigData.sampleFreq = +- params->downSampleFactor * params->codecSettings.sampleFreq; +- +- hSbrElement->sbrBitstreamData.CountSendHeaderData = 0; +- if (params->SendHeaderDataTime > 0) { +- if (headerPeriod == -1) { +- hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)( +- params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq / +- (1000 * hSbrElement->sbrConfigData.frameSize)); +- hSbrElement->sbrBitstreamData.NrSendHeaderData = +- fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData, 1); +- } else { +- /* assure header period at least once per second */ +- hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin( +- fixMax(headerPeriod, 1), (hSbrElement->sbrConfigData.sampleFreq / +- hSbrElement->sbrConfigData.frameSize)); +- } +- } else { +- hSbrElement->sbrBitstreamData.NrSendHeaderData = 0; +- } +- +- hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra; +- hSbrElement->sbrBitstreamData.HeaderActive = 0; +- hSbrElement->sbrBitstreamData.rightBorderFIX = 0; +- hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq; +- hSbrElement->sbrHeaderData.sbr_stop_frequency = params->stopFreq; +- hSbrElement->sbrHeaderData.sbr_xover_band = 0; +- hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0; +- +- /* data_extra */ +- if (params->sbr_xpos_ctrl != SBR_XPOS_CTRL_DEFAULT) +- hSbrElement->sbrHeaderData.sbr_data_extra = 1; +- +- hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res; +- +- /* header_extra_1 */ +- hSbrElement->sbrHeaderData.freqScale = params->freqScale; +- hSbrElement->sbrHeaderData.alterScale = params->alterScale; +- hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands; +- hSbrElement->sbrHeaderData.header_extra_1 = 0; +- +- if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) || +- (params->alterScale != SBR_ALTER_SCALE_DEFAULT) || +- (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) { +- hSbrElement->sbrHeaderData.header_extra_1 = 1; +- } +- +- /* header_extra_2 */ +- hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands; +- hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains; +- +- if ((hSbrElement->sbrConfigData.sampleFreq > 48000) && +- (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9)) { +- hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE; +- } +- +- hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq; +- hSbrElement->sbrHeaderData.sbr_smoothing_length = +- params->sbr_smoothing_length; +- hSbrElement->sbrHeaderData.header_extra_2 = 0; +- +- if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) || +- (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) || +- (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) || +- (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) { +- hSbrElement->sbrHeaderData.header_extra_2 = 1; +- } +- +- /* other switches */ +- hSbrElement->sbrConfigData.useWaveCoding = params->useWaveCoding; +- hSbrElement->sbrConfigData.useParametricCoding = params->parametricCoding; +- hSbrElement->sbrConfigData.thresholdAmpResFF_m = +- params->threshold_AmpRes_FF_m; +- hSbrElement->sbrConfigData.thresholdAmpResFF_e = +- params->threshold_AmpRes_FF_e; +- +- /* init freq band table */ +- if (updateFreqBandTable(&hSbrElement->sbrConfigData, +- &hSbrElement->sbrHeaderData, +- params->downSampleFactor)) { +- return (1); +- } +- +- /* now create envelope ext and QMF for each available channel */ +- for (ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) { +- if (initEnvChannel(&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, +- &hSbrElement->sbrChannel[ch]->hEnvChannel, params, +- statesInitFlag, ch, dynamic_RAM)) { +- return (1); +- } +- +- } /* nChannels */ +- +- /* reset and intialize analysis qmf */ +- for (ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo) +- ? 2 +- : hSbrElement->sbrConfigData.nChannels); +- ch++) { +- int err; +- UINT qmfFlags = +- (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) +- ? QMF_FLAG_CLDFB +- : 0; +- if (statesInitFlag) +- qmfFlags &= ~QMF_FLAG_KEEP_STATES; +- else +- qmfFlags |= QMF_FLAG_KEEP_STATES; +- +- err = qmfInitAnalysisFilterBank( +- hSbrElement->hQmfAnalysis[ch], +- (FIXP_QAS *)hSbrElement->hQmfAnalysis[ch]->FilterStates, +- hSbrElement->sbrConfigData.noQmfSlots, +- hSbrElement->sbrConfigData.noQmfBands, +- hSbrElement->sbrConfigData.noQmfBands, +- hSbrElement->sbrConfigData.noQmfBands, qmfFlags); +- if (0 != err) { +- return err; +- } +- } +- +- /* */ +- hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq; +- hSbrElement->CmonData.dynBwEnabled = +- (params->dynBwSupported && params->dynBwEnabled); +- hSbrElement->CmonData.dynXOverFreqEnc = +- FDKsbrEnc_SbrGetXOverFreq(hSbrElement, hSbrElement->CmonData.xOverFreq); +- for (i = 0; i < 5; i++) +- hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc; +- hSbrElement->CmonData.sbrNumChannels = hSbrElement->sbrConfigData.nChannels; +- hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq; +- +- /* Update Bandwith to be passed to the core encoder */ +- *coreBandWith = hSbrElement->CmonData.xOverFreq; +- +- return (0); +-} +- +-INT sbrEncoder_GetInBufferSize(int noChannels) { +- INT temp; +- +- temp = (2048); +- temp += 1024 + MAX_SAMPLE_DELAY; +- temp *= noChannels; +- temp *= sizeof(INT_PCM); +- return temp; +-} +- +-/* +- * Encode Dummy SBR payload frames to fill the delay lines. +- */ +-static INT FDKsbrEnc_DelayCompensation(HANDLE_SBR_ENCODER hEnvEnc, +- INT_PCM *timeBuffer, +- UINT timeBufferBufSize) { +- int n, el; +- +- for (n = hEnvEnc->nBitstrDelay; n > 0; n--) { +- for (el = 0; el < hEnvEnc->noElements; el++) { +- if (FDKsbrEnc_EnvEncodeFrame( +- hEnvEnc, el, +- timeBuffer + hEnvEnc->downsampledOffset / hEnvEnc->nChannels, +- timeBufferBufSize, NULL, NULL, 1)) +- return -1; +- } +- sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer, timeBufferBufSize); +- } +- return 0; +-} +- +-UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, +- UINT coreSampleRate, AUDIO_OBJECT_TYPE aot) { +- UINT newBitRate = bitRate; +- INT index; +- +- FDK_ASSERT(numChannels > 0 && numChannels <= 2); +- if (aot == AOT_PS) { +- if (numChannels == 1) { +- index = getPsTuningTableIndex(bitRate, &newBitRate); +- if (index == INVALID_TABLE_IDX) { +- bitRate = newBitRate; +- } +- } else { +- return 0; +- } +- } +- index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, +- &newBitRate); +- if (index != INVALID_TABLE_IDX) { +- newBitRate = bitRate; +- } +- +- return newBitRate; +-} +- +-UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot) { +- UINT isPossible = (AOT_PS == aot) ? 0 : 1; +- return isPossible; +-} +- +-/*****************************************************************************/ +-/* */ +-/*functionname: sbrEncoder_Init_delay */ +-/*description: Determine Delay balancing and new encoder delay */ +-/* */ +-/*returns: - error status */ +-/*input: - frame length of the core (i.e. e.g. AAC) */ +-/* - number of channels */ +-/* - downsample factor (1 for downsampled, 2 for dual-rate SBR) */ +-/* - low delay presence */ +-/* - ps presence */ +-/* - downsampling method: QMF-, time domain or no downsampling */ +-/* - various delay values (see DELAY_PARAM struct description) */ +-/* */ +-/*Example: Delay balancing for a HE-AACv1 encoder (time-domain downsampling) */ +-/*========================================================================== */ +-/* */ +-/* +--------+ +--------+ +--------+ +--------+ +--------+ */ +-/* |core | |ds 2:1 | |AAC | |QMF | |QMF | */ +-/* +-+path +------------+ +-+core +-+analysis+-+overlap +-+ */ +-/* | |offset | | | | | |32 bands| | | | */ +-/* | +--------+ +--------+ +--------+ +--------+ +--------+ | */ +-/* | core path +-------++ */ +-/* | |QMF | */ +-/*->+ +synth. +-> */ +-/* | |64 bands| */ +-/* | +-------++ */ +-/* | +--------+ +--------+ +--------+ +--------+ | */ +-/* | |SBR path| |QMF | |subband | |bs delay| | */ +-/* +-+offset +-+analysis+-+sample +-+(full +-----------------------+ */ +-/* | | |64 bands| |buffer | | frames)| */ +-/* +--------+ +--------+ +--------+ +--------+ */ +-/* SBR path */ +-/* */ +-/*****************************************************************************/ +-static INT sbrEncoder_Init_delay( +- const int coreFrameLength, /* input */ +- const int numChannels, /* input */ +- const int downSampleFactor, /* input */ +- const int lowDelay, /* input */ +- const int usePs, /* input */ +- const int is212, /* input */ +- const SBRENC_DS_TYPE downsamplingMethod, /* input */ +- DELAY_PARAM *hDelayParam /* input/output */ +-) { +- int delayCorePath = 0; /* delay in core path */ +- int delaySbrPath = 0; /* delay difference in QMF aka SBR path */ +- int delayInput2Core = 0; /* delay from the input to the core */ +- int delaySbrDec = 0; /* delay of the decoder's SBR module */ +- +- int delayCore = hDelayParam->delay; /* delay of the core */ +- +- /* Added delay by the SBR delay initialization */ +- int corePathOffset = 0; /* core path */ +- int sbrPathOffset = 0; /* sbr path */ +- int bitstreamDelay = 0; /* sbr path, framewise */ +- +- int flCore = coreFrameLength; /* core frame length */ +- +- int returnValue = 0; /* return value - 0 means: no error */ +- +- /* 1) Calculate actual delay for core and SBR path */ +- if (is212) { +- delayCorePath = DELAY_COREPATH_ELDv2SBR(flCore, downSampleFactor); +- delaySbrPath = DELAY_ELDv2SBR(flCore, downSampleFactor); +- delaySbrDec = ((flCore) / 2) * (downSampleFactor); +- } else if (lowDelay) { +- delayCorePath = DELAY_COREPATH_ELDSBR(flCore, downSampleFactor); +- delaySbrPath = DELAY_ELDSBR(flCore, downSampleFactor); +- delaySbrDec = DELAY_QMF_POSTPROC(downSampleFactor); +- } else if (usePs) { +- delayCorePath = DELAY_COREPATH_PS(flCore, downSampleFactor); +- delaySbrPath = DELAY_PS(flCore, downSampleFactor); +- delaySbrDec = DELAY_COREPATH_SBR(flCore, downSampleFactor); +- } else { +- delayCorePath = DELAY_COREPATH_SBR(flCore, downSampleFactor); +- delaySbrPath = DELAY_SBR(flCore, downSampleFactor); +- delaySbrDec = DELAY_COREPATH_SBR(flCore, downSampleFactor); +- } +- delayCorePath += delayCore * downSampleFactor; +- delayCorePath += +- (downsamplingMethod == SBRENC_DS_TIME) ? hDelayParam->dsDelay : 0; +- +- /* 2) Manage coupling of paths */ +- if (downsamplingMethod == SBRENC_DS_QMF && delayCorePath > delaySbrPath) { +- /* In case of QMF downsampling, both paths are coupled, i.e. the SBR path +- offset would be added to both the SBR path and to the core path +- as well, thus making it impossible to achieve delay balancing. +- To overcome that problem, a framewise delay is added to the SBR path +- first, until the overall delay of the core path is shorter than +- the delay of the SBR path. When this is achieved, the missing delay +- difference can be added as downsampled offset to the core path. +- */ +- while (delayCorePath > delaySbrPath) { +- /* Add one frame delay to SBR path */ +- delaySbrPath += flCore * downSampleFactor; +- bitstreamDelay += 1; +- } +- } +- +- /* 3) Calculate necessary additional delay to balance the paths */ +- if (delayCorePath > delaySbrPath) { +- /* Delay QMF input */ +- while (delayCorePath > delaySbrPath + (int)flCore * (int)downSampleFactor) { +- /* Do bitstream frame-wise delay balancing if there are +- more than SBR framelength samples delay difference */ +- delaySbrPath += flCore * downSampleFactor; +- bitstreamDelay += 1; +- } +- /* Multiply input offset by input channels */ +- corePathOffset = 0; +- sbrPathOffset = (delayCorePath - delaySbrPath) * numChannels; +- } else { +- /* Delay AAC data */ +- /* Multiply downsampled offset by AAC core channels. Divide by 2 because of +- half samplerate of downsampled data. */ +- corePathOffset = ((delaySbrPath - delayCorePath) * numChannels) >> +- (downSampleFactor - 1); +- sbrPathOffset = 0; +- } +- +- /* 4) Calculate delay from input to core */ +- if (usePs) { +- delayInput2Core = +- (DELAY_QMF_ANA(downSampleFactor) + DELAY_QMF_DS + DELAY_HYB_SYN) + +- (downSampleFactor * corePathOffset) + 1; +- } else if (downsamplingMethod == SBRENC_DS_TIME) { +- delayInput2Core = corePathOffset + hDelayParam->dsDelay; +- } else { +- delayInput2Core = corePathOffset; +- } +- +- /* 6) Set output parameters */ +- hDelayParam->delay = FDKmax(delayCorePath, delaySbrPath); /* overall delay */ +- hDelayParam->sbrDecDelay = delaySbrDec; /* SBR decoder delay */ +- hDelayParam->delayInput2Core = delayInput2Core; /* delay input - core */ +- hDelayParam->bitstrDelay = bitstreamDelay; /* bitstream delay, in frames */ +- hDelayParam->corePathOffset = corePathOffset; /* offset added to core path */ +- hDelayParam->sbrPathOffset = sbrPathOffset; /* offset added to SBR path */ +- +- return returnValue; +-} +- +-/***************************************************************************** +- +- functionname: sbrEncoder_Init +- description: initializes the SBR encoder +- returns: error status +- +-*****************************************************************************/ +-INT sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder, +- SBR_ELEMENT_INFO elInfo[(8)], int noElements, +- INT_PCM *inputBuffer, UINT inputBufferBufSize, +- INT *coreBandwidth, INT *inputBufferOffset, +- INT *numChannels, const UINT syntaxFlags, +- INT *coreSampleRate, UINT *downSampleFactor, +- INT *frameLength, AUDIO_OBJECT_TYPE aot, int *delay, +- int transformFactor, const int headerPeriod, +- ULONG statesInitFlag) { +- HANDLE_ERROR_INFO errorInfo = noError; +- sbrConfiguration sbrConfig[(8)]; +- INT error = 0; +- INT lowestBandwidth; +- /* Save input parameters */ +- INT inputSampleRate = *coreSampleRate; +- int coreFrameLength = *frameLength; +- int inputBandWidth = *coreBandwidth; +- int inputChannels = *numChannels; +- +- SBRENC_DS_TYPE downsamplingMethod = SBRENC_DS_NONE; +- int highestSbrStartFreq, highestSbrStopFreq; +- int lowDelay = 0; +- int usePs = 0; +- int is212 = 0; +- +- DELAY_PARAM delayParam; +- +- /* check whether SBR setting is available for the current encoder +- * configuration (bitrate, samplerate) */ +- if (!sbrEncoder_IsSingleRatePossible(aot)) { +- *downSampleFactor = 2; +- } +- +- if (aot == AOT_PS) { +- usePs = 1; +- } +- if (aot == AOT_ER_AAC_ELD) { +- lowDelay = 1; +- } else if (aot == AOT_ER_AAC_LD) { +- error = 1; +- goto bail; +- } +- +- /* Parametric Stereo */ +- if (usePs) { +- if (*numChannels == 2 && noElements == 1) { +- /* Override Element type in case of Parametric stereo */ +- elInfo[0].elType = ID_SCE; +- elInfo[0].fParametricStereo = 1; +- elInfo[0].nChannelsInEl = 1; +- /* core encoder gets downmixed mono signal */ +- *numChannels = 1; +- } else { +- error = 1; +- goto bail; +- } +- } /* usePs */ +- +- /* set the core's sample rate */ +- switch (*downSampleFactor) { +- case 1: +- *coreSampleRate = inputSampleRate; +- downsamplingMethod = SBRENC_DS_NONE; +- break; +- case 2: +- *coreSampleRate = inputSampleRate >> 1; +- downsamplingMethod = usePs ? SBRENC_DS_QMF : SBRENC_DS_TIME; +- break; +- default: +- *coreSampleRate = inputSampleRate >> 1; +- return 0; /* return error */ +- } +- +- /* check whether SBR setting is available for the current encoder +- * configuration (bitrate, coreSampleRate) */ +- { +- int el, coreEl; +- +- /* Check if every element config is feasible */ +- for (coreEl = 0; coreEl < noElements; coreEl++) { +- /* SBR only handles SCE and CPE's */ +- if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) { +- continue; +- } +- /* check if desired configuration is available */ +- if (!FDKsbrEnc_IsSbrSettingAvail(elInfo[coreEl].bitRate, 0, +- elInfo[coreEl].nChannelsInEl, +- inputSampleRate, *coreSampleRate, aot)) { +- error = 1; +- goto bail; +- } +- } +- +- hSbrEncoder->nChannels = *numChannels; +- hSbrEncoder->frameSize = coreFrameLength * *downSampleFactor; +- hSbrEncoder->downsamplingMethod = downsamplingMethod; +- hSbrEncoder->downSampleFactor = *downSampleFactor; +- hSbrEncoder->estimateBitrate = 0; +- hSbrEncoder->inputDataDelay = 0; +- is212 = ((aot == AOT_ER_AAC_ELD) && (syntaxFlags & AC_LD_MPS)) ? 1 : 0; +- +- /* Open SBR elements */ +- el = -1; +- highestSbrStartFreq = highestSbrStopFreq = 0; +- lowestBandwidth = 99999; +- +- /* Loop through each core encoder element and get a matching SBR element +- * config */ +- for (coreEl = 0; coreEl < noElements; coreEl++) { +- /* SBR only handles SCE and CPE's */ +- if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { +- el++; +- } else { +- continue; +- } +- +- /* Set parametric Stereo Flag. */ +- if (usePs) { +- elInfo[coreEl].fParametricStereo = 1; +- } else { +- elInfo[coreEl].fParametricStereo = 0; +- } +- +- /* +- * Init sbrConfig structure +- */ +- if (!FDKsbrEnc_InitializeSbrDefaults(&sbrConfig[el], *downSampleFactor, +- coreFrameLength, IS_LOWDELAY(aot))) { +- error = 1; +- goto bail; +- } +- +- /* +- * Modify sbrConfig structure according to Element parameters +- */ +- if (!FDKsbrEnc_AdjustSbrSettings( +- &sbrConfig[el], elInfo[coreEl].bitRate, +- elInfo[coreEl].nChannelsInEl, *coreSampleRate, inputSampleRate, +- transformFactor, 24000, 0, 0, /* useSpeechConfig */ +- 0, /* lcsMode */ +- usePs, /* bParametricStereo */ +- aot)) { +- error = 1; +- goto bail; +- } +- +- /* Find common frequency border for all SBR elements */ +- highestSbrStartFreq = +- fixMax(highestSbrStartFreq, sbrConfig[el].startFreq); +- highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq); +- +- } /* first element loop */ +- +- /* Set element count (can be less than core encoder element count) */ +- hSbrEncoder->noElements = el + 1; +- +- FDKsbrEnc_Reallocate(hSbrEncoder, elInfo, noElements); +- +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- int bandwidth = *coreBandwidth; +- +- /* Use lowest common bandwidth */ +- sbrConfig[el].startFreq = highestSbrStartFreq; +- sbrConfig[el].stopFreq = highestSbrStopFreq; +- +- /* initialize SBR element, and get core bandwidth */ +- error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el], &sbrConfig[el], +- &bandwidth, aot, el, headerPeriod, +- statesInitFlag, hSbrEncoder->downsamplingMethod, +- hSbrEncoder->dynamicRam); +- +- if (error != 0) { +- error = 2; +- goto bail; +- } +- +- /* Get lowest core encoder bandwidth to be returned later. */ +- lowestBandwidth = fixMin(lowestBandwidth, bandwidth); +- +- } /* second element loop */ +- +- /* Initialize a downsampler for each channel in each SBR element */ +- if (hSbrEncoder->downsamplingMethod == SBRENC_DS_TIME) { +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el]; +- INT Wc, ch; +- +- Wc = 500; /* Cutoff frequency with full bandwidth */ +- +- for (ch = 0; ch < hSbrEl->elInfo.nChannelsInEl; ch++) { +- FDKaacEnc_InitDownsampler(&hSbrEl->sbrChannel[ch]->downSampler, Wc, +- *downSampleFactor); +- FDK_ASSERT(hSbrEl->sbrChannel[ch]->downSampler.delay <= +- MAX_DS_FILTER_DELAY); +- } +- } /* third element loop */ +- +- /* lfe */ +- FDKaacEnc_InitDownsampler(&hSbrEncoder->lfeDownSampler, 0, +- *downSampleFactor); +- } +- +- /* Get delay information */ +- delayParam.dsDelay = +- hSbrEncoder->sbrElement[0]->sbrChannel[0]->downSampler.delay; +- delayParam.delay = *delay; +- +- error = sbrEncoder_Init_delay(coreFrameLength, *numChannels, +- *downSampleFactor, lowDelay, usePs, is212, +- downsamplingMethod, &delayParam); +- +- if (error != 0) { +- error = 3; +- goto bail; +- } +- +- hSbrEncoder->nBitstrDelay = delayParam.bitstrDelay; +- hSbrEncoder->sbrDecDelay = delayParam.sbrDecDelay; +- hSbrEncoder->inputDataDelay = delayParam.delayInput2Core; +- +- /* Assign core encoder Bandwidth */ +- *coreBandwidth = lowestBandwidth; +- +- /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */ +- hSbrEncoder->estimateBitrate += 2500 * (*numChannels); +- +- /* Initialize bitstream buffer for each element */ +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- FDKsbrEnc_bsBufInit(hSbrEncoder->sbrElement[el], delayParam.bitstrDelay); +- } +- +- /* initialize parametric stereo */ +- if (usePs) { +- PSENC_CONFIG psEncConfig; +- FDK_ASSERT(hSbrEncoder->noElements == 1); +- INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL); +- +- psEncConfig.frameSize = coreFrameLength; // sbrConfig.sbrFrameSize; +- psEncConfig.qmfFilterMode = 0; +- psEncConfig.sbrPsDelay = 0; +- +- /* tuning parameters */ +- if (psTuningTableIdx != INVALID_TABLE_IDX) { +- psEncConfig.nStereoBands = psTuningTable[psTuningTableIdx].nStereoBands; +- psEncConfig.maxEnvelopes = psTuningTable[psTuningTableIdx].nEnvelopes; +- psEncConfig.iidQuantErrorThreshold = +- (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold; +- +- /* calculation is not quite linear, increased number of envelopes causes +- * more bits */ +- /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope +- * configuration */ +- hSbrEncoder->estimateBitrate += +- ((((*coreSampleRate) * 5 * psEncConfig.nStereoBands * +- psEncConfig.maxEnvelopes) / +- hSbrEncoder->frameSize)); +- +- } else { +- error = ERROR(CDI, "Invalid ps tuning table index."); +- goto bail; +- } +- +- qmfInitSynthesisFilterBank( +- &hSbrEncoder->qmfSynthesisPS, +- (FIXP_DBL *)hSbrEncoder->qmfSynthesisPS.FilterStates, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands >> 1, +- (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES); +- +- if (errorInfo == noError) { +- /* update delay */ +- psEncConfig.sbrPsDelay = +- FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0] +- ->sbrChannel[0] +- ->hEnvChannel.sbrExtractEnvelope); +- +- errorInfo = +- PSEnc_Init(hSbrEncoder->hParametricStereo, &psEncConfig, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, +- hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands, +- hSbrEncoder->dynamicRam); +- } +- } +- +- hSbrEncoder->downsampledOffset = delayParam.corePathOffset; +- hSbrEncoder->bufferOffset = delayParam.sbrPathOffset; +- *delay = delayParam.delay; +- +- { hSbrEncoder->downmixSize = coreFrameLength * (*numChannels); } +- +- /* Delay Compensation: fill bitstream delay buffer with zero input signal */ +- if (hSbrEncoder->nBitstrDelay > 0) { +- error = FDKsbrEnc_DelayCompensation(hSbrEncoder, inputBuffer, +- inputBufferBufSize); +- if (error != 0) goto bail; +- } +- +- /* Set Output frame length */ +- *frameLength = coreFrameLength * *downSampleFactor; +- /* Input buffer offset */ +- *inputBufferOffset = +- fixMax(delayParam.sbrPathOffset, delayParam.corePathOffset); +- } +- +- return error; +- +-bail: +- /* Restore input settings */ +- *coreSampleRate = inputSampleRate; +- *frameLength = coreFrameLength; +- *numChannels = inputChannels; +- *coreBandwidth = inputBandWidth; +- +- return error; +-} +- +-INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hSbrEncoder, INT_PCM *samples, +- UINT samplesBufSize, UINT sbrDataBits[(8)], +- UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]) { +- INT error; +- int el; +- +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- if (hSbrEncoder->sbrElement[el] != NULL) { +- error = FDKsbrEnc_EnvEncodeFrame( +- hSbrEncoder, el, +- samples + hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels, +- samplesBufSize, &sbrDataBits[el], sbrData[el], 0); +- if (error) return error; +- } +- } +- +- error = FDKsbrEnc_Downsample( +- hSbrEncoder, +- samples + hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels, +- samplesBufSize, hSbrEncoder->nChannels, &sbrDataBits[el], sbrData[el], 0); +- if (error) return error; +- +- return 0; +-} +- +-INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hSbrEncoder, +- INT_PCM *timeBuffer, UINT timeBufferBufSize) { +- if (hSbrEncoder->downsampledOffset > 0) { +- int c; +- int nd = hSbrEncoder->downmixSize / hSbrEncoder->nChannels; +- +- for (c = 0; c < hSbrEncoder->nChannels; c++) { +- /* Move delayed downsampled data */ +- FDKmemcpy(timeBuffer + timeBufferBufSize * c, +- timeBuffer + timeBufferBufSize * c + nd, +- sizeof(INT_PCM) * +- (hSbrEncoder->downsampledOffset / hSbrEncoder->nChannels)); +- } +- } else { +- int c; +- +- for (c = 0; c < hSbrEncoder->nChannels; c++) { +- /* Move delayed input data */ +- FDKmemcpy( +- timeBuffer + timeBufferBufSize * c, +- timeBuffer + timeBufferBufSize * c + hSbrEncoder->frameSize, +- sizeof(INT_PCM) * hSbrEncoder->bufferOffset / hSbrEncoder->nChannels); +- } +- } +- if (hSbrEncoder->nBitstrDelay > 0) { +- int el; +- +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- FDKmemmove( +- hSbrEncoder->sbrElement[el]->payloadDelayLine[0], +- hSbrEncoder->sbrElement[el]->payloadDelayLine[1], +- sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay * MAX_PAYLOAD_SIZE)); +- +- FDKmemmove(&hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0], +- &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1], +- sizeof(UINT) * (hSbrEncoder->nBitstrDelay)); +- } +- } +- return 0; +-} +- +-INT sbrEncoder_SendHeader(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT error = -1; +- if (hSbrEncoder) { +- int el; +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- if ((hSbrEncoder->noElements == 1) && +- (hSbrEncoder->sbrElement[0]->elInfo.fParametricStereo == 1)) { +- hSbrEncoder->sbrElement[el]->sbrBitstreamData.CountSendHeaderData = +- hSbrEncoder->sbrElement[el]->sbrBitstreamData.NrSendHeaderData - 1; +- } else { +- hSbrEncoder->sbrElement[el]->sbrBitstreamData.CountSendHeaderData = 0; +- } +- } +- error = 0; +- } +- return error; +-} +- +-INT sbrEncoder_ContainsHeader(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT sbrHeader = 1; +- if (hSbrEncoder) { +- int el; +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- sbrHeader &= +- (hSbrEncoder->sbrElement[el]->sbrBitstreamData.HeaderActiveDelay == 1) +- ? 1 +- : 0; +- } +- } +- return sbrHeader; +-} +- +-INT sbrEncoder_GetHeaderDelay(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT delay = -1; +- +- if (hSbrEncoder) { +- if ((hSbrEncoder->noElements == 1) && +- (hSbrEncoder->sbrElement[0]->elInfo.fParametricStereo == 1)) { +- delay = hSbrEncoder->nBitstrDelay + 1; +- } else { +- delay = hSbrEncoder->nBitstrDelay; +- } +- } +- return delay; +-} +-INT sbrEncoder_GetBsDelay(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT delay = -1; +- +- if (hSbrEncoder) { +- delay = hSbrEncoder->nBitstrDelay; +- } +- return delay; +-} +- +-INT sbrEncoder_SAPPrepare(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT error = -1; +- if (hSbrEncoder) { +- int el; +- for (el = 0; el < hSbrEncoder->noElements; el++) { +- hSbrEncoder->sbrElement[el]->sbrBitstreamData.rightBorderFIX = 1; +- } +- error = 0; +- } +- return error; +-} +- +-INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT estimateBitrate = 0; +- +- if (hSbrEncoder) { +- estimateBitrate += hSbrEncoder->estimateBitrate; +- } +- +- return estimateBitrate; +-} +- +-INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT delay = -1; +- +- if (hSbrEncoder) { +- delay = hSbrEncoder->inputDataDelay; +- } +- return delay; +-} +- +-INT sbrEncoder_GetSbrDecDelay(HANDLE_SBR_ENCODER hSbrEncoder) { +- INT delay = -1; +- +- if (hSbrEncoder) { +- delay = hSbrEncoder->sbrDecDelay; +- } +- return delay; +-} +- +-INT sbrEncoder_GetLibInfo(LIB_INFO *info) { +- int i; +- +- if (info == NULL) { +- return -1; +- } +- /* search for next free tab */ +- for (i = 0; i < FDK_MODULE_LAST; i++) { +- if (info[i].module_id == FDK_NONE) break; +- } +- if (i == FDK_MODULE_LAST) { +- return -1; +- } +- info += i; +- +- info->module_id = FDK_SBRENC; +- info->version = +- LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2); +- LIB_VERSION_STRING(info); +-#ifdef __ANDROID__ +- info->build_date = ""; +- info->build_time = ""; +-#else +- info->build_date = __DATE__; +- info->build_time = __TIME__; +-#endif +- info->title = "SBR Encoder"; +- +- /* Set flags */ +- info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_PS_MPEG; +- /* End of flags */ +- +- return 0; +-} +diff --git a/libSBRenc/src/sbr_misc.cpp b/libSBRenc/src/sbr_misc.cpp +deleted file mode 100644 +index 83d7e36..0000000 +--- a/libSBRenc/src/sbr_misc.cpp ++++ /dev/null +@@ -1,265 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Sbr miscellaneous helper functions $Revision: 36750 $ +-*/ +-#include "sbr_misc.h" +- +-void FDKsbrEnc_Shellsort_fract(FIXP_DBL *in, INT n) { +- FIXP_DBL v; +- INT i, j; +- INT inc = 1; +- +- do +- inc = 3 * inc + 1; +- while (inc <= n); +- +- do { +- inc = inc / 3; +- for (i = inc + 1; i <= n; i++) { +- v = in[i - 1]; +- j = i; +- while (in[j - inc - 1] > v) { +- in[j - 1] = in[j - inc - 1]; +- j -= inc; +- if (j <= inc) break; +- } +- in[j - 1] = v; +- } +- } while (inc > 1); +-} +- +-/* Sorting routine */ +-void FDKsbrEnc_Shellsort_int(INT *in, INT n) { +- INT i, j, v; +- INT inc = 1; +- +- do +- inc = 3 * inc + 1; +- while (inc <= n); +- +- do { +- inc = inc / 3; +- for (i = inc + 1; i <= n; i++) { +- v = in[i - 1]; +- j = i; +- while (in[j - inc - 1] > v) { +- in[j - 1] = in[j - inc - 1]; +- j -= inc; +- if (j <= inc) break; +- } +- in[j - 1] = v; +- } +- } while (inc > 1); +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_AddVecLeft +- ******************************************************************************* +- +- Description: +- +- Arguments: INT* dst, INT* length_dst, INT* src, INT length_src +- +- Return: none +- +-*******************************************************************************/ +-void FDKsbrEnc_AddVecLeft(INT *dst, INT *length_dst, INT *src, INT length_src) { +- INT i; +- +- for (i = length_src - 1; i >= 0; i--) +- FDKsbrEnc_AddLeft(dst, length_dst, src[i]); +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_AddLeft +- ******************************************************************************* +- +- Description: +- +- Arguments: INT* vector, INT* length_vector, INT value +- +- Return: none +- +-*******************************************************************************/ +-void FDKsbrEnc_AddLeft(INT *vector, INT *length_vector, INT value) { +- INT i; +- +- for (i = *length_vector; i > 0; i--) vector[i] = vector[i - 1]; +- vector[0] = value; +- (*length_vector)++; +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_AddRight +- ******************************************************************************* +- +- Description: +- +- Arguments: INT* vector, INT* length_vector, INT value +- +- Return: none +- +-*******************************************************************************/ +-void FDKsbrEnc_AddRight(INT *vector, INT *length_vector, INT value) { +- vector[*length_vector] = value; +- (*length_vector)++; +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_AddVecRight +- ******************************************************************************* +- +- Description: +- +- Arguments: INT* dst, INT* length_dst, INT* src, INT length_src) +- +- Return: none +- +-*******************************************************************************/ +-void FDKsbrEnc_AddVecRight(INT *dst, INT *length_dst, INT *src, +- INT length_src) { +- INT i; +- for (i = 0; i < length_src; i++) FDKsbrEnc_AddRight(dst, length_dst, src[i]); +-} +- +-/***************************************************************************** +- +- functionname: FDKsbrEnc_LSI_divide_scale_fract +- +- description: Calculates division with best precision and scales the result. +- +- return: num*scale/denom +- +-*****************************************************************************/ +-FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, +- FIXP_DBL scale) { +- FIXP_DBL tmp = FL2FXCONST_DBL(0.0f); +- if (num != FL2FXCONST_DBL(0.0f)) { +- INT shiftCommon; +- INT shiftNum = CountLeadingBits(num); +- INT shiftDenom = CountLeadingBits(denom); +- INT shiftScale = CountLeadingBits(scale); +- +- num = num << shiftNum; +- scale = scale << shiftScale; +- +- tmp = fMultDiv2(num, scale); +- +- if (denom > (tmp >> fixMin(shiftNum + shiftScale - 1, (DFRACT_BITS - 1)))) { +- denom = denom << shiftDenom; +- tmp = schur_div(tmp, denom, 15); +- shiftCommon = +- fixMin((shiftNum - shiftDenom + shiftScale - 1), (DFRACT_BITS - 1)); +- if (shiftCommon < 0) +- tmp <<= -shiftCommon; +- else +- tmp >>= shiftCommon; +- } else { +- tmp = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL; +- } +- } +- +- return (tmp); +-} +diff --git a/libSBRenc/src/sbr_misc.h b/libSBRenc/src/sbr_misc.h +deleted file mode 100644 +index fad853f..0000000 +--- a/libSBRenc/src/sbr_misc.h ++++ /dev/null +@@ -1,127 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Sbr miscellaneous helper functions prototypes $Revision: 92790 $ +- \author +-*/ +- +-#ifndef SBR_MISC_H +-#define SBR_MISC_H +- +-#include "sbr_encoder.h" +- +-/* Sorting routines */ +-void FDKsbrEnc_Shellsort_fract(FIXP_DBL *in, INT n); +-void FDKsbrEnc_Shellsort_int(INT *in, INT n); +- +-void FDKsbrEnc_AddLeft(INT *vector, INT *length_vector, INT value); +-void FDKsbrEnc_AddRight(INT *vector, INT *length_vector, INT value); +-void FDKsbrEnc_AddVecLeft(INT *dst, INT *length_dst, INT *src, INT length_src); +-void FDKsbrEnc_AddVecRight(INT *dst, INT *length_vector_dst, INT *src, +- INT length_src); +- +-FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, +- FIXP_DBL scale); +- +-#endif +diff --git a/libSBRenc/src/sbrenc_freq_sca.cpp b/libSBRenc/src/sbrenc_freq_sca.cpp +deleted file mode 100644 +index c86e047..0000000 +--- a/libSBRenc/src/sbrenc_freq_sca.cpp ++++ /dev/null +@@ -1,674 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief frequency scale $Revision: 95225 $ +-*/ +- +-#include "sbrenc_freq_sca.h" +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-/* StartFreq */ +-static INT getStartFreq(INT fsCore, const INT start_freq); +- +-/* StopFreq */ +-static INT getStopFreq(INT fsCore, const INT stop_freq); +- +-static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor); +-static void CalcBands(INT *diff, INT start, INT stop, INT num_bands); +-static INT modifyBands(INT max_band, INT *diff, INT length); +-static void cumSum(INT start_value, INT *diff, INT length, UCHAR *start_adress); +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_getSbrStartFreqRAW +- ******************************************************************************* +- Description: +- +- Arguments: +- +- Return: +- *******************************************************************************/ +- +-INT FDKsbrEnc_getSbrStartFreqRAW(INT startFreq, INT fsCore) { +- INT result; +- +- if (startFreq < 0 || startFreq > 15) { +- return -1; +- } +- /* Update startFreq struct */ +- result = getStartFreq(fsCore, startFreq); +- +- result = +- (result * (fsCore >> 5) + 1) >> 1; /* (result*fsSBR/QMFbands+1)>>1; */ +- +- return (result); +- +-} /* End FDKsbrEnc_getSbrStartFreqRAW */ +- +-/******************************************************************************* +- Functionname: getSbrStopFreq +- ******************************************************************************* +- Description: +- +- Arguments: +- +- Return: +- *******************************************************************************/ +-INT FDKsbrEnc_getSbrStopFreqRAW(INT stopFreq, INT fsCore) { +- INT result; +- +- if (stopFreq < 0 || stopFreq > 13) return -1; +- +- /* Uppdate stopFreq struct */ +- result = getStopFreq(fsCore, stopFreq); +- result = +- (result * (fsCore >> 5) + 1) >> 1; /* (result*fsSBR/QMFbands+1)>>1; */ +- +- return (result); +-} /* End getSbrStopFreq */ +- +-/******************************************************************************* +- Functionname: getStartFreq +- ******************************************************************************* +- Description: +- +- Arguments: fsCore - core sampling rate +- +- +- Return: +- *******************************************************************************/ +-static INT getStartFreq(INT fsCore, const INT start_freq) { +- INT k0_min; +- +- switch (fsCore) { +- case 8000: +- k0_min = 24; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 11025: +- k0_min = 17; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 12000: +- k0_min = 16; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 16000: +- k0_min = 16; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 22050: +- k0_min = 12; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 24000: +- k0_min = 11; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 32000: +- k0_min = 10; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 44100: +- k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 48000: +- k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- case 96000: +- k0_min = 3; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ +- break; +- default: +- k0_min = 11; /* illegal fs */ +- } +- +- switch (fsCore) { +- case 8000: { +- INT v_offset[] = {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; +- return (k0_min + v_offset[start_freq]); +- } +- case 11025: { +- INT v_offset[] = {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13}; +- return (k0_min + v_offset[start_freq]); +- } +- case 12000: { +- INT v_offset[] = {-5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; +- return (k0_min + v_offset[start_freq]); +- } +- case 16000: { +- INT v_offset[] = {-6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; +- return (k0_min + v_offset[start_freq]); +- } +- case 22050: +- case 24000: +- case 32000: { +- INT v_offset[] = {-4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20}; +- return (k0_min + v_offset[start_freq]); +- } +- case 44100: +- case 48000: +- case 96000: { +- INT v_offset[] = {-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24}; +- return (k0_min + v_offset[start_freq]); +- } +- default: { +- INT v_offset[] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33}; +- return (k0_min + v_offset[start_freq]); +- } +- } +-} /* End getStartFreq */ +- +-/******************************************************************************* +- Functionname: getStopFreq +- ******************************************************************************* +- Description: +- +- Arguments: +- +- Return: +- *******************************************************************************/ +-static INT getStopFreq(INT fsCore, const INT stop_freq) { +- INT result, i; +- INT k1_min; +- INT v_dstop[13]; +- +- INT *v_stop_freq = NULL; +- INT v_stop_freq_16[14] = {48, 49, 50, 51, 52, 54, 55, +- 56, 57, 59, 60, 61, 63, 64}; +- INT v_stop_freq_22[14] = {35, 37, 38, 40, 42, 44, 46, +- 48, 51, 53, 56, 58, 61, 64}; +- INT v_stop_freq_24[14] = {32, 34, 36, 38, 40, 42, 44, +- 46, 49, 52, 55, 58, 61, 64}; +- INT v_stop_freq_32[14] = {32, 34, 36, 38, 40, 42, 44, +- 46, 49, 52, 55, 58, 61, 64}; +- INT v_stop_freq_44[14] = {23, 25, 27, 29, 32, 34, 37, +- 40, 43, 47, 51, 55, 59, 64}; +- INT v_stop_freq_48[14] = {21, 23, 25, 27, 30, 32, 35, +- 38, 42, 45, 49, 54, 59, 64}; +- INT v_stop_freq_64[14] = {20, 22, 24, 26, 29, 31, 34, +- 37, 41, 45, 49, 54, 59, 64}; +- INT v_stop_freq_88[14] = {15, 17, 19, 21, 23, 26, 29, +- 33, 37, 41, 46, 51, 57, 64}; +- INT v_stop_freq_96[14] = {13, 15, 17, 19, 21, 24, 27, +- 31, 35, 39, 44, 50, 57, 64}; +- INT v_stop_freq_192[14] = {7, 8, 10, 12, 14, 16, 19, +- 23, 27, 32, 38, 46, 54, 64}; +- +- switch (fsCore) { +- case 8000: +- k1_min = 48; +- v_stop_freq = v_stop_freq_16; +- break; +- case 11025: +- k1_min = 35; +- v_stop_freq = v_stop_freq_22; +- break; +- case 12000: +- k1_min = 32; +- v_stop_freq = v_stop_freq_24; +- break; +- case 16000: +- k1_min = 32; +- v_stop_freq = v_stop_freq_32; +- break; +- case 22050: +- k1_min = 23; +- v_stop_freq = v_stop_freq_44; +- break; +- case 24000: +- k1_min = 21; +- v_stop_freq = v_stop_freq_48; +- break; +- case 32000: +- k1_min = 20; +- v_stop_freq = v_stop_freq_64; +- break; +- case 44100: +- k1_min = 15; +- v_stop_freq = v_stop_freq_88; +- break; +- case 48000: +- k1_min = 13; +- v_stop_freq = v_stop_freq_96; +- break; +- case 96000: +- k1_min = 7; +- v_stop_freq = v_stop_freq_192; +- break; +- default: +- k1_min = 21; /* illegal fs */ +- } +- +- /* Ensure increasing bandwidth */ +- for (i = 0; i <= 12; i++) { +- v_dstop[i] = v_stop_freq[i + 1] - v_stop_freq[i]; +- } +- +- FDKsbrEnc_Shellsort_int(v_dstop, 13); /* Sort bandwidth changes */ +- +- result = k1_min; +- for (i = 0; i < stop_freq; i++) { +- result = result + v_dstop[i]; +- } +- +- return (result); +- +-} /* End getStopFreq */ +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_FindStartAndStopBand +- ******************************************************************************* +- Description: +- +- Arguments: srSbr SBR sampling freqency +- srCore AAC core sampling freqency +- noChannels Number of QMF channels +- startFreq SBR start frequency in QMF bands +- stopFreq SBR start frequency in QMF bands +- +- *k0 Output parameter +- *k2 Output parameter +- +- Return: Error code (0 is OK) +- *******************************************************************************/ +-INT FDKsbrEnc_FindStartAndStopBand(const INT srSbr, const INT srCore, +- const INT noChannels, const INT startFreq, +- const INT stopFreq, INT *k0, INT *k2) { +- /* Update startFreq struct */ +- *k0 = getStartFreq(srCore, startFreq); +- +- /* Test if start freq is outside corecoder range */ +- if (srSbr * noChannels < *k0 * srCore) { +- return ( +- 1); /* raise the cross-over frequency and/or lower the number +- of target bands per octave (or lower the sampling frequency) */ +- } +- +- /*Update stopFreq struct */ +- if (stopFreq < 14) { +- *k2 = getStopFreq(srCore, stopFreq); +- } else if (stopFreq == 14) { +- *k2 = 2 * *k0; +- } else { +- *k2 = 3 * *k0; +- } +- +- /* limit to Nyqvist */ +- if (*k2 > noChannels) { +- *k2 = noChannels; +- } +- +- /* Test for invalid k0 k2 combinations */ +- if ((srCore == 22050) && ((*k2 - *k0) > MAX_FREQ_COEFFS_FS44100)) +- return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for +- fs=44.1kHz */ +- +- if ((srCore >= 24000) && ((*k2 - *k0) > MAX_FREQ_COEFFS_FS48000)) +- return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for +- fs>=48kHz */ +- +- if ((*k2 - *k0) > MAX_FREQ_COEFFS) +- return (1); /*Number of bands exceeds valid range of MAX_FREQ_COEFFS */ +- +- if ((*k2 - *k0) < 0) return (1); /* Number of bands is negative */ +- +- return (0); +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_UpdateFreqScale +- ******************************************************************************* +- Description: +- +- Arguments: +- +- Return: +- *******************************************************************************/ +-INT FDKsbrEnc_UpdateFreqScale(UCHAR *v_k_master, INT *h_num_bands, const INT k0, +- const INT k2, const INT freqScale, +- const INT alterScale) +- +-{ +- INT b_p_o = 0; /* bands_per_octave */ +- FIXP_DBL warp = FL2FXCONST_DBL(0.0f); +- INT dk = 0; +- +- /* Internal variables */ +- INT k1 = 0, i; +- INT num_bands0; +- INT num_bands1; +- INT diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; +- INT *diff0 = diff_tot; +- INT *diff1 = diff_tot + MAX_OCTAVE; +- INT k2_achived; +- INT k2_diff; +- INT incr = 0; +- +- /* Init */ +- if (freqScale == 1) b_p_o = 12; +- if (freqScale == 2) b_p_o = 10; +- if (freqScale == 3) b_p_o = 8; +- +- if (freqScale > 0) /*Bark*/ +- { +- if (alterScale == 0) +- warp = FL2FXCONST_DBL(0.5f); /* 1.0/(1.0*2.0) */ +- else +- warp = FL2FXCONST_DBL(1.0f / 2.6f); /* 1.0/(1.3*2.0); */ +- +- if (4 * k2 >= 9 * k0) /*two or more regions (how many times the basis band +- is copied)*/ +- { +- k1 = 2 * k0; +- +- num_bands0 = numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); +- num_bands1 = numberOfBands(b_p_o, k1, k2, warp); +- +- CalcBands(diff0, k0, k1, num_bands0); /*CalcBands1 => diff0 */ +- FDKsbrEnc_Shellsort_int(diff0, num_bands0); /*SortBands sort diff0 */ +- +- if (diff0[0] == 0) /* too wide FB bands for target tuning */ +- { +- return (1); /* raise the cross-over frequency and/or lower the number +- of target bands per octave (or lower the sampling +- frequency */ +- } +- +- cumSum(k0, diff0, num_bands0, v_k_master); /* cumsum */ +- +- CalcBands(diff1, k1, k2, num_bands1); /* CalcBands2 => diff1 */ +- FDKsbrEnc_Shellsort_int(diff1, num_bands1); /* SortBands sort diff1 */ +- if (diff0[num_bands0 - 1] > diff1[0]) /* max(1) > min(2) */ +- { +- if (modifyBands(diff0[num_bands0 - 1], diff1, num_bands1)) return (1); +- } +- +- /* Add 2'nd region */ +- cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); +- *h_num_bands = num_bands0 + num_bands1; /* Output nr of bands */ +- +- } else /* one region */ +- { +- k1 = k2; +- +- num_bands0 = numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); +- CalcBands(diff0, k0, k1, num_bands0); /* CalcBands1 => diff0 */ +- FDKsbrEnc_Shellsort_int(diff0, num_bands0); /* SortBands sort diff0 */ +- +- if (diff0[0] == 0) /* too wide FB bands for target tuning */ +- { +- return (1); /* raise the cross-over frequency and/or lower the number +- of target bands per octave (or lower the sampling +- frequency */ +- } +- +- cumSum(k0, diff0, num_bands0, v_k_master); /* cumsum */ +- *h_num_bands = num_bands0; /* Output nr of bands */ +- } +- } else /* Linear mode */ +- { +- if (alterScale == 0) { +- dk = 1; +- num_bands0 = 2 * ((k2 - k0) / 2); /* FLOOR to get to few number of bands*/ +- } else { +- dk = 2; +- num_bands0 = +- 2 * (((k2 - k0) / dk + 1) / 2); /* ROUND to get closest fit */ +- } +- +- k2_achived = k0 + num_bands0 * dk; +- k2_diff = k2 - k2_achived; +- +- for (i = 0; i < num_bands0; i++) diff_tot[i] = dk; +- +- /* If linear scale wasn't achived */ +- /* and we got wide SBR are */ +- if (k2_diff < 0) { +- incr = 1; +- i = 0; +- } +- +- /* If linear scale wasn't achived */ +- /* and we got small SBR are */ +- if (k2_diff > 0) { +- incr = -1; +- i = num_bands0 - 1; +- } +- +- /* Adjust diff vector to get sepc. SBR range */ +- while (k2_diff != 0) { +- diff_tot[i] = diff_tot[i] - incr; +- i = i + incr; +- k2_diff = k2_diff + incr; +- } +- +- cumSum(k0, diff_tot, num_bands0, v_k_master); /* cumsum */ +- *h_num_bands = num_bands0; /* Output nr of bands */ +- } +- +- if (*h_num_bands < 1) return (1); /*To small sbr area */ +- +- return (0); +-} /* End FDKsbrEnc_UpdateFreqScale */ +- +-static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor) { +- INT result = 0; +- /* result = 2* (INT) ( (double)b_p_o * +- * (double)(FDKlog((double)stop/(double)start)/FDKlog((double)2)) * +- * (double)FX_DBL2FL(warp_factor) + 0.5); */ +- result = ((b_p_o * fMult((CalcLdInt(stop) - CalcLdInt(start)), warp_factor) + +- (FL2FX_DBL(0.5f) >> LD_DATA_SHIFT)) >> +- ((DFRACT_BITS - 1) - LD_DATA_SHIFT)) +- << 1; /* do not optimize anymore (rounding!!) */ +- +- return (result); +-} +- +-static void CalcBands(INT *diff, INT start, INT stop, INT num_bands) { +- INT i, qb, qe, qtmp; +- INT previous; +- INT current; +- FIXP_DBL base, exp, tmp; +- +- previous = start; +- for (i = 1; i <= num_bands; i++) { +- base = fDivNorm((FIXP_DBL)stop, (FIXP_DBL)start, &qb); +- exp = fDivNorm((FIXP_DBL)i, (FIXP_DBL)num_bands, &qe); +- tmp = fPow(base, qb, exp, qe, &qtmp); +- tmp = fMult(tmp, (FIXP_DBL)(start << 24)); +- current = (INT)scaleValue(tmp, qtmp - 23); +- current = (current + 1) >> 1; /* rounding*/ +- diff[i - 1] = current - previous; +- previous = current; +- } +- +-} /* End CalcBands */ +- +-static void cumSum(INT start_value, INT *diff, INT length, +- UCHAR *start_adress) { +- INT i; +- start_adress[0] = start_value; +- for (i = 1; i <= length; i++) +- start_adress[i] = start_adress[i - 1] + diff[i - 1]; +-} /* End cumSum */ +- +-static INT modifyBands(INT max_band_previous, INT *diff, INT length) { +- INT change = max_band_previous - diff[0]; +- +- /* Limit the change so that the last band cannot get narrower than the first +- * one */ +- if (change > (diff[length - 1] - diff[0]) / 2) +- change = (diff[length - 1] - diff[0]) / 2; +- +- diff[0] += change; +- diff[length - 1] -= change; +- FDKsbrEnc_Shellsort_int(diff, length); +- +- return (0); +-} /* End modifyBands */ +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_UpdateHiRes +- ******************************************************************************* +- Description: +- +- +- Arguments: +- +- Return: +- *******************************************************************************/ +-INT FDKsbrEnc_UpdateHiRes(UCHAR *h_hires, INT *num_hires, UCHAR *v_k_master, +- INT num_master, INT *xover_band) { +- INT i; +- INT max1, max2; +- +- if ((v_k_master[*xover_band] > +- 32) || /* v_k_master[*xover_band] > noQMFChannels(dualRate)/divider */ +- (*xover_band > num_master)) { +- /* xover_band error, too big for this startFreq. Will be clipped */ +- +- /* Calculate maximum value for xover_band */ +- max1 = 0; +- max2 = num_master; +- while ((v_k_master[max1 + 1] < 32) && /* noQMFChannels(dualRate)/divider */ +- ((max1 + 1) < max2)) { +- max1++; +- } +- +- *xover_band = max1; +- } +- +- *num_hires = num_master - *xover_band; +- for (i = *xover_band; i <= num_master; i++) { +- h_hires[i - *xover_band] = v_k_master[i]; +- } +- +- return (0); +-} /* End FDKsbrEnc_UpdateHiRes */ +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_UpdateLoRes +- ******************************************************************************* +- Description: +- +- Arguments: +- +- Return: +- *******************************************************************************/ +-void FDKsbrEnc_UpdateLoRes(UCHAR *h_lores, INT *num_lores, UCHAR *h_hires, +- INT num_hires) { +- INT i; +- +- if (num_hires % 2 == 0) /* if even number of hires bands */ +- { +- *num_lores = num_hires / 2; +- /* Use every second lores=hires[0,2,4...] */ +- for (i = 0; i <= *num_lores; i++) h_lores[i] = h_hires[i * 2]; +- +- } else /* odd number of hires which means xover is odd */ +- { +- *num_lores = (num_hires + 1) / 2; +- +- /* Use lores=hires[0,1,3,5 ...] */ +- h_lores[0] = h_hires[0]; +- for (i = 1; i <= *num_lores; i++) { +- h_lores[i] = h_hires[i * 2 - 1]; +- } +- } +- +-} /* End FDKsbrEnc_UpdateLoRes */ +diff --git a/libSBRenc/src/sbrenc_freq_sca.h b/libSBRenc/src/sbrenc_freq_sca.h +deleted file mode 100644 +index 9b8d360..0000000 +--- a/libSBRenc/src/sbrenc_freq_sca.h ++++ /dev/null +@@ -1,132 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief frequency scale prototypes $Revision: 92790 $ +-*/ +-#ifndef SBRENC_FREQ_SCA_H +-#define SBRENC_FREQ_SCA_H +- +-#include "sbr_encoder.h" +-#include "sbr_def.h" +- +-#define MAX_OCTAVE 29 +-#define MAX_SECOND_REGION 50 +- +-INT FDKsbrEnc_UpdateFreqScale(UCHAR *v_k_master, INT *h_num_bands, const INT k0, +- const INT k2, const INT freq_scale, +- const INT alter_scale); +- +-INT FDKsbrEnc_UpdateHiRes(UCHAR *h_hires, INT *num_hires, UCHAR *v_k_master, +- INT num_master, INT *xover_band); +- +-void FDKsbrEnc_UpdateLoRes(UCHAR *v_lores, INT *num_lores, UCHAR *v_hires, +- INT num_hires); +- +-INT FDKsbrEnc_FindStartAndStopBand(const INT srSbr, const INT srCore, +- const INT noChannels, const INT startFreq, +- const INT stop_freq, INT *k0, INT *k2); +- +-INT FDKsbrEnc_getSbrStartFreqRAW(INT startFreq, INT fsCore); +-INT FDKsbrEnc_getSbrStopFreqRAW(INT stopFreq, INT fsCore); +-#endif +diff --git a/libSBRenc/src/sbrenc_ram.cpp b/libSBRenc/src/sbrenc_ram.cpp +deleted file mode 100644 +index fb30fa2..0000000 +--- a/libSBRenc/src/sbrenc_ram.cpp ++++ /dev/null +@@ -1,249 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Memory layout +- $Revision: 92864 $ +- +- This module declares all static and dynamic memory spaces +-*/ +-#include "sbrenc_ram.h" +- +-#include "sbr.h" +-#include "genericStds.h" +- +-C_AALLOC_MEM(Ram_SbrDynamic_RAM, FIXP_DBL, +- ((SBR_ENC_DYN_RAM_SIZE) / sizeof(FIXP_DBL))) +- +-/*! +- \name StaticSbrData +- +- Static memory areas, must not be overwritten in other sections of the encoder +-*/ +-/* @{ */ +- +-/*! static sbr encoder instance for one encoder (2 channels) +- all major static and dynamic memory areas are located +- in module sbr_ram and sbr rom +-*/ +-C_ALLOC_MEM(Ram_SbrEncoder, SBR_ENCODER, 1) +-C_ALLOC_MEM2(Ram_SbrChannel, SBR_CHANNEL, 1, (8)) +-C_ALLOC_MEM2(Ram_SbrElement, SBR_ELEMENT, 1, (8)) +- +-/*! Filter states for QMF-analysis.
+- Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH +-*/ +-C_AALLOC_MEM2_L(Ram_Sbr_QmfStatesAnalysis, FIXP_QAS, 640, (8), SECT_DATA_L1) +- +-/*! Matrix holding the quota values for all estimates, all channels +- Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES +-*/ +-C_ALLOC_MEM2_L(Ram_Sbr_quotaMatrix, FIXP_DBL, (MAX_NO_OF_ESTIMATES * 64), (8), +- SECT_DATA_L1) +- +-/*! Matrix holding the sign values for all estimates, all channels +- Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES +-*/ +-C_ALLOC_MEM2(Ram_Sbr_signMatrix, INT, (MAX_NO_OF_ESTIMATES * 64), (8)) +- +-/*! Frequency band table (low res)
+- Dimension #MAX_FREQ_COEFFS/2+1 +-*/ +-C_ALLOC_MEM2(Ram_Sbr_freqBandTableLO, UCHAR, (MAX_FREQ_COEFFS / 2 + 1), (8)) +- +-/*! Frequency band table (high res)
+- Dimension #MAX_FREQ_COEFFS +1 +-*/ +-C_ALLOC_MEM2(Ram_Sbr_freqBandTableHI, UCHAR, (MAX_FREQ_COEFFS + 1), (8)) +- +-/*! vk matser table
+- Dimension #MAX_FREQ_COEFFS +1 +-*/ +-C_ALLOC_MEM2(Ram_Sbr_v_k_master, UCHAR, (MAX_FREQ_COEFFS + 1), (8)) +- +-/* +- Missing harmonics detection +-*/ +- +-/*! sbr_detectionVectors
+- Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] +-*/ +-C_ALLOC_MEM2(Ram_Sbr_detectionVectors, UCHAR, +- (MAX_NO_OF_ESTIMATES * MAX_FREQ_COEFFS), (8)) +- +-/*! sbr_prevCompVec[
+- Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] +-*/ +-C_ALLOC_MEM2(Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (8)) +-/*! sbr_guideScfb[
+- Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] +-*/ +-C_ALLOC_MEM2(Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (8)) +- +-/*! sbr_guideVectorDetected
+- Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] +-*/ +-C_ALLOC_MEM2(Ram_Sbr_guideVectorDetected, UCHAR, +- (MAX_NO_OF_ESTIMATES * MAX_FREQ_COEFFS), (8)) +-C_ALLOC_MEM2(Ram_Sbr_guideVectorDiff, FIXP_DBL, +- (MAX_NO_OF_ESTIMATES * MAX_FREQ_COEFFS), (8)) +-C_ALLOC_MEM2(Ram_Sbr_guideVectorOrig, FIXP_DBL, +- (MAX_NO_OF_ESTIMATES * MAX_FREQ_COEFFS), (8)) +- +-/* +- Static Parametric Stereo memory +-*/ +-C_AALLOC_MEM_L(Ram_PsQmfStatesSynthesis, FIXP_DBL, 640 / 2, SECT_DATA_L1) +- +-C_ALLOC_MEM_L(Ram_PsEncode, PS_ENCODE, 1, SECT_DATA_L1) +-C_ALLOC_MEM(Ram_ParamStereo, PARAMETRIC_STEREO, 1) +- +-/* @} */ +- +-/*! +- \name DynamicSbrData +- +- Dynamic memory areas, might be reused in other algorithm sections, +- e.g. the core encoder. +-*/ +-/* @{ */ +- +-/*! Energy buffer for envelope extraction
+- Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS * #SBR_QMF_CHANNELS +-*/ +-C_ALLOC_MEM2(Ram_Sbr_envYBuffer, FIXP_DBL, (32 / 2 * 64), (8)) +- +-FIXP_DBL* GetRam_Sbr_envYBuffer(int n, UCHAR* dynamic_RAM) { +- FDK_ASSERT(dynamic_RAM != 0); +- /* The reinterpret_cast is used to suppress a compiler warning. We know that +- * (dynamic_RAM + OFFSET_NRG + (n*Y_2_BUF_BYTE)) is sufficiently aligned, so +- * the cast is safe */ +- return reinterpret_cast( +- reinterpret_cast(dynamic_RAM + OFFSET_NRG + (n * Y_2_BUF_BYTE))); +-} +- +-/* +- * QMF data +- */ +-/* The SBR encoder uses a single channel overlapping buffer set (always n=0), +- * but PS does not. */ +-FIXP_DBL* GetRam_Sbr_envRBuffer(int n, UCHAR* dynamic_RAM) { +- FDK_ASSERT(dynamic_RAM != 0); +- /* The reinterpret_cast is used to suppress a compiler warning. We know that +- * (dynamic_RAM + OFFSET_QMF + (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE))) is +- * sufficiently aligned, so the cast is safe */ +- return reinterpret_cast(reinterpret_cast( +- dynamic_RAM + OFFSET_QMF + (n * (ENV_R_BUFF_BYTE + ENV_I_BUFF_BYTE)))); +-} +-FIXP_DBL* GetRam_Sbr_envIBuffer(int n, UCHAR* dynamic_RAM) { +- FDK_ASSERT(dynamic_RAM != 0); +- /* The reinterpret_cast is used to suppress a compiler warning. We know that +- * (dynamic_RAM + OFFSET_QMF + (ENV_R_BUFF_BYTE) + +- * (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE))) is sufficiently aligned, so the cast +- * is safe */ +- return reinterpret_cast( +- reinterpret_cast(dynamic_RAM + OFFSET_QMF + (ENV_R_BUFF_BYTE) + +- (n * (ENV_R_BUFF_BYTE + ENV_I_BUFF_BYTE)))); +-} +- +-/* @} */ +diff --git a/libSBRenc/src/sbrenc_ram.h b/libSBRenc/src/sbrenc_ram.h +deleted file mode 100644 +index cf23378..0000000 +--- a/libSBRenc/src/sbrenc_ram.h ++++ /dev/null +@@ -1,199 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +-\file +-\brief Memory layout +-$Revision: 92790 $ +-*/ +-#ifndef SBRENC_RAM_H +-#define SBRENC_RAM_H +- +-#include "sbr_def.h" +-#include "env_est.h" +-#include "sbr_encoder.h" +-#include "sbr.h" +- +-#include "ps_main.h" +-#include "ps_encode.h" +- +-#define ENV_TRANSIENTS_BYTE ((sizeof(FIXP_DBL) * (MAX_NUM_CHANNELS * 3 * 32))) +- +-#define ENV_R_BUFF_BYTE ((sizeof(FIXP_DBL) * ((32) * MAX_HYBRID_BANDS))) +-#define ENV_I_BUFF_BYTE ((sizeof(FIXP_DBL) * ((32) * MAX_HYBRID_BANDS))) +-#define Y_BUF_CH_BYTE \ +- ((2 * sizeof(FIXP_DBL) * (((32) - (32 / 2)) * MAX_HYBRID_BANDS))) +- +-#define ENV_R_BUF_PS_BYTE ((sizeof(FIXP_DBL) * 32 * 64 / 2)) +-#define ENV_I_BUF_PS_BYTE ((sizeof(FIXP_DBL) * 32 * 64 / 2)) +- +-#define TON_BUF_CH_BYTE \ +- ((sizeof(FIXP_DBL) * (MAX_NO_OF_ESTIMATES * MAX_FREQ_COEFFS))) +- +-#define Y_2_BUF_BYTE (Y_BUF_CH_BYTE) +- +-/* Workbuffer RAM - Allocation */ +-/* +- ++++++++++++++++++++++++++++++++++++++++++++++++++++ +- | OFFSET_QMF | OFFSET_NRG | +- ++++++++++++++++++++++++++++++++++++++++++++++++++++ +- ------------------------- ------------------------- +- | | 0.5 * | +- | sbr_envRBuffer | sbr_envYBuffer_size | +- | sbr_envIBuffer | | +- ------------------------- ------------------------- +- +-*/ +-#define BUF_NRG_SIZE ((MAX_NUM_CHANNELS * Y_2_BUF_BYTE)) +-#define BUF_QMF_SIZE (ENV_R_BUFF_BYTE + ENV_I_BUFF_BYTE) +- +-/* Size of the shareable memory region than can be reused */ +-#define SBR_ENC_DYN_RAM_SIZE (BUF_QMF_SIZE + BUF_NRG_SIZE) +- +-#define OFFSET_QMF (0) +-#define OFFSET_NRG (OFFSET_QMF + BUF_QMF_SIZE) +- +-/* +- ***************************************************************************************************** +- */ +- +-H_ALLOC_MEM(Ram_SbrDynamic_RAM, FIXP_DBL) +- +-H_ALLOC_MEM(Ram_SbrEncoder, SBR_ENCODER) +-H_ALLOC_MEM(Ram_SbrChannel, SBR_CHANNEL) +-H_ALLOC_MEM(Ram_SbrElement, SBR_ELEMENT) +- +-H_ALLOC_MEM(Ram_Sbr_quotaMatrix, FIXP_DBL) +-H_ALLOC_MEM(Ram_Sbr_signMatrix, INT) +- +-H_ALLOC_MEM(Ram_Sbr_QmfStatesAnalysis, FIXP_QAS) +- +-H_ALLOC_MEM(Ram_Sbr_freqBandTableLO, UCHAR) +-H_ALLOC_MEM(Ram_Sbr_freqBandTableHI, UCHAR) +-H_ALLOC_MEM(Ram_Sbr_v_k_master, UCHAR) +- +-H_ALLOC_MEM(Ram_Sbr_detectionVectors, UCHAR) +-H_ALLOC_MEM(Ram_Sbr_prevEnvelopeCompensation, UCHAR) +-H_ALLOC_MEM(Ram_Sbr_guideScfb, UCHAR) +-H_ALLOC_MEM(Ram_Sbr_guideVectorDetected, UCHAR) +- +-/* Dynamic Memory Allocation */ +- +-H_ALLOC_MEM(Ram_Sbr_envYBuffer, FIXP_DBL) +-FIXP_DBL* GetRam_Sbr_envYBuffer(int n, UCHAR* dynamic_RAM); +-FIXP_DBL* GetRam_Sbr_envRBuffer(int n, UCHAR* dynamic_RAM); +-FIXP_DBL* GetRam_Sbr_envIBuffer(int n, UCHAR* dynamic_RAM); +- +-H_ALLOC_MEM(Ram_Sbr_guideVectorDiff, FIXP_DBL) +-H_ALLOC_MEM(Ram_Sbr_guideVectorOrig, FIXP_DBL) +- +-H_ALLOC_MEM(Ram_PsQmfStatesSynthesis, FIXP_DBL) +- +-H_ALLOC_MEM(Ram_PsEncode, PS_ENCODE) +- +-FIXP_DBL* FDKsbrEnc_SliceRam_PsRqmf(FIXP_DBL* rQmfData, UCHAR* dynamic_RAM, +- int n, int i, int qmfSlots); +-FIXP_DBL* FDKsbrEnc_SliceRam_PsIqmf(FIXP_DBL* iQmfData, UCHAR* dynamic_RAM, +- int n, int i, int qmfSlots); +- +-H_ALLOC_MEM(Ram_ParamStereo, PARAMETRIC_STEREO) +-#endif +diff --git a/libSBRenc/src/sbrenc_rom.cpp b/libSBRenc/src/sbrenc_rom.cpp +deleted file mode 100644 +index 737afaf..0000000 +--- a/libSBRenc/src/sbrenc_rom.cpp ++++ /dev/null +@@ -1,910 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): Tobias Chalupka +- +- Description: Definition of constant tables +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Definition of constant tables +- $Revision: 95404 $ +- +- This module contains most of the constant data that can be stored in ROM. +-*/ +- +-#include "sbrenc_rom.h" +-#include "genericStds.h" +- +-//@{ +-/******************************************************************************* +- +- Table Overview: +- +- o envelope level, 1.5 dB: +- 1a) v_Huff_envelopeLevelC10T[121] +- 1b) v_Huff_envelopeLevelL10T[121] +- 2a) v_Huff_envelopeLevelC10F[121] +- 2b) v_Huff_envelopeLevelL10F[121] +- +- o envelope balance, 1.5 dB: +- 3a) bookSbrEnvBalanceC10T[49] +- 3b) bookSbrEnvBalanceL10T[49] +- 4a) bookSbrEnvBalanceC10F[49] +- 4b) bookSbrEnvBalanceL10F[49] +- +- o envelope level, 3.0 dB: +- 5a) v_Huff_envelopeLevelC11T[63] +- 5b) v_Huff_envelopeLevelL11T[63] +- 6a) v_Huff_envelopeLevelC11F[63] +- 6b) v_Huff_envelopeLevelC11F[63] +- +- o envelope balance, 3.0 dB: +- 7a) bookSbrEnvBalanceC11T[25] +- 7b) bookSbrEnvBalanceL11T[25] +- 8a) bookSbrEnvBalanceC11F[25] +- 8b) bookSbrEnvBalanceL11F[25] +- +- o noise level, 3.0 dB: +- 9a) v_Huff_NoiseLevelC11T[63] +- 9b) v_Huff_NoiseLevelL11T[63] +- - ) (v_Huff_envelopeLevelC11F[63] is used for freq dir) +- - ) (v_Huff_envelopeLevelL11F[63] is used for freq dir) +- +- o noise balance, 3.0 dB: +- 10a) bookSbrNoiseBalanceC11T[25] +- 10b) bookSbrNoiseBalanceL11T[25] +- - ) (bookSbrEnvBalanceC11F[25] is used for freq dir) +- - ) (bookSbrEnvBalanceL11F[25] is used for freq dir) +- +- +- (1.5 dB is never used for noise) +- +-********************************************************************************/ +- +-/*******************************************************************************/ +-/* table : envelope level, 1.5 dB */ +-/* theor range : [-58,58], CODE_BOOK_SCF_LAV = 58 */ +-/* implem range: [-60,60], CODE_BOOK_SCF_LAV10 = 60 */ +-/* raw stats : envelopeLevel_00 (yes, wrong suffix in name) KK 01-03-09 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode3C2FIX.m/envelopeLevel_00T_cF.mat/v_nChex_cF +- built by : FH 01-07-05 */ +- +-const INT v_Huff_envelopeLevelC10T[121] = { +- 0x0003FFD6, 0x0003FFD7, 0x0003FFD8, 0x0003FFD9, 0x0003FFDA, 0x0003FFDB, +- 0x0007FFB8, 0x0007FFB9, 0x0007FFBA, 0x0007FFBB, 0x0007FFBC, 0x0007FFBD, +- 0x0007FFBE, 0x0007FFBF, 0x0007FFC0, 0x0007FFC1, 0x0007FFC2, 0x0007FFC3, +- 0x0007FFC4, 0x0007FFC5, 0x0007FFC6, 0x0007FFC7, 0x0007FFC8, 0x0007FFC9, +- 0x0007FFCA, 0x0007FFCB, 0x0007FFCC, 0x0007FFCD, 0x0007FFCE, 0x0007FFCF, +- 0x0007FFD0, 0x0007FFD1, 0x0007FFD2, 0x0007FFD3, 0x0001FFE6, 0x0003FFD4, +- 0x0000FFF0, 0x0001FFE9, 0x0003FFD5, 0x0001FFE7, 0x0000FFF1, 0x0000FFEC, +- 0x0000FFED, 0x0000FFEE, 0x00007FF4, 0x00003FF9, 0x00003FF7, 0x00001FFA, +- 0x00001FF9, 0x00000FFB, 0x000007FC, 0x000003FC, 0x000001FD, 0x000000FD, +- 0x0000007D, 0x0000003D, 0x0000001D, 0x0000000D, 0x00000005, 0x00000001, +- 0x00000000, 0x00000004, 0x0000000C, 0x0000001C, 0x0000003C, 0x0000007C, +- 0x000000FC, 0x000001FC, 0x000003FD, 0x00000FFA, 0x00001FF8, 0x00003FF6, +- 0x00003FF8, 0x00007FF5, 0x0000FFEF, 0x0001FFE8, 0x0000FFF2, 0x0007FFD4, +- 0x0007FFD5, 0x0007FFD6, 0x0007FFD7, 0x0007FFD8, 0x0007FFD9, 0x0007FFDA, +- 0x0007FFDB, 0x0007FFDC, 0x0007FFDD, 0x0007FFDE, 0x0007FFDF, 0x0007FFE0, +- 0x0007FFE1, 0x0007FFE2, 0x0007FFE3, 0x0007FFE4, 0x0007FFE5, 0x0007FFE6, +- 0x0007FFE7, 0x0007FFE8, 0x0007FFE9, 0x0007FFEA, 0x0007FFEB, 0x0007FFEC, +- 0x0007FFED, 0x0007FFEE, 0x0007FFEF, 0x0007FFF0, 0x0007FFF1, 0x0007FFF2, +- 0x0007FFF3, 0x0007FFF4, 0x0007FFF5, 0x0007FFF6, 0x0007FFF7, 0x0007FFF8, +- 0x0007FFF9, 0x0007FFFA, 0x0007FFFB, 0x0007FFFC, 0x0007FFFD, 0x0007FFFE, +- 0x0007FFFF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode3C2FIX.m/envelopeLevel_00T_cF.mat/v_nLhex_cF +- built by : FH 01-07-05 */ +- +-const UCHAR v_Huff_envelopeLevelL10T[121] = { +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x11, 0x12, 0x10, 0x11, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, +- 0x0F, 0x0E, 0x0E, 0x0D, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, +- 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +- 0x08, 0x09, 0x0A, 0x0C, 0x0D, 0x0E, 0x0E, 0x0F, 0x10, 0x11, 0x10, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13}; +- +-/* direction: freq +- contents : codewords +- raw table: HuffCode3C2FIX.m/envelopeLevel_00F_cF.mat/v_nChex_cF +- built by : FH 01-07-05 */ +- +-const INT v_Huff_envelopeLevelC10F[121] = { +- 0x0007FFE7, 0x0007FFE8, 0x000FFFD2, 0x000FFFD3, 0x000FFFD4, 0x000FFFD5, +- 0x000FFFD6, 0x000FFFD7, 0x000FFFD8, 0x0007FFDA, 0x000FFFD9, 0x000FFFDA, +- 0x000FFFDB, 0x000FFFDC, 0x0007FFDB, 0x000FFFDD, 0x0007FFDC, 0x0007FFDD, +- 0x000FFFDE, 0x0003FFE4, 0x000FFFDF, 0x000FFFE0, 0x000FFFE1, 0x0007FFDE, +- 0x000FFFE2, 0x000FFFE3, 0x000FFFE4, 0x0007FFDF, 0x000FFFE5, 0x0007FFE0, +- 0x0003FFE8, 0x0007FFE1, 0x0003FFE0, 0x0003FFE9, 0x0001FFEF, 0x0003FFE5, +- 0x0001FFEC, 0x0001FFED, 0x0001FFEE, 0x0000FFF4, 0x0000FFF3, 0x0000FFF0, +- 0x00007FF7, 0x00007FF6, 0x00003FFA, 0x00001FFA, 0x00001FF9, 0x00000FFA, +- 0x00000FF8, 0x000007F9, 0x000003FB, 0x000001FC, 0x000001FA, 0x000000FB, +- 0x0000007C, 0x0000003C, 0x0000001C, 0x0000000C, 0x00000005, 0x00000001, +- 0x00000000, 0x00000004, 0x0000000D, 0x0000001D, 0x0000003D, 0x000000FA, +- 0x000000FC, 0x000001FB, 0x000003FA, 0x000007F8, 0x000007FA, 0x000007FB, +- 0x00000FF9, 0x00000FFB, 0x00001FF8, 0x00001FFB, 0x00003FF8, 0x00003FF9, +- 0x0000FFF1, 0x0000FFF2, 0x0001FFEA, 0x0001FFEB, 0x0003FFE1, 0x0003FFE2, +- 0x0003FFEA, 0x0003FFE3, 0x0003FFE6, 0x0003FFE7, 0x0003FFEB, 0x000FFFE6, +- 0x0007FFE2, 0x000FFFE7, 0x000FFFE8, 0x000FFFE9, 0x000FFFEA, 0x000FFFEB, +- 0x000FFFEC, 0x0007FFE3, 0x000FFFED, 0x000FFFEE, 0x000FFFEF, 0x000FFFF0, +- 0x0007FFE4, 0x000FFFF1, 0x0003FFEC, 0x000FFFF2, 0x000FFFF3, 0x0007FFE5, +- 0x0007FFE6, 0x000FFFF4, 0x000FFFF5, 0x000FFFF6, 0x000FFFF7, 0x000FFFF8, +- 0x000FFFF9, 0x000FFFFA, 0x000FFFFB, 0x000FFFFC, 0x000FFFFD, 0x000FFFFE, +- 0x000FFFFF}; +- +-/* direction: freq +- contents : codeword lengths +- raw table: HuffCode3C2FIX.m/envelopeLevel_00F_cF.mat/v_nLhex_cF +- built by : FH 01-07-05 */ +- +-const UCHAR v_Huff_envelopeLevelL10F[121] = { +- 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x14, +- 0x14, 0x14, 0x14, 0x13, 0x14, 0x13, 0x13, 0x14, 0x12, 0x14, 0x14, +- 0x14, 0x13, 0x14, 0x14, 0x14, 0x13, 0x14, 0x13, 0x12, 0x13, 0x12, +- 0x12, 0x11, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x0F, 0x0F, +- 0x0E, 0x0D, 0x0D, 0x0C, 0x0C, 0x0B, 0x0A, 0x09, 0x09, 0x08, 0x07, +- 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, +- 0x08, 0x09, 0x0A, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0D, 0x0D, 0x0E, +- 0x0E, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x14, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x14, +- 0x14, 0x14, 0x14, 0x13, 0x14, 0x12, 0x14, 0x14, 0x13, 0x13, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; +- +-/*******************************************************************************/ +-/* table : envelope balance, 1.5 dB */ +-/* theor range : [-48,48], CODE_BOOK_SCF_LAV = 48 */ +-/* implem range: same but mapped to [-24,24], CODE_BOOK_SCF_LAV_BALANCE10 = 24 +- */ +-/* raw stats : envelopePan_00 (yes, wrong suffix in name) KK 01-03-09 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode3C.m/envelopePan_00T.mat/v_nBhex +- built by : FH 01-05-15 */ +- +-const INT bookSbrEnvBalanceC10T[49] = { +- 0x0000FFE4, 0x0000FFE5, 0x0000FFE6, 0x0000FFE7, 0x0000FFE8, 0x0000FFE9, +- 0x0000FFEA, 0x0000FFEB, 0x0000FFEC, 0x0000FFED, 0x0000FFEE, 0x0000FFEF, +- 0x0000FFF0, 0x0000FFF1, 0x0000FFF2, 0x0000FFF3, 0x0000FFF4, 0x0000FFE2, +- 0x00000FFC, 0x000007FC, 0x000001FE, 0x0000007E, 0x0000001E, 0x00000006, +- 0x00000000, 0x00000002, 0x0000000E, 0x0000003E, 0x000000FE, 0x000007FD, +- 0x00000FFD, 0x00007FF0, 0x0000FFE3, 0x0000FFF5, 0x0000FFF6, 0x0000FFF7, +- 0x0000FFF8, 0x0000FFF9, 0x0000FFFA, 0x0001FFF6, 0x0001FFF7, 0x0001FFF8, +- 0x0001FFF9, 0x0001FFFA, 0x0001FFFB, 0x0001FFFC, 0x0001FFFD, 0x0001FFFE, +- 0x0001FFFF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode3C.m/envelopePan_00T.mat/v_nLhex +- built by : FH 01-05-15 */ +- +-const UCHAR bookSbrEnvBalanceL10T[49] = { +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x0B, +- 0x09, 0x07, 0x05, 0x03, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0B, +- 0x0C, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; +- +-/* direction: freq +- contents : codewords +- raw table: HuffCode3C.m/envelopePan_00F.mat/v_nBhex +- built by : FH 01-05-15 */ +- +-const INT bookSbrEnvBalanceC10F[49] = { +- 0x0003FFE2, 0x0003FFE3, 0x0003FFE4, 0x0003FFE5, 0x0003FFE6, 0x0003FFE7, +- 0x0003FFE8, 0x0003FFE9, 0x0003FFEA, 0x0003FFEB, 0x0003FFEC, 0x0003FFED, +- 0x0003FFEE, 0x0003FFEF, 0x0003FFF0, 0x0000FFF7, 0x0001FFF0, 0x00003FFC, +- 0x000007FE, 0x000007FC, 0x000000FE, 0x0000007E, 0x0000000E, 0x00000002, +- 0x00000000, 0x00000006, 0x0000001E, 0x0000003E, 0x000001FE, 0x000007FD, +- 0x00000FFE, 0x00007FFA, 0x0000FFF6, 0x0003FFF1, 0x0003FFF2, 0x0003FFF3, +- 0x0003FFF4, 0x0003FFF5, 0x0003FFF6, 0x0003FFF7, 0x0003FFF8, 0x0003FFF9, +- 0x0003FFFA, 0x0003FFFB, 0x0003FFFC, 0x0003FFFD, 0x0003FFFE, 0x0007FFFE, +- 0x0007FFFF}; +- +-/* direction: freq +- contents : codeword lengths +- raw table: HuffCode3C.m/envelopePan_00F.mat/v_nLhex +- built by : FH 01-05-15 */ +- +-const UCHAR bookSbrEnvBalanceL10F[49] = { +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x11, 0x0E, 0x0B, 0x0B, +- 0x08, 0x07, 0x04, 0x02, 0x01, 0x03, 0x05, 0x06, 0x09, 0x0B, +- 0x0C, 0x0F, 0x10, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13}; +- +-/*******************************************************************************/ +-/* table : envelope level, 3.0 dB */ +-/* theor range : [-29,29], CODE_BOOK_SCF_LAV = 29 */ +-/* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31 */ +-/* raw stats : envelopeLevel_11 KK 00-02-03 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const INT v_Huff_envelopeLevelC11T[63] = { +- 0x0003FFED, 0x0003FFEE, 0x0007FFDE, 0x0007FFDF, 0x0007FFE0, 0x0007FFE1, +- 0x0007FFE2, 0x0007FFE3, 0x0007FFE4, 0x0007FFE5, 0x0007FFE6, 0x0007FFE7, +- 0x0007FFE8, 0x0007FFE9, 0x0007FFEA, 0x0007FFEB, 0x0007FFEC, 0x0001FFF4, +- 0x0000FFF7, 0x0000FFF9, 0x0000FFF8, 0x00003FFB, 0x00003FFA, 0x00003FF8, +- 0x00001FFA, 0x00000FFC, 0x000007FC, 0x000000FE, 0x0000003E, 0x0000000E, +- 0x00000002, 0x00000000, 0x00000006, 0x0000001E, 0x0000007E, 0x000001FE, +- 0x000007FD, 0x00001FFB, 0x00003FF9, 0x00003FFC, 0x00007FFA, 0x0000FFF6, +- 0x0001FFF5, 0x0003FFEC, 0x0007FFED, 0x0007FFEE, 0x0007FFEF, 0x0007FFF0, +- 0x0007FFF1, 0x0007FFF2, 0x0007FFF3, 0x0007FFF4, 0x0007FFF5, 0x0007FFF6, +- 0x0007FFF7, 0x0007FFF8, 0x0007FFF9, 0x0007FFFA, 0x0007FFFB, 0x0007FFFC, +- 0x0007FFFD, 0x0007FFFE, 0x0007FFFF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const UCHAR v_Huff_envelopeLevelL11T[63] = { +- 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x11, 0x10, 0x10, 0x10, 0x0E, +- 0x0E, 0x0E, 0x0D, 0x0C, 0x0B, 0x08, 0x06, 0x04, 0x02, 0x01, 0x03, +- 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0E, 0x0E, 0x0F, 0x10, 0x11, 0x12, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13}; +- +-/* direction: freq +- contents : codewords +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const INT v_Huff_envelopeLevelC11F[63] = { +- 0x000FFFF0, 0x000FFFF1, 0x000FFFF2, 0x000FFFF3, 0x000FFFF4, 0x000FFFF5, +- 0x000FFFF6, 0x0003FFF3, 0x0007FFF5, 0x0007FFEE, 0x0007FFEF, 0x0007FFF6, +- 0x0003FFF4, 0x0003FFF2, 0x000FFFF7, 0x0007FFF0, 0x0001FFF5, 0x0003FFF0, +- 0x0001FFF4, 0x0000FFF7, 0x0000FFF6, 0x00007FF8, 0x00003FFB, 0x00000FFD, +- 0x000007FD, 0x000003FD, 0x000001FD, 0x000000FD, 0x0000003E, 0x0000000E, +- 0x00000002, 0x00000000, 0x00000006, 0x0000001E, 0x000000FC, 0x000001FC, +- 0x000003FC, 0x000007FC, 0x00000FFC, 0x00001FFC, 0x00003FFA, 0x00007FF9, +- 0x00007FFA, 0x0000FFF8, 0x0000FFF9, 0x0001FFF6, 0x0001FFF7, 0x0003FFF5, +- 0x0003FFF6, 0x0003FFF1, 0x000FFFF8, 0x0007FFF1, 0x0007FFF2, 0x0007FFF3, +- 0x000FFFF9, 0x0007FFF7, 0x0007FFF4, 0x000FFFFA, 0x000FFFFB, 0x000FFFFC, +- 0x000FFFFD, 0x000FFFFE, 0x000FFFFF}; +- +-/* direction: freq +- contents : codeword lengths +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const UCHAR v_Huff_envelopeLevelL11F[63] = { +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x12, 0x13, 0x13, 0x13, +- 0x13, 0x12, 0x12, 0x14, 0x13, 0x11, 0x12, 0x11, 0x10, 0x10, 0x0F, +- 0x0E, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01, 0x03, +- 0x05, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x0F, 0x10, +- 0x10, 0x11, 0x11, 0x12, 0x12, 0x12, 0x14, 0x13, 0x13, 0x13, 0x14, +- 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; +- +-/*******************************************************************************/ +-/* table : envelope balance, 3.0 dB */ +-/* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24 */ +-/* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 +- */ +-/* raw stats : envelopeBalance_11 KK 00-02-03 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_nBhex +- built by : FH 01-05-15 */ +- +-const INT bookSbrEnvBalanceC11T[25] = { +- 0x00001FF2, 0x00001FF3, 0x00001FF4, 0x00001FF5, 0x00001FF6, +- 0x00001FF7, 0x00001FF8, 0x00000FF8, 0x000000FE, 0x0000007E, +- 0x0000000E, 0x00000006, 0x00000000, 0x00000002, 0x0000001E, +- 0x0000003E, 0x000001FE, 0x00001FF9, 0x00001FFA, 0x00001FFB, +- 0x00001FFC, 0x00001FFD, 0x00001FFE, 0x00003FFE, 0x00003FFF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_nLhex +- built by : FH 01-05-15 */ +- +-const UCHAR bookSbrEnvBalanceL11T[25] = { +- 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x08, +- 0x07, 0x04, 0x03, 0x01, 0x02, 0x05, 0x06, 0x09, 0x0D, +- 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E}; +- +-/* direction: freq +- contents : codewords +- raw table: HuffCode3C.m/envelopeBalance_11F.mat/v_nBhex +- built by : FH 01-05-15 */ +- +-const INT bookSbrEnvBalanceC11F[25] = { +- 0x00001FF7, 0x00001FF8, 0x00001FF9, 0x00001FFA, 0x00001FFB, +- 0x00003FF8, 0x00003FF9, 0x000007FC, 0x000000FE, 0x0000007E, +- 0x0000000E, 0x00000002, 0x00000000, 0x00000006, 0x0000001E, +- 0x0000003E, 0x000001FE, 0x00000FFA, 0x00001FF6, 0x00003FFA, +- 0x00003FFB, 0x00003FFC, 0x00003FFD, 0x00003FFE, 0x00003FFF}; +- +-/* direction: freq +- contents : codeword lengths +- raw table: HuffCode3C.m/envelopeBalance_11F.mat/v_nLhex +- built by : FH 01-05-15 */ +- +-const UCHAR bookSbrEnvBalanceL11F[25] = { +- 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0B, 0x08, +- 0x07, 0x04, 0x02, 0x01, 0x03, 0x05, 0x06, 0x09, 0x0C, +- 0x0D, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E}; +- +-/*******************************************************************************/ +-/* table : noise level, 3.0 dB */ +-/* theor range : [-29,29], CODE_BOOK_SCF_LAV = 29 */ +-/* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31 */ +-/* raw stats : noiseLevel_11 KK 00-02-03 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const INT v_Huff_NoiseLevelC11T[63] = { +- 0x00001FCE, 0x00001FCF, 0x00001FD0, 0x00001FD1, 0x00001FD2, 0x00001FD3, +- 0x00001FD4, 0x00001FD5, 0x00001FD6, 0x00001FD7, 0x00001FD8, 0x00001FD9, +- 0x00001FDA, 0x00001FDB, 0x00001FDC, 0x00001FDD, 0x00001FDE, 0x00001FDF, +- 0x00001FE0, 0x00001FE1, 0x00001FE2, 0x00001FE3, 0x00001FE4, 0x00001FE5, +- 0x00001FE6, 0x00001FE7, 0x000007F2, 0x000000FD, 0x0000003E, 0x0000000E, +- 0x00000006, 0x00000000, 0x00000002, 0x0000001E, 0x000000FC, 0x000003F8, +- 0x00001FCC, 0x00001FE8, 0x00001FE9, 0x00001FEA, 0x00001FEB, 0x00001FEC, +- 0x00001FCD, 0x00001FED, 0x00001FEE, 0x00001FEF, 0x00001FF0, 0x00001FF1, +- 0x00001FF2, 0x00001FF3, 0x00001FF4, 0x00001FF5, 0x00001FF6, 0x00001FF7, +- 0x00001FF8, 0x00001FF9, 0x00001FFA, 0x00001FFB, 0x00001FFC, 0x00001FFD, +- 0x00001FFE, 0x00003FFE, 0x00003FFF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode2.m +- built by : FH 00-02-04 */ +- +-const UCHAR v_Huff_NoiseLevelL11T[63] = { +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000B, 0x00000008, 0x00000006, 0x00000004, +- 0x00000003, 0x00000001, 0x00000002, 0x00000005, 0x00000008, 0x0000000A, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, +- 0x0000000D, 0x0000000E, 0x0000000E}; +- +-/*******************************************************************************/ +-/* table : noise balance, 3.0 dB */ +-/* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24 */ +-/* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 +- */ +-/* raw stats : noiseBalance_11 KK 00-02-03 */ +-/*******************************************************************************/ +- +-/* direction: time +- contents : codewords +- raw table: HuffCode3C.m/noiseBalance_11.mat/v_nBhex +- built by : FH 01-05-15 */ +- +-const INT bookSbrNoiseBalanceC11T[25] = { +- 0x000000EC, 0x000000ED, 0x000000EE, 0x000000EF, 0x000000F0, +- 0x000000F1, 0x000000F2, 0x000000F3, 0x000000F4, 0x000000F5, +- 0x0000001C, 0x00000002, 0x00000000, 0x00000006, 0x0000003A, +- 0x000000F6, 0x000000F7, 0x000000F8, 0x000000F9, 0x000000FA, +- 0x000000FB, 0x000000FC, 0x000000FD, 0x000000FE, 0x000000FF}; +- +-/* direction: time +- contents : codeword lengths +- raw table: HuffCode3C.m/noiseBalance_11.mat/v_nLhex +- built by : FH 01-05-15 */ +- +-const UCHAR bookSbrNoiseBalanceL11T[25] = { +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x05, 0x02, 0x01, 0x03, 0x06, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}; +- +-/* +- tuningTable +-*/ +-const sbrTuningTable_t sbrTuningTable[] = { +- /* Some of the low bitrates are commented out here, this is because the +- encoder could lose frames at those bitrates and throw an error +- because it has insufficient bits to encode for some test items. +- */ +- +- /*** HE-AAC section ***/ +- /* sf,sfsp,sf,sfsp,nnb,nfo,saml,SM,FS*/ +- +- /*** mono ***/ +- +- /* 8/16 kHz dual rate */ +- {CODEC_AAC, 8000, 10000, 8000, 1, 7, 6, 11, 10, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 10000, 12000, 8000, 1, 11, 7, 13, 12, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 12000, 16001, 8000, 1, 14, 10, 13, 13, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 24000, 8000, 1, 14, 10, 14, 14, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 24000, 32000, 8000, 1, 14, 10, 14, 14, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 32000, 48001, 8000, 1, 14, 11, 15, 15, 2, 0, 3, SBR_MONO, 2}, +- +- /* 11/22 kHz dual rate */ +- {CODEC_AAC, 8000, 10000, 11025, 1, 5, 4, 6, 6, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 10000, 12000, 11025, 1, 8, 5, 12, 9, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 12000, 16000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 20000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 20000, 24001, 11025, 1, 13, 9, 13, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 24000, 32000, 11025, 1, 14, 10, 14, 9, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 32000, 48000, 11025, 1, 15, 11, 15, 10, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 48000, 64001, 11025, 1, 15, 11, 15, 10, 2, 0, 3, SBR_MONO, 1}, +- +- /* 12/24 kHz dual rate */ +- {CODEC_AAC, 8000, 10000, 12000, 1, 4, 3, 6, 6, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 10000, 12000, 12000, 1, 7, 4, 11, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 12000, 16000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 20000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 20000, 24001, 12000, 1, 12, 8, 12, 8, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 24000, 32000, 12000, 1, 13, 9, 13, 9, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 32000, 48000, 12000, 1, 14, 10, 14, 10, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 48000, 64001, 12000, 1, 14, 11, 15, 11, 2, 0, 3, SBR_MONO, 1}, +- +- /* 16/32 kHz dual rate */ +- {CODEC_AAC, 8000, 10000, 16000, 1, 1, 1, 0, 0, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 10000, 12000, 16000, 1, 2, 1, 6, 0, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 12000, 16000, 16000, 1, 4, 2, 6, 0, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 18000, 16000, 1, 4, 2, 8, 3, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 18000, 22000, 16000, 1, 6, 5, 11, 7, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 22000, 28000, 16000, 1, 10, 9, 12, 8, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 28000, 36000, 16000, 1, 12, 12, 13, 13, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 36000, 44000, 16000, 1, 14, 14, 13, 13, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 44000, 64001, 16000, 1, 14, 14, 13, 13, 2, 0, 3, SBR_MONO, 1}, +- +- /* 22.05/44.1 kHz dual rate */ +- /* { CODEC_AAC, 8000, 11369, 22050, 1, 1, 1, 1, 1, 1, 0, 6, +- SBR_MONO, 3 }, */ +- {CODEC_AAC, 11369, 16000, 22050, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 18000, 22050, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 18000, 22000, 22050, 1, 4, 4, 8, 5, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 22000, 28000, 22050, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 28000, 36000, 22050, 1, 10, 10, 9, 9, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 36000, 44000, 22050, 1, 11, 11, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 44000, 64001, 22050, 1, 13, 13, 12, 12, 2, 0, 3, SBR_MONO, 1}, +- +- /* 24/48 kHz dual rate */ +- /* { CODEC_AAC, 8000, 12000, 24000, 1, 1, 1, 1, 1, 1, 0, 6, +- SBR_MONO, 3 }, */ +- {CODEC_AAC, 12000, 16000, 24000, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 16000, 18000, 24000, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AAC, 18000, 22000, 24000, 1, 4, 3, 8, 5, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 22000, 28000, 24000, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AAC, 28000, 36000, 24000, 1, 10, 10, 9, 9, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 36000, 44000, 24000, 1, 11, 11, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 44000, 64001, 24000, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- +- /* 32/64 kHz dual rate */ +- {CODEC_AAC, 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3}, +- {CODEC_AAC, 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 72000, 100000, 32000, 1, 11, 11, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 100000, 160001, 32000, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- +- /* 44.1/88.2 kHz dual rate */ +- {CODEC_AAC, 24000, 36000, 44100, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3}, +- {CODEC_AAC, 36000, 60000, 44100, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 60000, 72000, 44100, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 72000, 100000, 44100, 1, 11, 11, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 100000, 160001, 44100, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- +- /* 48/96 kHz dual rate */ +- {CODEC_AAC, 32000, 36000, 48000, 1, 4, 4, 9, 9, 2, 0, 3, SBR_MONO, 3}, +- {CODEC_AAC, 36000, 60000, 48000, 1, 7, 7, 10, 10, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AAC, 60000, 72000, 48000, 1, 9, 9, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 72000, 100000, 48000, 1, 11, 11, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AAC, 100000, 160001, 48000, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- +- /*** stereo ***/ +- /* 08/16 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 8000, 2, 6, 6, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, 3}, +- {CODEC_AAC, 24000, 28000, 8000, 2, 9, 9, 11, 9, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 36000, 8000, 2, 11, 9, 11, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 8000, 2, 13, 11, 13, 11, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 44000, 52000, 8000, 2, 14, 12, 13, 12, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 52000, 60000, 8000, 2, 14, 14, 13, 13, 3, 0, -3, SBR_SWITCH_LRC, +- 1}, +- {CODEC_AAC, 60000, 76000, 8000, 2, 14, 14, 13, 13, 3, 0, -3, SBR_LEFT_RIGHT, +- 1}, +- {CODEC_AAC, 76000, 128001, 8000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 11/22 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 11025, 2, 7, 5, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 24000, 28000, 11025, 2, 10, 8, 10, 8, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 36000, 11025, 2, 12, 8, 12, 8, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 11025, 2, 13, 9, 13, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 44000, 52000, 11025, 2, 14, 11, 13, 11, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AAC, 52000, 60000, 11025, 2, 15, 15, 13, 13, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AAC, 60000, 76000, 11025, 2, 15, 15, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 76000, 128001, 11025, 2, 15, 15, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 12/24 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 12000, 2, 6, 4, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 24000, 28000, 12000, 2, 9, 7, 10, 8, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 36000, 12000, 2, 11, 7, 12, 8, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 12000, 2, 12, 9, 12, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 44000, 52000, 12000, 2, 13, 12, 13, 12, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AAC, 52000, 60000, 12000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AAC, 60000, 76000, 12000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 76000, 128001, 12000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 16/32 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 16000, 2, 4, 2, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 24000, 28000, 16000, 2, 8, 7, 10, 8, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 36000, 16000, 2, 10, 9, 12, 11, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 16000, 2, 13, 13, 13, 13, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AAC, 44000, 52000, 16000, 2, 14, 14, 13, 13, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AAC, 52000, 60000, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AAC, 60000, 76000, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 76000, 128001, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 22.05/44.1 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 22050, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 24000, 28000, 22050, 2, 5, 4, 6, 5, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 32000, 22050, 2, 5, 4, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 32000, 36000, 22050, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 22050, 2, 10, 10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 44000, 52000, 22050, 2, 12, 12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 52000, 60000, 22050, 2, 13, 13, 10, 10, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AAC, 60000, 76000, 22050, 2, 14, 14, 12, 12, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 76000, 128001, 22050, 2, 14, 14, 12, 12, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 24/48 kHz dual rate */ +- {CODEC_AAC, 16000, 24000, 24000, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 24000, 28000, 24000, 2, 5, 5, 6, 6, 1, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 28000, 36000, 24000, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 36000, 44000, 24000, 2, 10, 10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 44000, 52000, 24000, 2, 12, 12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 52000, 60000, 24000, 2, 13, 13, 10, 10, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AAC, 60000, 76000, 24000, 2, 14, 14, 12, 12, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 76000, 128001, 24000, 2, 14, 14, 12, 12, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 32/64 kHz dual rate */ +- {CODEC_AAC, 32000, 60000, 32000, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 80000, 112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, +- 1}, +- {CODEC_AAC, 112000, 144000, 32000, 2, 11, 11, 10, 10, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 144000, 256001, 32000, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 44.1/88.2 kHz dual rate */ +- {CODEC_AAC, 32000, 60000, 44100, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 80000, 112000, 44100, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, +- 1}, +- {CODEC_AAC, 112000, 144000, 44100, 2, 11, 11, 10, 10, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 144000, 256001, 44100, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 48/96 kHz dual rate */ +- {CODEC_AAC, 36000, 60000, 48000, 2, 4, 4, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, +- 3}, +- {CODEC_AAC, 60000, 80000, 48000, 2, 7, 7, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AAC, 80000, 112000, 48000, 2, 9, 9, 10, 10, 3, 0, -3, SBR_LEFT_RIGHT, +- 1}, +- {CODEC_AAC, 112000, 144000, 48000, 2, 11, 11, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AAC, 144000, 256001, 48000, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /** AAC LOW DELAY SECTION **/ +- +- /* 24 kHz dual rate - 12kHz singlerate is not allowed (deactivated in +- FDKsbrEnc_IsSbrSettingAvail()) */ +- {CODEC_AACLD, 8000, 32000, 12000, 1, 1, 1, 0, 0, 1, 0, 6, SBR_MONO, 3}, +- +- /*** mono ***/ +- /* 16/32 kHz dual rate */ +- {CODEC_AACLD, 16000, 18000, 16000, 1, 4, 5, 9, 7, 1, 0, 6, SBR_MONO, 3}, +- {CODEC_AACLD, 18000, 22000, 16000, 1, 7, 7, 12, 12, 1, 6, 9, SBR_MONO, 3}, +- {CODEC_AACLD, 22000, 28000, 16000, 1, 6, 6, 9, 9, 2, 3, 6, SBR_MONO, 3}, +- {CODEC_AACLD, 28000, 36000, 16000, 1, 8, 8, 12, 7, 2, 9, 12, SBR_MONO, 3}, +- {CODEC_AACLD, 36000, 44000, 16000, 1, 10, 14, 12, 13, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 44000, 64001, 16000, 1, 11, 14, 13, 13, 2, 0, 3, SBR_MONO, 1}, +- +- /* 22.05/44.1 kHz dual rate */ +- {CODEC_AACLD, 18000, 22000, 22050, 1, 4, 4, 5, 5, 2, 0, 6, SBR_MONO, 3}, +- {CODEC_AACLD, 22000, 28000, 22050, 1, 5, 5, 6, 6, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AACLD, 28000, 36000, 22050, 1, 7, 8, 8, 8, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AACLD, 36000, 44000, 22050, 1, 9, 9, 9, 9, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 44000, 52000, 22050, 1, 12, 11, 11, 11, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 52000, 64001, 22050, 1, 13, 11, 11, 10, 2, 0, 3, SBR_MONO, 1}, +- +- /* 24/48 kHz dual rate */ +- {CODEC_AACLD, 20000, 22000, 24000, 1, 3, 4, 8, 8, 2, 0, 6, SBR_MONO, 2}, +- {CODEC_AACLD, 22000, 28000, 24000, 1, 3, 8, 8, 7, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AACLD, 28000, 36000, 24000, 1, 4, 8, 8, 7, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AACLD, 36000, 56000, 24000, 1, 8, 9, 9, 8, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 56000, 64001, 24000, 1, 13, 11, 11, 10, 2, 0, 3, SBR_MONO, 1}, +- +- /* 32/64 kHz dual rate */ +- {CODEC_AACLD, 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3}, +- {CODEC_AACLD, 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AACLD, 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 72000, 100000, 32000, 1, 11, 11, 10, 10, 2, 0, 3, SBR_MONO, +- 1}, +- {CODEC_AACLD, 100000, 160001, 32000, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, +- 1}, +- +- /* 44/88 kHz dual rate */ +- {CODEC_AACLD, 36000, 60000, 44100, 1, 8, 7, 6, 9, 2, 0, 3, SBR_MONO, 2}, +- {CODEC_AACLD, 60000, 72000, 44100, 1, 9, 9, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 72000, 100000, 44100, 1, 11, 11, 11, 11, 2, 0, 3, SBR_MONO, +- 1}, +- {CODEC_AACLD, 100000, 160001, 44100, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, +- 1}, +- +- /* 48/96 kHz dual rate */ /* 32 and 40kbps line tuned for dual-rate SBR +- */ +- {CODEC_AACLD, 36000, 60000, 48000, 1, 4, 7, 4, 4, 2, 0, 3, SBR_MONO, 3}, +- {CODEC_AACLD, 60000, 72000, 48000, 1, 9, 9, 10, 10, 2, 0, 3, SBR_MONO, 1}, +- {CODEC_AACLD, 72000, 100000, 48000, 1, 11, 11, 11, 11, 2, 0, 3, SBR_MONO, +- 1}, +- {CODEC_AACLD, 100000, 160001, 48000, 1, 13, 13, 11, 11, 2, 0, 3, SBR_MONO, +- 1}, +- +- /*** stereo ***/ +- /* 16/32 kHz dual rate */ +- {CODEC_AACLD, 32000, 36000, 16000, 2, 10, 9, 12, 11, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AACLD, 36000, 44000, 16000, 2, 13, 13, 13, 13, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AACLD, 44000, 52000, 16000, 2, 10, 9, 11, 9, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AACLD, 52000, 60000, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_SWITCH_LRC, 1}, +- {CODEC_AACLD, 60000, 76000, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 76000, 128001, 16000, 2, 14, 14, 13, 13, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 22.05/44.1 kHz dual rate */ +- {CODEC_AACLD, 32000, 36000, 22050, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 36000, 44000, 22050, 2, 5, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 44000, 52000, 22050, 2, 7, 10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 52000, 60000, 22050, 2, 9, 11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, +- 1}, +- {CODEC_AACLD, 60000, 76000, 22050, 2, 10, 12, 10, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 76000, 82000, 22050, 2, 12, 12, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 82000, 128001, 22050, 2, 13, 12, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 24/48 kHz dual rate */ +- {CODEC_AACLD, 32000, 36000, 24000, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 36000, 44000, 24000, 2, 4, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 44000, 52000, 24000, 2, 6, 10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 52000, 60000, 24000, 2, 9, 11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, +- 1}, +- {CODEC_AACLD, 60000, 76000, 24000, 2, 11, 12, 10, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 76000, 88000, 24000, 2, 12, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 88000, 128001, 24000, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 32/64 kHz dual rate */ +- {CODEC_AACLD, 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 80000, 112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, +- 1}, +- {CODEC_AACLD, 112000, 144000, 32000, 2, 11, 11, 10, 10, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 144000, 256001, 32000, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 44.1/88.2 kHz dual rate */ +- {CODEC_AACLD, 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, +- 2}, +- {CODEC_AACLD, 80000, 112000, 44100, 2, 10, 10, 8, 8, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 112000, 144000, 44100, 2, 12, 12, 10, 10, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 144000, 256001, 44100, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +- /* 48/96 kHz dual rate */ +- {CODEC_AACLD, 60000, 80000, 48000, 2, 7, 7, 10, 10, 2, 0, -3, +- SBR_SWITCH_LRC, 2}, +- {CODEC_AACLD, 80000, 112000, 48000, 2, 9, 9, 10, 10, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 112000, 144000, 48000, 2, 11, 11, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 144000, 176000, 48000, 2, 12, 12, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- {CODEC_AACLD, 176000, 256001, 48000, 2, 13, 13, 11, 11, 3, 0, -3, +- SBR_LEFT_RIGHT, 1}, +- +-}; +- +-const int sbrTuningTableSize = +- sizeof(sbrTuningTable) / sizeof(sbrTuningTable[0]); +- +-const psTuningTable_t psTuningTable[4] = { +- {8000, 22000, PSENC_STEREO_BANDS_10, PSENC_NENV_1, +- FL2FXCONST_DBL(3.0f / 4.0f)}, +- {22000, 28000, PSENC_STEREO_BANDS_20, PSENC_NENV_1, +- FL2FXCONST_DBL(2.0f / 4.0f)}, +- {28000, 36000, PSENC_STEREO_BANDS_20, PSENC_NENV_2, +- FL2FXCONST_DBL(1.5f / 4.0f)}, +- {36000, 160001, PSENC_STEREO_BANDS_20, PSENC_NENV_4, +- FL2FXCONST_DBL(1.1f / 4.0f)}, +-}; +- +-//@} +diff --git a/libSBRenc/src/sbrenc_rom.h b/libSBRenc/src/sbrenc_rom.h +deleted file mode 100644 +index 18c1fb9..0000000 +--- a/libSBRenc/src/sbrenc_rom.h ++++ /dev/null +@@ -1,145 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +-\file +-\brief Declaration of constant tables +-$Revision: 92790 $ +-*/ +-#ifndef SBRENC_ROM_H +-#define SBRENC_ROM_H +- +-#include "sbr_def.h" +-#include "sbr_encoder.h" +- +-#include "ps_main.h" +- +-/* +- huffman tables +-*/ +-extern const INT v_Huff_envelopeLevelC10T[121]; +-extern const UCHAR v_Huff_envelopeLevelL10T[121]; +-extern const INT v_Huff_envelopeLevelC10F[121]; +-extern const UCHAR v_Huff_envelopeLevelL10F[121]; +-extern const INT bookSbrEnvBalanceC10T[49]; +-extern const UCHAR bookSbrEnvBalanceL10T[49]; +-extern const INT bookSbrEnvBalanceC10F[49]; +-extern const UCHAR bookSbrEnvBalanceL10F[49]; +-extern const INT v_Huff_envelopeLevelC11T[63]; +-extern const UCHAR v_Huff_envelopeLevelL11T[63]; +-extern const INT v_Huff_envelopeLevelC11F[63]; +-extern const UCHAR v_Huff_envelopeLevelL11F[63]; +-extern const INT bookSbrEnvBalanceC11T[25]; +-extern const UCHAR bookSbrEnvBalanceL11T[25]; +-extern const INT bookSbrEnvBalanceC11F[25]; +-extern const UCHAR bookSbrEnvBalanceL11F[25]; +-extern const INT v_Huff_NoiseLevelC11T[63]; +-extern const UCHAR v_Huff_NoiseLevelL11T[63]; +-extern const INT bookSbrNoiseBalanceC11T[25]; +-extern const UCHAR bookSbrNoiseBalanceL11T[25]; +- +-extern const sbrTuningTable_t sbrTuningTable[]; +-extern const int sbrTuningTableSize; +- +-extern const psTuningTable_t psTuningTable[4]; +- +-#endif +diff --git a/libSBRenc/src/ton_corr.cpp b/libSBRenc/src/ton_corr.cpp +deleted file mode 100644 +index 1c050e2..0000000 +--- a/libSBRenc/src/ton_corr.cpp ++++ /dev/null +@@ -1,891 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-#include "ton_corr.h" +- +-#include "sbrenc_ram.h" +-#include "sbr_misc.h" +-#include "genericStds.h" +-#include "autocorr2nd.h" +- +-#define BAND_V_SIZE 32 +-#define NUM_V_COMBINE \ +- 8 /* Must be a divisor of 64 and fulfill the ASSERTs below */ +- +-/**************************************************************************/ +-/*! +- \brief Calculates the tonal to noise ration for different frequency bands +- and time segments. +- +- The ratio between the predicted energy (tonal energy A) and the total +- energy (A + B) is calculated. This is converted to the ratio between +- the predicted energy (tonal energy A) and the non-predictable energy +- (noise energy B). Hence the quota-matrix contains A/B = q/(1-q). +- +- The samples in nrgVector are scaled by 1.0/16.0 +- The samples in pNrgVectorFreq are scaled by 1.0/2.0 +- The samples in quotaMatrix are scaled by RELAXATION +- +- \return none. +- +-*/ +-/**************************************************************************/ +- +-void FDKsbrEnc_CalculateTonalityQuotas( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- FIXP_DBL **RESTRICT +- sourceBufferReal, /*!< The real part of the QMF-matrix. */ +- FIXP_DBL **RESTRICT +- sourceBufferImag, /*!< The imaginary part of the QMF-matrix. */ +- INT usb, /*!< upper side band, highest + 1 QMF band in the SBR range. */ +- INT qmfScale /*!< sclefactor of QMF subsamples */ +-) { +- INT i, k, r, r2, timeIndex, autoCorrScaling; +- +- INT startIndexMatrix = hTonCorr->startIndexMatrix; +- INT totNoEst = hTonCorr->numberOfEstimates; +- INT noEstPerFrame = hTonCorr->numberOfEstimatesPerFrame; +- INT move = hTonCorr->move; +- INT noQmfChannels = hTonCorr->noQmfChannels; /* Number of Bands */ +- INT buffLen = hTonCorr->bufferLength; /* Number of Slots */ +- INT stepSize = hTonCorr->stepSize; +- INT *pBlockLength = hTonCorr->lpcLength; +- INT **RESTRICT signMatrix = hTonCorr->signMatrix; +- FIXP_DBL *RESTRICT nrgVector = hTonCorr->nrgVector; +- FIXP_DBL **RESTRICT quotaMatrix = hTonCorr->quotaMatrix; +- FIXP_DBL *RESTRICT pNrgVectorFreq = hTonCorr->nrgVectorFreq; +- +- FIXP_DBL *realBuf; +- FIXP_DBL *imagBuf; +- +- FIXP_DBL alphar[2], alphai[2], fac; +- +- C_ALLOC_SCRATCH_START(ac, ACORR_COEFS, 1) +- C_ALLOC_SCRATCH_START(realBufRef, FIXP_DBL, 2 * BAND_V_SIZE * NUM_V_COMBINE) +- realBuf = realBufRef; +- imagBuf = realBuf + BAND_V_SIZE * NUM_V_COMBINE; +- +- FDK_ASSERT(buffLen <= BAND_V_SIZE); +- FDK_ASSERT(sizeof(FIXP_DBL) * NUM_V_COMBINE * BAND_V_SIZE * 2 < +- (1024 * sizeof(FIXP_DBL) - sizeof(ACORR_COEFS))); +- +- /* +- * Buffering of the quotaMatrix and the quotaMatrixTransp. +- *********************************************************/ +- for (i = 0; i < move; i++) { +- FDKmemcpy(quotaMatrix[i], quotaMatrix[i + noEstPerFrame], +- noQmfChannels * sizeof(FIXP_DBL)); +- FDKmemcpy(signMatrix[i], signMatrix[i + noEstPerFrame], +- noQmfChannels * sizeof(INT)); +- } +- +- FDKmemmove(nrgVector, nrgVector + noEstPerFrame, move * sizeof(FIXP_DBL)); +- FDKmemclear(nrgVector + startIndexMatrix, +- (totNoEst - startIndexMatrix) * sizeof(FIXP_DBL)); +- FDKmemclear(pNrgVectorFreq, noQmfChannels * sizeof(FIXP_DBL)); +- +- /* +- * Calculate the quotas for the current time steps. +- **************************************************/ +- +- for (r = 0; r < usb; r++) { +- int blockLength; +- +- k = hTonCorr->nextSample; /* startSample */ +- timeIndex = startIndexMatrix; +- /* Copy as many as possible Band across all Slots at once */ +- if (realBuf != realBufRef) { +- realBuf -= BAND_V_SIZE; +- imagBuf -= BAND_V_SIZE; +- } else { +- realBuf += BAND_V_SIZE * (NUM_V_COMBINE - 1); +- imagBuf += BAND_V_SIZE * (NUM_V_COMBINE - 1); +- +- for (i = 0; i < buffLen; i++) { +- int v; +- FIXP_DBL *ptr; +- ptr = realBuf + i; +- for (v = 0; v < NUM_V_COMBINE; v++) { +- ptr[0] = sourceBufferReal[i][r + v]; +- ptr[0 + BAND_V_SIZE * NUM_V_COMBINE] = sourceBufferImag[i][r + v]; +- ptr -= BAND_V_SIZE; +- } +- } +- } +- +- blockLength = pBlockLength[0]; +- +- while (k <= buffLen - blockLength) { +- autoCorrScaling = fixMin( +- getScalefactor(&realBuf[k - LPC_ORDER], LPC_ORDER + blockLength), +- getScalefactor(&imagBuf[k - LPC_ORDER], LPC_ORDER + blockLength)); +- autoCorrScaling = fixMax(0, autoCorrScaling - 1); +- +- scaleValues(&realBuf[k - LPC_ORDER], LPC_ORDER + blockLength, +- autoCorrScaling); +- scaleValues(&imagBuf[k - LPC_ORDER], LPC_ORDER + blockLength, +- autoCorrScaling); +- +- autoCorrScaling <<= 1; /* consider qmf buffer scaling twice */ +- autoCorrScaling += +- autoCorr2nd_cplx(ac, realBuf + k, imagBuf + k, blockLength); +- +- if (ac->det == FL2FXCONST_DBL(0.0f)) { +- alphar[1] = alphai[1] = FL2FXCONST_DBL(0.0f); +- +- alphar[0] = (ac->r01r) >> 2; +- alphai[0] = (ac->r01i) >> 2; +- +- fac = fMultDiv2(ac->r00r, ac->r11r) >> 1; +- } else { +- alphar[1] = (fMultDiv2(ac->r01r, ac->r12r) >> 1) - +- (fMultDiv2(ac->r01i, ac->r12i) >> 1) - +- (fMultDiv2(ac->r02r, ac->r11r) >> 1); +- alphai[1] = (fMultDiv2(ac->r01i, ac->r12r) >> 1) + +- (fMultDiv2(ac->r01r, ac->r12i) >> 1) - +- (fMultDiv2(ac->r02i, ac->r11r) >> 1); +- +- alphar[0] = (fMultDiv2(ac->r01r, ac->det) >> (ac->det_scale + 1)) + +- fMult(alphar[1], ac->r12r) + fMult(alphai[1], ac->r12i); +- alphai[0] = (fMultDiv2(ac->r01i, ac->det) >> (ac->det_scale + 1)) + +- fMult(alphai[1], ac->r12r) - fMult(alphar[1], ac->r12i); +- +- fac = fMultDiv2(ac->r00r, fMult(ac->det, ac->r11r)) >> +- (ac->det_scale + 1); +- } +- +- if (fac == FL2FXCONST_DBL(0.0f)) { +- quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); +- signMatrix[timeIndex][r] = 0; +- } else { +- /* quotaMatrix is scaled with the factor RELAXATION +- parse RELAXATION in fractional part and shift factor: 1/(1/0.524288 * +- 2^RELAXATION_SHIFT) */ +- FIXP_DBL tmp, num, denom; +- INT numShift, denomShift, commonShift; +- INT sign; +- +- num = fMultDiv2(alphar[0], ac->r01r) + fMultDiv2(alphai[0], ac->r01i) - +- fMultDiv2(alphar[1], fMult(ac->r02r, ac->r11r)) - +- fMultDiv2(alphai[1], fMult(ac->r02i, ac->r11r)); +- num = fixp_abs(num); +- +- denom = (fac >> 1) + +- (fMultDiv2(fac, RELAXATION_FRACT) >> RELAXATION_SHIFT) - num; +- denom = fixp_abs(denom); +- +- num = fMult(num, RELAXATION_FRACT); +- +- numShift = CountLeadingBits(num) - 2; +- num = scaleValue(num, numShift); +- +- denomShift = CountLeadingBits(denom); +- denom = (FIXP_DBL)denom << denomShift; +- +- if ((num > FL2FXCONST_DBL(0.0f)) && (denom != FL2FXCONST_DBL(0.0f))) { +- commonShift = +- fixMin(numShift - denomShift + RELAXATION_SHIFT, DFRACT_BITS - 1); +- if (commonShift < 0) { +- commonShift = -commonShift; +- tmp = schur_div(num, denom, 16); +- commonShift = fixMin(commonShift, CountLeadingBits(tmp)); +- quotaMatrix[timeIndex][r] = tmp << commonShift; +- } else { +- quotaMatrix[timeIndex][r] = +- schur_div(num, denom, 16) >> commonShift; +- } +- } else { +- quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); +- } +- +- if (ac->r11r != FL2FXCONST_DBL(0.0f)) { +- if (((ac->r01r >= FL2FXCONST_DBL(0.0f)) && +- (ac->r11r >= FL2FXCONST_DBL(0.0f))) || +- ((ac->r01r < FL2FXCONST_DBL(0.0f)) && +- (ac->r11r < FL2FXCONST_DBL(0.0f)))) { +- sign = 1; +- } else { +- sign = -1; +- } +- } else { +- sign = 1; +- } +- +- if (sign < 0) { +- r2 = r; /* (INT) pow(-1, band); */ +- } else { +- r2 = r + 1; /* (INT) pow(-1, band+1); */ +- } +- signMatrix[timeIndex][r] = 1 - 2 * (r2 & 0x1); +- } +- +- nrgVector[timeIndex] += +- ((ac->r00r) >> +- fixMin(DFRACT_BITS - 1, +- (2 * qmfScale + autoCorrScaling + SCALE_NRGVEC))); +- /* pNrgVectorFreq[r] finally has to be divided by noEstPerFrame, replaced +- * division by shifting with one */ +- pNrgVectorFreq[r] = +- pNrgVectorFreq[r] + +- ((ac->r00r) >> +- fixMin(DFRACT_BITS - 1, +- (2 * qmfScale + autoCorrScaling + SCALE_NRGVEC))); +- +- blockLength = pBlockLength[1]; +- k += stepSize; +- timeIndex++; +- } +- } +- +- C_ALLOC_SCRATCH_END(realBufRef, FIXP_DBL, 2 * BAND_V_SIZE * NUM_V_COMBINE) +- C_ALLOC_SCRATCH_END(ac, ACORR_COEFS, 1) +-} +- +-/**************************************************************************/ +-/*! +- \brief Extracts the parameters required in the decoder to obtain the +- correct tonal to noise ratio after SBR. +- +- Estimates the tonal to noise ratio of the original signal (using LPC). +- Predicts the tonal to noise ration of the SBR signal (in the decoder) by +- patching the tonal to noise ratio values similar to the patching of the +- lowband in the decoder. Given the tonal to noise ratio of the original +- and the SBR signal, it estimates the required amount of inverse filtering, +- additional noise as well as any additional sines. +- +- \return none. +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_TonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- INVF_MODE *infVec, /*!< Vector where the inverse filtering levels will be +- stored. */ +- FIXP_DBL *noiseLevels, /*!< Vector where the noise levels will be stored. */ +- INT *missingHarmonicFlag, /*!< Flag set to one or zero, dependent on if any +- strong sines are missing.*/ +- UCHAR *missingHarmonicsIndex, /*!< Vector indicating where sines are +- missing. */ +- UCHAR *envelopeCompensation, /*!< Vector to store compensation values for +- the energies in. */ +- const SBR_FRAME_INFO *frameInfo, /*!< Frame info struct, contains the time +- and frequency grid of the current +- frame.*/ +- UCHAR *transientInfo, /*!< Transient info.*/ +- UCHAR *freqBandTable, /*!< Frequency band tables for high-res.*/ +- INT nSfb, /*!< Number of scalefactor bands for high-res. */ +- XPOS_MODE xposType, /*!< Type of transposer used in the decoder.*/ +- UINT sbrSyntaxFlags) { +- INT band; +- INT transientFlag = transientInfo[1]; /*!< Flag indicating if a transient is +- present in the current frame. */ +- INT transientPos = transientInfo[0]; /*!< Position of the transient.*/ +- INT transientFrame, transientFrameInvfEst; +- INVF_MODE *infVecPtr; +- +- /* Determine if this is a frame where a transient starts... +- +- The detection of noise-floor, missing harmonics and invf_est, is not in sync +- for the non-buf-opt decoder such as AAC. Hence we need to keep track on the +- transient in the present frame as well as in the next. +- */ +- transientFrame = 0; +- if (hTonCorr->transientNextFrame) { /* The transient was detected in the +- previous frame, but is actually */ +- transientFrame = 1; +- hTonCorr->transientNextFrame = 0; +- +- if (transientFlag) { +- if (transientPos + hTonCorr->transientPosOffset >= +- frameInfo->borders[frameInfo->nEnvelopes]) { +- hTonCorr->transientNextFrame = 1; +- } +- } +- } else { +- if (transientFlag) { +- if (transientPos + hTonCorr->transientPosOffset < +- frameInfo->borders[frameInfo->nEnvelopes]) { +- transientFrame = 1; +- hTonCorr->transientNextFrame = 0; +- } else { +- hTonCorr->transientNextFrame = 1; +- } +- } +- } +- transientFrameInvfEst = transientFrame; +- +- /* +- Estimate the required invese filtereing level. +- */ +- if (hTonCorr->switchInverseFilt) +- FDKsbrEnc_qmfInverseFilteringDetector( +- &hTonCorr->sbrInvFilt, hTonCorr->quotaMatrix, hTonCorr->nrgVector, +- hTonCorr->indexVector, hTonCorr->frameStartIndexInvfEst, +- hTonCorr->numberOfEstimatesPerFrame + hTonCorr->frameStartIndexInvfEst, +- transientFrameInvfEst, infVec); +- +- /* +- Detect what tones will be missing. +- */ +- if (xposType == XPOS_LC) { +- FDKsbrEnc_SbrMissingHarmonicsDetectorQmf( +- &hTonCorr->sbrMissingHarmonicsDetector, hTonCorr->quotaMatrix, +- hTonCorr->signMatrix, hTonCorr->indexVector, frameInfo, transientInfo, +- missingHarmonicFlag, missingHarmonicsIndex, freqBandTable, nSfb, +- envelopeCompensation, hTonCorr->nrgVectorFreq); +- } else { +- *missingHarmonicFlag = 0; +- FDKmemclear(missingHarmonicsIndex, nSfb * sizeof(UCHAR)); +- } +- +- /* +- Noise floor estimation +- */ +- +- infVecPtr = hTonCorr->sbrInvFilt.prevInvfMode; +- +- FDKsbrEnc_sbrNoiseFloorEstimateQmf( +- &hTonCorr->sbrNoiseFloorEstimate, frameInfo, noiseLevels, +- hTonCorr->quotaMatrix, hTonCorr->indexVector, *missingHarmonicFlag, +- hTonCorr->frameStartIndex, hTonCorr->numberOfEstimatesPerFrame, +- transientFrame, infVecPtr, sbrSyntaxFlags); +- +- /* Store the invfVec data for the next frame...*/ +- for (band = 0; band < hTonCorr->sbrInvFilt.noDetectorBands; band++) { +- hTonCorr->sbrInvFilt.prevInvfMode[band] = infVec[band]; +- } +-} +- +-/**************************************************************************/ +-/*! +- \brief Searches for the closest match in the frequency master table. +- +- +- +- \return closest entry. +- +-*/ +-/**************************************************************************/ +-static INT findClosestEntry(INT goalSb, UCHAR *v_k_master, INT numMaster, +- INT direction) { +- INT index; +- +- if (goalSb <= v_k_master[0]) return v_k_master[0]; +- +- if (goalSb >= v_k_master[numMaster]) return v_k_master[numMaster]; +- +- if (direction) { +- index = 0; +- while (v_k_master[index] < goalSb) { +- index++; +- } +- } else { +- index = numMaster; +- while (v_k_master[index] > goalSb) { +- index--; +- } +- } +- +- return v_k_master[index]; +-} +- +-/**************************************************************************/ +-/*! +- \brief resets the patch +- +- +- +- \return errorCode, noError if successful. +- +-*/ +-/**************************************************************************/ +-static INT resetPatch( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- INT xposctrl, /*!< Different patch modes. */ +- INT highBandStartSb, /*!< Start band of the SBR range. */ +- UCHAR *v_k_master, /*!< Master frequency table from which all other table +- are derived.*/ +- INT numMaster, /*!< Number of elements in the master table. */ +- INT fs, /*!< Sampling frequency. */ +- INT noChannels) /*!< Number of QMF-channels. */ +-{ +- INT patch, k, i; +- INT targetStopBand; +- +- PATCH_PARAM *patchParam = hTonCorr->patchParam; +- +- INT sbGuard = hTonCorr->guard; +- INT sourceStartBand; +- INT patchDistance; +- INT numBandsInPatch; +- +- INT lsb = +- v_k_master[0]; /* Lowest subband related to the synthesis filterbank */ +- INT usb = v_k_master[numMaster]; /* Stop subband related to the synthesis +- filterbank */ +- INT xoverOffset = +- highBandStartSb - +- v_k_master[0]; /* Calculate distance in subbands between k0 and kx */ +- +- INT goalSb; +- +- /* +- * Initialize the patching parameter +- */ +- +- if (xposctrl == 1) { +- lsb += xoverOffset; +- xoverOffset = 0; +- } +- +- goalSb = (INT)((2 * noChannels * 16000 + (fs >> 1)) / fs); /* 16 kHz band */ +- goalSb = findClosestEntry(goalSb, v_k_master, numMaster, +- 1); /* Adapt region to master-table */ +- +- /* First patch */ +- sourceStartBand = hTonCorr->shiftStartSb + xoverOffset; +- targetStopBand = lsb + xoverOffset; +- +- /* even (odd) numbered channel must be patched to even (odd) numbered channel +- */ +- patch = 0; +- while (targetStopBand < usb) { +- /* To many patches */ +- if (patch >= MAX_NUM_PATCHES) return (1); /*Number of patches to high */ +- +- patchParam[patch].guardStartBand = targetStopBand; +- targetStopBand += sbGuard; +- patchParam[patch].targetStartBand = targetStopBand; +- +- numBandsInPatch = +- goalSb - targetStopBand; /* get the desired range of the patch */ +- +- if (numBandsInPatch >= lsb - sourceStartBand) { +- /* desired number bands are not available -> patch whole source range */ +- patchDistance = +- targetStopBand - sourceStartBand; /* get the targetOffset */ +- patchDistance = +- patchDistance & ~1; /* rounding off odd numbers and make all even */ +- numBandsInPatch = lsb - (targetStopBand - patchDistance); +- numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, +- v_k_master, numMaster, 0) - +- targetStopBand; /* Adapt region to master-table */ +- } +- +- /* desired number bands are available -> get the minimal even patching +- * distance */ +- patchDistance = +- numBandsInPatch + targetStopBand - lsb; /* get minimal distance */ +- patchDistance = (patchDistance + 1) & +- ~1; /* rounding up odd numbers and make all even */ +- +- if (numBandsInPatch <= 0) { +- patch--; +- } else { +- patchParam[patch].sourceStartBand = targetStopBand - patchDistance; +- patchParam[patch].targetBandOffs = patchDistance; +- patchParam[patch].numBandsInPatch = numBandsInPatch; +- patchParam[patch].sourceStopBand = +- patchParam[patch].sourceStartBand + numBandsInPatch; +- +- targetStopBand += patchParam[patch].numBandsInPatch; +- } +- +- /* All patches but first */ +- sourceStartBand = hTonCorr->shiftStartSb; +- +- /* Check if we are close to goalSb */ +- if (fixp_abs(targetStopBand - goalSb) < 3) { +- goalSb = usb; +- } +- +- patch++; +- } +- +- patch--; +- +- /* if highest patch contains less than three subband: skip it */ +- if (patchParam[patch].numBandsInPatch < 3 && patch > 0) { +- patch--; +- } +- +- hTonCorr->noOfPatches = patch + 1; +- +- /* Assign the index-vector, so we know where to look for the high-band. +- -1 represents a guard-band. */ +- for (k = 0; k < hTonCorr->patchParam[0].guardStartBand; k++) +- hTonCorr->indexVector[k] = k; +- +- for (i = 0; i < hTonCorr->noOfPatches; i++) { +- INT sourceStart = hTonCorr->patchParam[i].sourceStartBand; +- INT targetStart = hTonCorr->patchParam[i].targetStartBand; +- INT numberOfBands = hTonCorr->patchParam[i].numBandsInPatch; +- INT startGuardBand = hTonCorr->patchParam[i].guardStartBand; +- +- for (k = 0; k < (targetStart - startGuardBand); k++) +- hTonCorr->indexVector[startGuardBand + k] = -1; +- +- for (k = 0; k < numberOfBands; k++) +- hTonCorr->indexVector[targetStart + k] = sourceStart + k; +- } +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief Creates an instance of the tonality correction parameter module. +- +- The module includes modules for inverse filtering level estimation, +- missing harmonics detection and noise floor level estimation. +- +- \return errorCode, noError if successful. +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_CreateTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST +- hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ +- INT chan) /*!< Channel index, needed for mem allocation */ +-{ +- INT i; +- FIXP_DBL *quotaMatrix = GetRam_Sbr_quotaMatrix(chan); +- INT *signMatrix = GetRam_Sbr_signMatrix(chan); +- +- if ((NULL == quotaMatrix) || (NULL == signMatrix)) { +- goto bail; +- } +- +- FDKmemclear(hTonCorr, sizeof(SBR_TON_CORR_EST)); +- +- for (i = 0; i < MAX_NO_OF_ESTIMATES; i++) { +- hTonCorr->quotaMatrix[i] = quotaMatrix + (i * 64); +- hTonCorr->signMatrix[i] = signMatrix + (i * 64); +- } +- +- if (0 != FDKsbrEnc_CreateSbrMissingHarmonicsDetector( +- &hTonCorr->sbrMissingHarmonicsDetector, chan)) { +- goto bail; +- } +- +- return 0; +- +-bail: +- hTonCorr->quotaMatrix[0] = quotaMatrix; +- hTonCorr->signMatrix[0] = signMatrix; +- +- FDKsbrEnc_DeleteTonCorrParamExtr(hTonCorr); +- +- return -1; +-} +- +-/**************************************************************************/ +-/*! +- \brief Initialize an instance of the tonality correction parameter module. +- +- The module includes modules for inverse filtering level estimation, +- missing harmonics detection and noise floor level estimation. +- +- \return errorCode, noError if successful. +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_InitTonCorrParamExtr( +- INT frameSize, /*!< Current SBR frame size. */ +- HANDLE_SBR_TON_CORR_EST +- hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ +- HANDLE_SBR_CONFIG_DATA +- sbrCfg, /*!< Pointer to SBR configuration parameters. */ +- INT timeSlots, /*!< Number of time-slots per frame */ +- INT xposCtrl, /*!< Different patch modes. */ +- INT ana_max_level, /*!< Maximum level of the adaptive noise. */ +- INT noiseBands, /*!< Number of noise bands per octave. */ +- INT noiseFloorOffset, /*!< Noise floor offset. */ +- UINT useSpeechConfig) /*!< Speech or music tuning. */ +-{ +- INT nCols = sbrCfg->noQmfSlots; +- INT fs = sbrCfg->sampleFreq; +- INT noQmfChannels = sbrCfg->noQmfBands; +- +- INT highBandStartSb = sbrCfg->freqBandTable[LOW_RES][0]; +- UCHAR *v_k_master = sbrCfg->v_k_master; +- INT numMaster = sbrCfg->num_Master; +- +- UCHAR **freqBandTable = sbrCfg->freqBandTable; +- INT *nSfb = sbrCfg->nSfb; +- +- INT i; +- +- /* +- Reset the patching and allocate memory for the quota matrix. +- Assuming parameters for the LPC analysis. +- */ +- if (sbrCfg->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- switch (timeSlots) { +- case NUMBER_TIME_SLOTS_1920: +- hTonCorr->lpcLength[0] = 8 - LPC_ORDER; +- hTonCorr->lpcLength[1] = 7 - LPC_ORDER; +- hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LD; +- hTonCorr->numberOfEstimatesPerFrame = 2; /* sbrCfg->noQmfSlots / 7 */ +- hTonCorr->frameStartIndexInvfEst = 0; +- hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; +- break; +- case NUMBER_TIME_SLOTS_2048: +- hTonCorr->lpcLength[0] = 8 - LPC_ORDER; +- hTonCorr->lpcLength[1] = 8 - LPC_ORDER; +- hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LD; +- hTonCorr->numberOfEstimatesPerFrame = 2; /* sbrCfg->noQmfSlots / 8 */ +- hTonCorr->frameStartIndexInvfEst = 0; +- hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; +- break; +- } +- } else +- switch (timeSlots) { +- case NUMBER_TIME_SLOTS_2048: +- hTonCorr->lpcLength[0] = 16 - LPC_ORDER; /* blockLength[0] */ +- hTonCorr->lpcLength[1] = 16 - LPC_ORDER; /* blockLength[0] */ +- hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LC; +- hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 16; +- hTonCorr->frameStartIndexInvfEst = 0; +- hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_2048; +- break; +- case NUMBER_TIME_SLOTS_1920: +- hTonCorr->lpcLength[0] = 15 - LPC_ORDER; /* blockLength[0] */ +- hTonCorr->lpcLength[1] = 15 - LPC_ORDER; /* blockLength[0] */ +- hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LC; +- hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 15; +- hTonCorr->frameStartIndexInvfEst = 0; +- hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_1920; +- break; +- default: +- return -1; +- } +- +- hTonCorr->bufferLength = nCols; +- hTonCorr->stepSize = +- hTonCorr->lpcLength[0] + LPC_ORDER; /* stepSize[0] implicitly 0. */ +- +- hTonCorr->nextSample = LPC_ORDER; /* firstSample */ +- hTonCorr->move = hTonCorr->numberOfEstimates - +- hTonCorr->numberOfEstimatesPerFrame; /* Number of estimates +- to move when +- buffering.*/ +- if (hTonCorr->move < 0) { +- return -1; +- } +- hTonCorr->startIndexMatrix = +- hTonCorr->numberOfEstimates - +- hTonCorr->numberOfEstimatesPerFrame; /* Where to store the latest +- estimations in the tonality +- Matrix.*/ +- hTonCorr->frameStartIndex = 0; /* Where in the tonality matrix the current +- frame (to be sent to the decoder) starts. */ +- hTonCorr->prevTransientFlag = 0; +- hTonCorr->transientNextFrame = 0; +- +- hTonCorr->noQmfChannels = noQmfChannels; +- +- for (i = 0; i < hTonCorr->numberOfEstimates; i++) { +- FDKmemclear(hTonCorr->quotaMatrix[i], sizeof(FIXP_DBL) * noQmfChannels); +- FDKmemclear(hTonCorr->signMatrix[i], sizeof(INT) * noQmfChannels); +- } +- +- /* Reset the patch.*/ +- hTonCorr->guard = 0; +- hTonCorr->shiftStartSb = 1; +- +- if (resetPatch(hTonCorr, xposCtrl, highBandStartSb, v_k_master, numMaster, fs, +- noQmfChannels)) +- return (1); +- +- if (FDKsbrEnc_InitSbrNoiseFloorEstimate( +- &hTonCorr->sbrNoiseFloorEstimate, ana_max_level, freqBandTable[LO], +- nSfb[LO], noiseBands, noiseFloorOffset, timeSlots, useSpeechConfig)) +- return (1); +- +- if (FDKsbrEnc_initInvFiltDetector( +- &hTonCorr->sbrInvFilt, +- hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, +- hTonCorr->sbrNoiseFloorEstimate.noNoiseBands, useSpeechConfig)) +- return (1); +- +- if (FDKsbrEnc_InitSbrMissingHarmonicsDetector( +- &hTonCorr->sbrMissingHarmonicsDetector, fs, frameSize, nSfb[HI], +- noQmfChannels, hTonCorr->numberOfEstimates, hTonCorr->move, +- hTonCorr->numberOfEstimatesPerFrame, sbrCfg->sbrSyntaxFlags)) +- return (1); +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief resets tonality correction parameter module. +- +- +- +- \return errorCode, noError if successful. +- +-*/ +-/**************************************************************************/ +-INT FDKsbrEnc_ResetTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- INT xposctrl, /*!< Different patch modes. */ +- INT highBandStartSb, /*!< Start band of the SBR range. */ +- UCHAR *v_k_master, /*!< Master frequency table from which all other table +- are derived.*/ +- INT numMaster, /*!< Number of elements in the master table. */ +- INT fs, /*!< Sampling frequency (of the SBR part). */ +- UCHAR * +- *freqBandTable, /*!< Frequency band table for low-res and high-res. */ +- INT *nSfb, /*!< Number of frequency bands (hig-res and low-res). */ +- INT noQmfChannels /*!< Number of QMF channels. */ +-) { +- /* Reset the patch.*/ +- hTonCorr->guard = 0; +- hTonCorr->shiftStartSb = 1; +- +- if (resetPatch(hTonCorr, xposctrl, highBandStartSb, v_k_master, numMaster, fs, +- noQmfChannels)) +- return (1); +- +- /* Reset the noise floor estimate.*/ +- if (FDKsbrEnc_resetSbrNoiseFloorEstimate(&hTonCorr->sbrNoiseFloorEstimate, +- freqBandTable[LO], nSfb[LO])) +- return (1); +- +- /* +- Reset the inveerse filtereing detector. +- */ +- if (FDKsbrEnc_resetInvFiltDetector( +- &hTonCorr->sbrInvFilt, +- hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, +- hTonCorr->sbrNoiseFloorEstimate.noNoiseBands)) +- return (1); +- /* Reset the missing harmonics detector. */ +- if (FDKsbrEnc_ResetSbrMissingHarmonicsDetector( +- &hTonCorr->sbrMissingHarmonicsDetector, nSfb[HI])) +- return (1); +- +- return (0); +-} +- +-/**************************************************************************/ +-/*! +- \brief Deletes the tonality correction paramtere module. +- +- +- +- \return none +- +-*/ +-/**************************************************************************/ +-void FDKsbrEnc_DeleteTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr) /*!< Handle to SBR_TON_CORR struct. */ +-{ +- if (hTonCorr) { +- FreeRam_Sbr_quotaMatrix(hTonCorr->quotaMatrix); +- +- FreeRam_Sbr_signMatrix(hTonCorr->signMatrix); +- +- FDKsbrEnc_DeleteSbrMissingHarmonicsDetector( +- &hTonCorr->sbrMissingHarmonicsDetector); +- } +-} +diff --git a/libSBRenc/src/ton_corr.h b/libSBRenc/src/ton_corr.h +deleted file mode 100644 +index 91aa278..0000000 +--- a/libSBRenc/src/ton_corr.h ++++ /dev/null +@@ -1,258 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief General tonality correction detector module. +-*/ +-#ifndef TON_CORR_H +-#define TON_CORR_H +- +-#include "sbr_encoder.h" +-#include "mh_det.h" +-#include "nf_est.h" +-#include "invf_est.h" +- +-#define MAX_NUM_PATCHES 6 +-#define SCALE_NRGVEC 4 +- +-/** parameter set for one single patch */ +-typedef struct { +- INT sourceStartBand; /*!< first band in lowbands where to take the samples +- from */ +- INT sourceStopBand; /*!< first band in lowbands which is not included in the +- patch anymore */ +- INT guardStartBand; /*!< first band in highbands to be filled with zeros in +- order to reduce interferences between patches */ +- INT targetStartBand; /*!< first band in highbands to be filled with whitened +- lowband signal */ +- INT targetBandOffs; /*!< difference between 'startTargetBand' and +- 'startSourceBand' */ +- INT numBandsInPatch; /*!< number of consecutive bands in this one patch */ +-} PATCH_PARAM; +- +-typedef struct { +- INT switchInverseFilt; /*!< Flag to enable dynamic adaption of invf. detection +- */ +- INT noQmfChannels; +- INT bufferLength; /*!< Length of the r and i buffers. */ +- INT stepSize; /*!< Stride for the lpc estimate. */ +- INT numberOfEstimates; /*!< The total number of estiamtes, available in the +- quotaMatrix.*/ +- UINT numberOfEstimatesPerFrame; /*!< The number of estimates per frame +- available in the quotaMatrix.*/ +- INT lpcLength[2]; /*!< Segment length used for second order LPC analysis.*/ +- INT nextSample; /*!< Where to start the LPC analysis of the current frame.*/ +- INT move; /*!< How many estimates to move in the quotaMatrix, when buffering. +- */ +- INT frameStartIndex; /*!< The start index for the current frame in the r and i +- buffers. */ +- INT startIndexMatrix; /*!< The start index for the current frame in the +- quotaMatrix. */ +- INT frameStartIndexInvfEst; /*!< The start index of the inverse filtering, not +- the same as the others, dependent on what +- decoder is used (buffer opt, or no buffer opt). +- */ +- INT prevTransientFlag; /*!< The transisent flag (from the transient detector) +- for the previous frame. */ +- INT transientNextFrame; /*!< Flag to indicate that the transient will show up +- in the next frame. */ +- INT transientPosOffset; /*!< An offset value to match the transient pos as +- calculated by the transient detector with the +- actual position in the frame.*/ +- +- INT* signMatrix[MAX_NO_OF_ESTIMATES]; /*!< Matrix holding the sign of each +- channe, i.e. indicating in what part +- of a QMF channel a possible sine is. +- */ +- +- FIXP_DBL* quotaMatrix[MAX_NO_OF_ESTIMATES]; /*!< Matrix holding the quota +- values for all estimates, all +- channels. */ +- +- FIXP_DBL nrgVector[MAX_NO_OF_ESTIMATES]; /*!< Vector holding the averaged +- energies for every QMF band. */ +- FIXP_DBL nrgVectorFreq[64]; /*!< Vector holding the averaged energies for +- every QMF channel */ +- +- SCHAR indexVector[64]; /*!< Index vector poINTing to the correct lowband +- channel, when indexing a highband channel, -1 +- represents a guard band */ +- PATCH_PARAM +- patchParam[MAX_NUM_PATCHES]; /*!< new parameter set for patching */ +- INT guard; /*!< number of guardbands between every patch */ +- INT shiftStartSb; /*!< lowest subband of source range to be included in the +- patches */ +- INT noOfPatches; /*!< number of patches */ +- +- SBR_MISSING_HARMONICS_DETECTOR +- sbrMissingHarmonicsDetector; /*!< SBR_MISSING_HARMONICS_DETECTOR struct. +- */ +- SBR_NOISE_FLOOR_ESTIMATE +- sbrNoiseFloorEstimate; /*!< SBR_NOISE_FLOOR_ESTIMATE struct. */ +- SBR_INV_FILT_EST sbrInvFilt; /*!< SBR_INV_FILT_EST struct. */ +-} SBR_TON_CORR_EST; +- +-typedef SBR_TON_CORR_EST* HANDLE_SBR_TON_CORR_EST; +- +-void FDKsbrEnc_TonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- INVF_MODE* infVec, /*!< Vector where the inverse filtering levels will be +- stored. */ +- FIXP_DBL* noiseLevels, /*!< Vector where the noise levels will be stored. */ +- INT* missingHarmonicFlag, /*!< Flag set to one or zero, dependent on if any +- strong sines are missing.*/ +- UCHAR* missingHarmonicsIndex, /*!< Vector indicating where sines are +- missing. */ +- UCHAR* envelopeCompensation, /*!< Vector to store compensation values for +- the energies in. */ +- const SBR_FRAME_INFO* frameInfo, /*!< Frame info struct, contains the time +- and frequency grid of the current +- frame.*/ +- UCHAR* transientInfo, /*!< Transient info.*/ +- UCHAR* freqBandTable, /*!< Frequency band tables for high-res.*/ +- INT nSfb, /*!< Number of scalefactor bands for high-res. */ +- XPOS_MODE xposType, /*!< Type of transposer used in the decoder.*/ +- UINT sbrSyntaxFlags); +- +-INT FDKsbrEnc_CreateTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST +- hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ +- INT chan); /*!< Channel index, needed for mem allocation */ +- +-INT FDKsbrEnc_InitTonCorrParamExtr( +- INT frameSize, /*!< Current SBR frame size. */ +- HANDLE_SBR_TON_CORR_EST +- hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ +- HANDLE_SBR_CONFIG_DATA +- sbrCfg, /*!< Pointer to SBR configuration parameters. */ +- INT timeSlots, /*!< Number of time-slots per frame */ +- INT xposCtrl, /*!< Different patch modes. */ +- INT ana_max_level, /*!< Maximum level of the adaptive noise. */ +- INT noiseBands, /*!< Number of noise bands per octave. */ +- INT noiseFloorOffset, /*!< Noise floor offset. */ +- UINT useSpeechConfig /*!< Speech or music tuning. */ +-); +- +-void FDKsbrEnc_DeleteTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr); /*!< Handle to SBR_TON_CORR struct. */ +- +-void FDKsbrEnc_CalculateTonalityQuotas( +- HANDLE_SBR_TON_CORR_EST hTonCorr, FIXP_DBL** sourceBufferReal, +- FIXP_DBL** sourceBufferImag, INT usb, +- INT qmfScale /*!< sclefactor of QMF subsamples */ +-); +- +-INT FDKsbrEnc_ResetTonCorrParamExtr( +- HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ +- INT xposctrl, /*!< Different patch modes. */ +- INT highBandStartSb, /*!< Start band of the SBR range. */ +- UCHAR* v_k_master, /*!< Master frequency table from which all other table +- are derived.*/ +- INT numMaster, /*!< Number of elements in the master table. */ +- INT fs, /*!< Sampling frequency (of the SBR part). */ +- UCHAR** +- freqBandTable, /*!< Frequency band table for low-res and high-res. */ +- INT* nSfb, /*!< Number of frequency bands (hig-res and low-res). */ +- INT noQmfChannels /*!< Number of QMF channels. */ +-); +-#endif +diff --git a/libSBRenc/src/tran_det.cpp b/libSBRenc/src/tran_det.cpp +deleted file mode 100644 +index 3b6765a..0000000 +--- a/libSBRenc/src/tran_det.cpp ++++ /dev/null +@@ -1,1092 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): Tobias Chalupka +- +- Description: SBR encoder transient detector +- +-*******************************************************************************/ +- +-#include "tran_det.h" +- +-#include "fram_gen.h" +-#include "sbrenc_ram.h" +-#include "sbr_misc.h" +- +-#include "genericStds.h" +- +-#define NORM_QMF_ENERGY 9.31322574615479E-10 /* 2^-30 */ +- +-/* static FIXP_DBL ABS_THRES = fixMax( FL2FXCONST_DBL(1.28e5 * +- * NORM_QMF_ENERGY), (FIXP_DBL)1) Minimum threshold for detecting changes */ +-#define ABS_THRES ((FIXP_DBL)16) +- +-/******************************************************************************* +- Functionname: spectralChange +- ******************************************************************************* +- \brief Calculates a measure for the spectral change within the frame +- +- The function says how good it would be to split the frame at the given border +- position into 2 envelopes. +- +- The return value delta_sum is scaled with the factor 1/64 +- +- \return calculated value +-*******************************************************************************/ +-#define NRG_SHIFT 3 /* for energy summation */ +- +-static FIXP_DBL spectralChange( +- FIXP_DBL Energies[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS], +- INT *scaleEnergies, FIXP_DBL EnergyTotal, INT nSfb, INT start, INT border, +- INT YBufferWriteOffset, INT stop, INT *result_e) { +- INT i, j; +- INT len1, len2; +- SCHAR energies_e_diff[NUMBER_TIME_SLOTS_2304], energies_e, energyTotal_e = 19, +- energies_e_add; +- SCHAR prevEnergies_e_diff, newEnergies_e_diff; +- FIXP_DBL tmp0, tmp1; +- FIXP_DBL delta, delta_sum; +- INT accu_e, tmp_e; +- +- delta_sum = FL2FXCONST_DBL(0.0f); +- *result_e = 0; +- +- len1 = border - start; +- len2 = stop - border; +- +- /* prefer borders near the middle of the frame */ +- FIXP_DBL pos_weight; +- pos_weight = FL2FXCONST_DBL(0.5f) - (len1 * GetInvInt(len1 + len2)); +- pos_weight = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL - +- (fMult(pos_weight, pos_weight) << 2); +- +- /*** Calc scaling for energies ***/ +- FDK_ASSERT(scaleEnergies[0] >= 0); +- FDK_ASSERT(scaleEnergies[1] >= 0); +- +- energies_e = 19 - fMin(scaleEnergies[0], scaleEnergies[1]); +- +- /* limit shift for energy accumulation, energies_e can be -10 min. */ +- if (energies_e < -10) { +- energies_e_add = -10 - energies_e; +- energies_e = -10; +- } else if (energies_e > 17) { +- energies_e_add = energies_e - 17; +- energies_e = 17; +- } else { +- energies_e_add = 0; +- } +- +- /* compensate scaling differences between scaleEnergies[0] and +- * scaleEnergies[1] */ +- prevEnergies_e_diff = scaleEnergies[0] - +- fMin(scaleEnergies[0], scaleEnergies[1]) + +- energies_e_add + NRG_SHIFT; +- newEnergies_e_diff = scaleEnergies[1] - +- fMin(scaleEnergies[0], scaleEnergies[1]) + +- energies_e_add + NRG_SHIFT; +- +- prevEnergies_e_diff = fMin(prevEnergies_e_diff, DFRACT_BITS - 1); +- newEnergies_e_diff = fMin(newEnergies_e_diff, DFRACT_BITS - 1); +- +- for (i = start; i < YBufferWriteOffset; i++) { +- energies_e_diff[i] = prevEnergies_e_diff; +- } +- for (i = YBufferWriteOffset; i < stop; i++) { +- energies_e_diff[i] = newEnergies_e_diff; +- } +- +- /* Sum up energies of all QMF-timeslots for both halfs */ +- FDK_ASSERT(len1 <= 8); /* otherwise an overflow is possible */ +- FDK_ASSERT(len2 <= 8); /* otherwise an overflow is possible */ +- +- for (j = 0; j < nSfb; j++) { +- FIXP_DBL accu1 = FL2FXCONST_DBL(0.f); +- FIXP_DBL accu2 = FL2FXCONST_DBL(0.f); +- accu_e = energies_e + 3; +- +- /* Sum up energies in first half */ +- for (i = start; i < border; i++) { +- accu1 += scaleValue(Energies[i][j], -energies_e_diff[i]); +- } +- +- /* Sum up energies in second half */ +- for (i = border; i < stop; i++) { +- accu2 += scaleValue(Energies[i][j], -energies_e_diff[i]); +- } +- +- /* Ensure certain energy to prevent division by zero and to prevent +- * splitting for very low levels */ +- accu1 = fMax(accu1, (FIXP_DBL)len1); +- accu2 = fMax(accu2, (FIXP_DBL)len2); +- +-/* Energy change in current band */ +-#define LN2 FL2FXCONST_DBL(0.6931471806f) /* ln(2) */ +- tmp0 = fLog2(accu2, accu_e) - fLog2(accu1, accu_e); +- tmp1 = fLog2((FIXP_DBL)len1, 31) - fLog2((FIXP_DBL)len2, 31); +- delta = fMult(LN2, (tmp0 + tmp1)); +- delta = (FIXP_DBL)fAbs(delta); +- +- /* Weighting with amplitude ratio of this band */ +- accu_e++; /* scale at least one bit due to (accu1+accu2) */ +- accu1 >>= 1; +- accu2 >>= 1; +- +- if (accu_e & 1) { +- accu_e++; /* for a defined square result exponent, the exponent has to be +- even */ +- accu1 >>= 1; +- accu2 >>= 1; +- } +- +- delta_sum += fMult(sqrtFixp(accu1 + accu2), delta); +- *result_e = ((accu_e >> 1) + LD_DATA_SHIFT); +- } +- +- if (energyTotal_e & 1) { +- energyTotal_e += 1; /* for a defined square result exponent, the exponent +- has to be even */ +- EnergyTotal >>= 1; +- } +- +- delta_sum = fMult(delta_sum, invSqrtNorm2(EnergyTotal, &tmp_e)); +- *result_e = *result_e + (tmp_e - (energyTotal_e >> 1)); +- +- return fMult(delta_sum, pos_weight); +-} +- +-/******************************************************************************* +- Functionname: addLowbandEnergies +- ******************************************************************************* +- \brief Calculates total lowband energy +- +- The input values Energies[0] (low-band) are scaled by the factor +- 2^(14-*scaleEnergies[0]) +- The input values Energies[1] (high-band) are scaled by the factor +- 2^(14-*scaleEnergies[1]) +- +- \return total energy in the lowband, scaled by the factor 2^19 +-*******************************************************************************/ +-static FIXP_DBL addLowbandEnergies(FIXP_DBL **Energies, int *scaleEnergies, +- int YBufferWriteOffset, int nrgSzShift, +- int tran_off, UCHAR *freqBandTable, +- int slots) { +- INT nrgTotal_e; +- FIXP_DBL nrgTotal_m; +- FIXP_DBL accu1 = FL2FXCONST_DBL(0.0f); +- FIXP_DBL accu2 = FL2FXCONST_DBL(0.0f); +- int tran_offdiv2 = tran_off >> nrgSzShift; +- const int sc1 = +- DFRACT_BITS - +- fNormz((FIXP_DBL)fMax( +- 1, (freqBandTable[0] * (YBufferWriteOffset - tran_offdiv2) - 1))); +- const int sc2 = +- DFRACT_BITS - +- fNormz((FIXP_DBL)fMax( +- 1, (freqBandTable[0] * +- (tran_offdiv2 + (slots >> nrgSzShift) - YBufferWriteOffset) - +- 1))); +- int ts, k; +- +- /* Sum up lowband energy from one frame at offset tran_off */ +- /* freqBandTable[LORES] has MAX_FREQ_COEFFS/2 +1 coeefs max. */ +- for (ts = tran_offdiv2; ts < YBufferWriteOffset; ts++) { +- for (k = 0; k < freqBandTable[0]; k++) { +- accu1 += Energies[ts][k] >> sc1; +- } +- } +- for (; ts < tran_offdiv2 + (slots >> nrgSzShift); ts++) { +- for (k = 0; k < freqBandTable[0]; k++) { +- accu2 += Energies[ts][k] >> sc2; +- } +- } +- +- nrgTotal_m = fAddNorm(accu1, (sc1 - 5) - scaleEnergies[0], accu2, +- (sc2 - 5) - scaleEnergies[1], &nrgTotal_e); +- nrgTotal_m = scaleValueSaturate(nrgTotal_m, nrgTotal_e); +- +- return (nrgTotal_m); +-} +- +-/******************************************************************************* +- Functionname: addHighbandEnergies +- ******************************************************************************* +- \brief Add highband energies +- +- Highband energies are mapped to an array with smaller dimension: +- Its time resolution is only 1 SBR-timeslot and its frequency resolution +- is 1 SBR-band. Therefore the data to be fed into the spectralChange +- function is reduced. +- +- The values EnergiesM are scaled by the factor (2^19-scaleEnergies[0]) for +- slots=YBufferWriteOffset. +- +- \return total energy in the highband, scaled by factor 2^19 +-*******************************************************************************/ +- +-static FIXP_DBL addHighbandEnergies( +- FIXP_DBL **RESTRICT Energies, /*!< input */ +- INT *scaleEnergies, INT YBufferWriteOffset, +- FIXP_DBL EnergiesM[NUMBER_TIME_SLOTS_2304] +- [MAX_FREQ_COEFFS], /*!< Combined output */ +- UCHAR *RESTRICT freqBandTable, INT nSfb, INT sbrSlots, INT timeStep) { +- INT i, j, k, slotIn, slotOut, scale[2]; +- INT li, ui; +- FIXP_DBL nrgTotal; +- FIXP_DBL accu = FL2FXCONST_DBL(0.0f); +- +- /* Combine QMF-timeslots to SBR-timeslots, +- combine QMF-bands to SBR-bands, +- combine Left and Right channel */ +- for (slotOut = 0; slotOut < sbrSlots; slotOut++) { +- /* Note: Below slotIn = slotOut and not slotIn = timeStep*slotOut +- because the Energies[] time resolution is always the SBR slot resolution +- regardless of the timeStep. */ +- slotIn = slotOut; +- +- for (j = 0; j < nSfb; j++) { +- accu = FL2FXCONST_DBL(0.0f); +- +- li = freqBandTable[j]; +- ui = freqBandTable[j + 1]; +- +- for (k = li; k < ui; k++) { +- for (i = 0; i < timeStep; i++) { +- accu += Energies[slotIn][k] >> 5; +- } +- } +- EnergiesM[slotOut][j] = accu; +- } +- } +- +- /* scale energies down before add up */ +- scale[0] = fixMin(8, scaleEnergies[0]); +- scale[1] = fixMin(8, scaleEnergies[1]); +- +- if ((scaleEnergies[0] - scale[0]) > (DFRACT_BITS - 1) || +- (scaleEnergies[1] - scale[1]) > (DFRACT_BITS - 1)) +- nrgTotal = FL2FXCONST_DBL(0.0f); +- else { +- /* Now add all energies */ +- accu = FL2FXCONST_DBL(0.0f); +- +- for (slotOut = 0; slotOut < YBufferWriteOffset; slotOut++) { +- for (j = 0; j < nSfb; j++) { +- accu += (EnergiesM[slotOut][j] >> scale[0]); +- } +- } +- nrgTotal = accu >> (scaleEnergies[0] - scale[0]); +- +- for (slotOut = YBufferWriteOffset; slotOut < sbrSlots; slotOut++) { +- for (j = 0; j < nSfb; j++) { +- accu += (EnergiesM[slotOut][j] >> scale[0]); +- } +- } +- nrgTotal = fAddSaturate(nrgTotal, accu >> (scaleEnergies[1] - scale[1])); +- } +- +- return (nrgTotal); +-} +- +-/******************************************************************************* +- Functionname: FDKsbrEnc_frameSplitter +- ******************************************************************************* +- \brief Decides if a FIXFIX-frame shall be splitted into 2 envelopes +- +- If no transient has been detected before, the frame can still be splitted +- into 2 envelopes. +-*******************************************************************************/ +-void FDKsbrEnc_frameSplitter( +- FIXP_DBL **Energies, INT *scaleEnergies, +- HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, UCHAR *freqBandTable, +- UCHAR *tran_vector, int YBufferWriteOffset, int YBufferSzShift, int nSfb, +- int timeStep, int no_cols, FIXP_DBL *tonality) { +- if (tran_vector[1] == 0) /* no transient was detected */ +- { +- FIXP_DBL delta; +- INT delta_e; +- FIXP_DBL(*EnergiesM)[MAX_FREQ_COEFFS]; +- FIXP_DBL EnergyTotal, newLowbandEnergy, newHighbandEnergy; +- INT border; +- INT sbrSlots = fMultI(GetInvInt(timeStep), no_cols); +- C_ALLOC_SCRATCH_START(_EnergiesM, FIXP_DBL, +- NUMBER_TIME_SLOTS_2304 * MAX_FREQ_COEFFS) +- +- FDK_ASSERT(sbrSlots * timeStep == no_cols); +- +- EnergiesM = (FIXP_DBL(*)[MAX_FREQ_COEFFS])_EnergiesM; +- +- /* +- Get Lowband-energy over a range of 2 frames (Look half a frame back and +- ahead). +- */ +- newLowbandEnergy = addLowbandEnergies( +- Energies, scaleEnergies, YBufferWriteOffset, YBufferSzShift, +- h_sbrTransientDetector->tran_off, freqBandTable, no_cols); +- +- newHighbandEnergy = +- addHighbandEnergies(Energies, scaleEnergies, YBufferWriteOffset, +- EnergiesM, freqBandTable, nSfb, sbrSlots, timeStep); +- +- { +- /* prevLowBandEnergy: Corresponds to 1 frame, starting with half a frame +- look-behind newLowbandEnergy: Corresponds to 1 frame, starting in the +- middle of the current frame */ +- EnergyTotal = (newLowbandEnergy >> 1) + +- (h_sbrTransientDetector->prevLowBandEnergy >> +- 1); /* mean of new and prev LB NRG */ +- EnergyTotal = +- fAddSaturate(EnergyTotal, newHighbandEnergy); /* Add HB NRG */ +- /* The below border should specify the same position as the middle border +- of a FIXFIX-frame with 2 envelopes. */ +- border = (sbrSlots + 1) >> 1; +- +- if ((INT)EnergyTotal & 0xffffffe0 && +- (scaleEnergies[0] < 32 || scaleEnergies[1] < 32)) /* i.e. > 31 */ { +- delta = spectralChange(EnergiesM, scaleEnergies, EnergyTotal, nSfb, 0, +- border, YBufferWriteOffset, sbrSlots, &delta_e); +- } else { +- delta = FL2FXCONST_DBL(0.0f); +- delta_e = 0; +- +- /* set tonality to 0 when energy is very low, since the amplitude +- resolution should then be low as well */ +- *tonality = FL2FXCONST_DBL(0.0f); +- } +- +- if (fIsLessThan(h_sbrTransientDetector->split_thr_m, +- h_sbrTransientDetector->split_thr_e, delta, delta_e)) { +- tran_vector[0] = 1; /* Set flag for splitting */ +- } else { +- tran_vector[0] = 0; +- } +- } +- +- /* Update prevLowBandEnergy */ +- h_sbrTransientDetector->prevLowBandEnergy = newLowbandEnergy; +- h_sbrTransientDetector->prevHighBandEnergy = newHighbandEnergy; +- C_ALLOC_SCRATCH_END(_EnergiesM, FIXP_DBL, +- NUMBER_TIME_SLOTS_2304 * MAX_FREQ_COEFFS) +- } +-} +- +-/* +- * Calculate transient energy threshold for each QMF band +- */ +-static void calculateThresholds(FIXP_DBL **RESTRICT Energies, +- INT *RESTRICT scaleEnergies, +- FIXP_DBL *RESTRICT thresholds, +- int YBufferWriteOffset, int YBufferSzShift, +- int noCols, int noRows, int tran_off) { +- FIXP_DBL mean_val, std_val, temp; +- FIXP_DBL i_noCols; +- FIXP_DBL i_noCols1; +- FIXP_DBL accu, accu0, accu1; +- int scaleFactor0, scaleFactor1, commonScale; +- int i, j; +- +- i_noCols = GetInvInt(noCols + tran_off) << YBufferSzShift; +- i_noCols1 = GetInvInt(noCols + tran_off - 1) << YBufferSzShift; +- +- /* calc minimum scale of energies of previous and current frame */ +- commonScale = fixMin(scaleEnergies[0], scaleEnergies[1]); +- +- /* calc scalefactors to adapt energies to common scale */ +- scaleFactor0 = fixMin((scaleEnergies[0] - commonScale), (DFRACT_BITS - 1)); +- scaleFactor1 = fixMin((scaleEnergies[1] - commonScale), (DFRACT_BITS - 1)); +- +- FDK_ASSERT((scaleFactor0 >= 0) && (scaleFactor1 >= 0)); +- +- /* calculate standard deviation in every subband */ +- for (i = 0; i < noRows; i++) { +- int startEnergy = (tran_off >> YBufferSzShift); +- int endEnergy = ((noCols >> YBufferSzShift) + tran_off); +- int shift; +- +- /* calculate mean value over decimated energy values (downsampled by 2). */ +- accu0 = accu1 = FL2FXCONST_DBL(0.0f); +- +- for (j = startEnergy; j < YBufferWriteOffset; j++) +- accu0 = fMultAddDiv2(accu0, Energies[j][i], i_noCols); +- for (; j < endEnergy; j++) +- accu1 = fMultAddDiv2(accu1, Energies[j][i], i_noCols); +- +- mean_val = ((accu0 << 1) >> scaleFactor0) + +- ((accu1 << 1) >> scaleFactor1); /* average */ +- shift = fixMax( +- 0, CountLeadingBits(mean_val) - +- 6); /* -6 to keep room for accumulating upto N = 24 values */ +- +- /* calculate standard deviation */ +- accu = FL2FXCONST_DBL(0.0f); +- +- /* summe { ((mean_val-nrg)^2) * i_noCols1 } */ +- for (j = startEnergy; j < YBufferWriteOffset; j++) { +- temp = ((FIXP_DBL)mean_val - ((FIXP_DBL)Energies[j][i] >> scaleFactor0)) +- << shift; +- temp = fPow2Div2(temp); +- accu = fMultAddDiv2(accu, temp, i_noCols1); +- } +- for (; j < endEnergy; j++) { +- temp = ((FIXP_DBL)mean_val - ((FIXP_DBL)Energies[j][i] >> scaleFactor1)) +- << shift; +- temp = fPow2Div2(temp); +- accu = fMultAddDiv2(accu, temp, i_noCols1); +- } +- accu <<= 2; +- std_val = sqrtFixp(accu) >> shift; /* standard deviation */ +- +- /* +- Take new threshold as average of calculated standard deviation ratio +- and old threshold if greater than absolute threshold +- */ +- temp = (commonScale <= (DFRACT_BITS - 1)) +- ? fMult(FL2FXCONST_DBL(0.66f), thresholds[i]) + +- (fMult(FL2FXCONST_DBL(0.34f), std_val) >> commonScale) +- : (FIXP_DBL)0; +- +- thresholds[i] = fixMax(ABS_THRES, temp); +- +- FDK_ASSERT(commonScale >= 0); +- } +-} +- +-/* +- * Calculate transient levels for each QMF time slot. +- */ +-static void extractTransientCandidates( +- FIXP_DBL **RESTRICT Energies, INT *RESTRICT scaleEnergies, +- FIXP_DBL *RESTRICT thresholds, FIXP_DBL *RESTRICT transients, +- int YBufferWriteOffset, int YBufferSzShift, int noCols, int start_band, +- int stop_band, int tran_off, int addPrevSamples) { +- FIXP_DBL i_thres; +- C_ALLOC_SCRATCH_START(EnergiesTemp, FIXP_DBL, 2 * 32) +- int tmpScaleEnergies0, tmpScaleEnergies1; +- int endCond; +- int startEnerg, endEnerg; +- int i, j, jIndex, jpBM; +- +- tmpScaleEnergies0 = scaleEnergies[0]; +- tmpScaleEnergies1 = scaleEnergies[1]; +- +- /* Scale value for first energies, upto YBufferWriteOffset */ +- tmpScaleEnergies0 = fixMin(tmpScaleEnergies0, MAX_SHIFT_DBL); +- /* Scale value for first energies, from YBufferWriteOffset upwards */ +- tmpScaleEnergies1 = fixMin(tmpScaleEnergies1, MAX_SHIFT_DBL); +- +- FDK_ASSERT((tmpScaleEnergies0 >= 0) && (tmpScaleEnergies1 >= 0)); +- +- /* Keep addPrevSamples extra previous transient candidates. */ +- FDKmemmove(transients, transients + noCols - addPrevSamples, +- (tran_off + addPrevSamples) * sizeof(FIXP_DBL)); +- FDKmemclear(transients + tran_off + addPrevSamples, +- noCols * sizeof(FIXP_DBL)); +- +- endCond = noCols; /* Amount of new transient values to be calculated. */ +- startEnerg = (tran_off - 3) >> YBufferSzShift; /* >>YBufferSzShift because of +- amount of energy values. -3 +- because of neighbors being +- watched. */ +- endEnerg = +- ((noCols + (YBufferWriteOffset << YBufferSzShift)) - 1) >> +- YBufferSzShift; /* YBufferSzShift shifts because of half energy values. */ +- +- /* Compute differential values with two different weightings in every subband +- */ +- for (i = start_band; i < stop_band; i++) { +- FIXP_DBL thres = thresholds[i]; +- +- if ((LONG)thresholds[i] >= 256) +- i_thres = (LONG)((LONG)MAXVAL_DBL / ((((LONG)thresholds[i])) + 1)) +- << (32 - 24); +- else +- i_thres = (LONG)MAXVAL_DBL; +- +- /* Copy one timeslot and de-scale and de-squish */ +- if (YBufferSzShift == 1) { +- for (j = startEnerg; j < YBufferWriteOffset; j++) { +- FIXP_DBL tmp = Energies[j][i]; +- EnergiesTemp[(j << 1) + 1] = EnergiesTemp[j << 1] = +- tmp >> tmpScaleEnergies0; +- } +- for (; j <= endEnerg; j++) { +- FIXP_DBL tmp = Energies[j][i]; +- EnergiesTemp[(j << 1) + 1] = EnergiesTemp[j << 1] = +- tmp >> tmpScaleEnergies1; +- } +- } else { +- for (j = startEnerg; j < YBufferWriteOffset; j++) { +- FIXP_DBL tmp = Energies[j][i]; +- EnergiesTemp[j] = tmp >> tmpScaleEnergies0; +- } +- for (; j <= endEnerg; j++) { +- FIXP_DBL tmp = Energies[j][i]; +- EnergiesTemp[j] = tmp >> tmpScaleEnergies1; +- } +- } +- +- /* Detect peaks in energy values. */ +- +- jIndex = tran_off; +- jpBM = jIndex + addPrevSamples; +- +- for (j = endCond; j--; jIndex++, jpBM++) { +- FIXP_DBL delta, tran; +- int d; +- +- delta = (FIXP_DBL)0; +- tran = (FIXP_DBL)0; +- +- for (d = 1; d < 4; d++) { +- delta += EnergiesTemp[jIndex + d]; /* R */ +- delta -= EnergiesTemp[jIndex - d]; /* L */ +- delta -= thres; +- +- if (delta > (FIXP_DBL)0) { +- tran = fMultAddDiv2(tran, i_thres, delta); +- } +- } +- transients[jpBM] += (tran << 1); +- } +- } +- C_ALLOC_SCRATCH_END(EnergiesTemp, FIXP_DBL, 2 * 32) +-} +- +-void FDKsbrEnc_transientDetect(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTran, +- FIXP_DBL **Energies, INT *scaleEnergies, +- UCHAR *transient_info, int YBufferWriteOffset, +- int YBufferSzShift, int timeStep, +- int frameMiddleBorder) { +- int no_cols = h_sbrTran->no_cols; +- int qmfStartSample; +- int addPrevSamples; +- int timeStepShift = 0; +- int i, cond; +- +- /* Where to start looking for transients in the transient candidate buffer */ +- qmfStartSample = timeStep * frameMiddleBorder; +- /* We need to look one value backwards in the transients, so we might need one +- * more previous value. */ +- addPrevSamples = (qmfStartSample > 0) ? 0 : 1; +- +- switch (timeStep) { +- case 1: +- timeStepShift = 0; +- break; +- case 2: +- timeStepShift = 1; +- break; +- case 4: +- timeStepShift = 2; +- break; +- } +- +- calculateThresholds(Energies, scaleEnergies, h_sbrTran->thresholds, +- YBufferWriteOffset, YBufferSzShift, h_sbrTran->no_cols, +- h_sbrTran->no_rows, h_sbrTran->tran_off); +- +- extractTransientCandidates( +- Energies, scaleEnergies, h_sbrTran->thresholds, h_sbrTran->transients, +- YBufferWriteOffset, YBufferSzShift, h_sbrTran->no_cols, 0, +- h_sbrTran->no_rows, h_sbrTran->tran_off, addPrevSamples); +- +- transient_info[0] = 0; +- transient_info[1] = 0; +- transient_info[2] = 0; +- +- /* Offset by the amount of additional previous transient candidates being +- * kept. */ +- qmfStartSample += addPrevSamples; +- +- /* Check for transients in second granule (pick the last value of subsequent +- * values) */ +- for (i = qmfStartSample; i < qmfStartSample + no_cols; i++) { +- cond = (h_sbrTran->transients[i] < +- fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1])) && +- (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); +- +- if (cond) { +- transient_info[0] = (i - qmfStartSample) >> timeStepShift; +- transient_info[1] = 1; +- break; +- } +- } +- +- if (h_sbrTran->frameShift != 0) { +- /* transient prediction for LDSBR */ +- /* Check for transients in first qmf-slots of second frame */ +- for (i = qmfStartSample + no_cols; +- i < qmfStartSample + no_cols + h_sbrTran->frameShift; i++) { +- cond = (h_sbrTran->transients[i] < +- fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1])) && +- (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); +- +- if (cond) { +- int pos = (int)((i - qmfStartSample - no_cols) >> timeStepShift); +- if ((pos < 3) && (transient_info[1] == 0)) { +- transient_info[2] = 1; +- } +- break; +- } +- } +- } +-} +- +-int FDKsbrEnc_InitSbrTransientDetector( +- HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, +- UINT sbrSyntaxFlags, /* SBR syntax flags derived from AOT. */ +- INT frameSize, INT sampleFreq, sbrConfigurationPtr params, int tran_fc, +- int no_cols, int no_rows, int YBufferWriteOffset, int YBufferSzShift, +- int frameShift, int tran_off) { +- INT totalBitrate = +- params->codecSettings.standardBitrate * params->codecSettings.nChannels; +- INT codecBitrate = params->codecSettings.bitRate; +- FIXP_DBL bitrateFactor_m, framedur_fix; +- INT bitrateFactor_e, tmp_e; +- +- FDKmemclear(h_sbrTransientDetector, sizeof(SBR_TRANSIENT_DETECTOR)); +- +- h_sbrTransientDetector->frameShift = frameShift; +- h_sbrTransientDetector->tran_off = tran_off; +- +- if (codecBitrate) { +- bitrateFactor_m = fDivNorm((FIXP_DBL)totalBitrate, +- (FIXP_DBL)(codecBitrate << 2), &bitrateFactor_e); +- bitrateFactor_e += 2; +- } else { +- bitrateFactor_m = FL2FXCONST_DBL(1.0 / 4.0); +- bitrateFactor_e = 2; +- } +- +- framedur_fix = fDivNorm(frameSize, sampleFreq); +- +- /* The longer the frames, the more often should the FIXFIX- +- case transmit 2 envelopes instead of 1. +- Frame durations below 10 ms produce the highest threshold +- so that practically always only 1 env is transmitted. */ +- FIXP_DBL tmp = framedur_fix - FL2FXCONST_DBL(0.010); +- +- tmp = fixMax(tmp, FL2FXCONST_DBL(0.0001)); +- tmp = fDivNorm(FL2FXCONST_DBL(0.000075), fPow2(tmp), &tmp_e); +- +- bitrateFactor_e = (tmp_e + bitrateFactor_e); +- +- if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { +- bitrateFactor_e--; /* divide by 2 */ +- } +- +- FDK_ASSERT(no_cols <= 32); +- FDK_ASSERT(no_rows <= 64); +- +- h_sbrTransientDetector->no_cols = no_cols; +- h_sbrTransientDetector->tran_thr = +- (FIXP_DBL)((params->tran_thr << (32 - 24 - 1)) / no_rows); +- h_sbrTransientDetector->tran_fc = tran_fc; +- h_sbrTransientDetector->split_thr_m = fMult(tmp, bitrateFactor_m); +- h_sbrTransientDetector->split_thr_e = bitrateFactor_e; +- h_sbrTransientDetector->no_rows = no_rows; +- h_sbrTransientDetector->mode = params->tran_det_mode; +- h_sbrTransientDetector->prevLowBandEnergy = FL2FXCONST_DBL(0.0f); +- +- return (0); +-} +- +-#define ENERGY_SCALING_SIZE 32 +- +-INT FDKsbrEnc_InitSbrFastTransientDetector( +- HANDLE_FAST_TRAN_DET h_sbrFastTransientDetector, +- const INT time_slots_per_frame, const INT bandwidth_qmf_slot, +- const INT no_qmf_channels, const INT sbr_qmf_1st_band) { +- int i; +- int buff_size; +- FIXP_DBL myExp; +- FIXP_DBL myExpSlot; +- +- h_sbrFastTransientDetector->lookahead = TRAN_DET_LOOKAHEAD; +- h_sbrFastTransientDetector->nTimeSlots = time_slots_per_frame; +- +- buff_size = h_sbrFastTransientDetector->nTimeSlots + +- h_sbrFastTransientDetector->lookahead; +- +- for (i = 0; i < buff_size; i++) { +- h_sbrFastTransientDetector->delta_energy[i] = FL2FXCONST_DBL(0.0f); +- h_sbrFastTransientDetector->energy_timeSlots[i] = FL2FXCONST_DBL(0.0f); +- h_sbrFastTransientDetector->lowpass_energy[i] = FL2FXCONST_DBL(0.0f); +- h_sbrFastTransientDetector->transientCandidates[i] = 0; +- } +- +- FDK_ASSERT(bandwidth_qmf_slot > 0.f); +- h_sbrFastTransientDetector->stopBand = +- fMin(TRAN_DET_STOP_FREQ / bandwidth_qmf_slot, no_qmf_channels); +- h_sbrFastTransientDetector->startBand = +- fMin(sbr_qmf_1st_band, +- h_sbrFastTransientDetector->stopBand - TRAN_DET_MIN_QMFBANDS); +- +- FDK_ASSERT(h_sbrFastTransientDetector->startBand < no_qmf_channels); +- FDK_ASSERT(h_sbrFastTransientDetector->startBand < +- h_sbrFastTransientDetector->stopBand); +- FDK_ASSERT(h_sbrFastTransientDetector->startBand > 1); +- FDK_ASSERT(h_sbrFastTransientDetector->stopBand > 1); +- +- /* the energy weighting and adding up has a headroom of 6 Bits, +- so up to 64 bands can be added without potential overflow. */ +- FDK_ASSERT(h_sbrFastTransientDetector->stopBand - +- h_sbrFastTransientDetector->startBand <= +- 64); +- +-/* QMF_HP_dB_SLOPE_FIX says that we want a 20 dB per 16 kHz HP filter. +- The following lines map this to the QMF bandwidth. */ +-#define EXP_E 7 /* 64 (=64) multiplications max, max. allowed sum is 0.5 */ +- myExp = fMultNorm(QMF_HP_dBd_SLOPE_FIX, 0, (FIXP_DBL)bandwidth_qmf_slot, +- DFRACT_BITS - 1, EXP_E); +- myExpSlot = myExp; +- +- for (i = 0; i < 64; i++) { +- /* Calculate dBf over all qmf bands: +- dBf = (10^(0.002266f/10*bw(slot)))^(band) = +- = 2^(log2(10)*0.002266f/10*bw(slot)*band) = +- = 2^(0.00075275f*bw(slot)*band) */ +- +- FIXP_DBL dBf_m; /* dBf mantissa */ +- INT dBf_e; /* dBf exponent */ +- INT tmp; +- +- INT dBf_int; /* dBf integer part */ +- FIXP_DBL dBf_fract; /* dBf fractional part */ +- +- /* myExp*(i+1) = myExp_int - myExp_fract +- myExp*(i+1) is split up here for better accuracy of CalcInvLdData(), +- for its result can be split up into an integer and a fractional part */ +- +- /* Round up to next integer */ +- FIXP_DBL myExp_int = +- (myExpSlot & (FIXP_DBL)0xfe000000) + (FIXP_DBL)0x02000000; +- +- /* This is the fractional part that needs to be substracted */ +- FIXP_DBL myExp_fract = myExp_int - myExpSlot; +- +- /* Calc integer part */ +- dBf_int = CalcInvLdData(myExp_int); +- /* The result needs to be re-scaled. The ld(myExp_int) had been scaled by +- EXP_E, the CalcInvLdData expects the operand to be scaled by +- LD_DATA_SHIFT. Therefore, the correctly scaled result is +- dBf_int^(2^(EXP_E-LD_DATA_SHIFT)), which is dBf_int^2 */ +- +- if (dBf_int <= +- 46340) { /* compare with maximum allowed value for signed integer +- multiplication, 46340 = +- (INT)floor(sqrt((double)(((UINT)1<<(DFRACT_BITS-1))-1))) */ +- dBf_int *= dBf_int; +- +- /* Calc fractional part */ +- dBf_fract = CalcInvLdData(-myExp_fract); +- /* The result needs to be re-scaled. The ld(myExp_fract) had been scaled +- by EXP_E, the CalcInvLdData expects the operand to be scaled by +- LD_DATA_SHIFT. Therefore, the correctly scaled result is +- dBf_fract^(2^(EXP_E-LD_DATA_SHIFT)), which is dBf_fract^2 */ +- dBf_fract = fMultNorm(dBf_fract, dBf_fract, &tmp); +- +- /* Get worst case scaling of multiplication result */ +- dBf_e = (DFRACT_BITS - 1 - tmp) - CountLeadingBits(dBf_int); +- +- /* Now multiply integer with fractional part of the result, thus resulting +- in the overall accurate fractional result */ +- dBf_m = fMultNorm(dBf_int, DFRACT_BITS - 1, dBf_fract, tmp, dBf_e); +- +- myExpSlot += myExp; +- } else { +- dBf_m = (FIXP_DBL)0; +- dBf_e = 0; +- } +- +- /* Keep the results */ +- h_sbrFastTransientDetector->dBf_m[i] = dBf_m; +- h_sbrFastTransientDetector->dBf_e[i] = dBf_e; +- } +- +- /* Make sure that dBf is greater than 1.0 (because it should be a highpass) */ +- /* ... */ +- +- return 0; +-} +- +-void FDKsbrEnc_fastTransientDetect( +- const HANDLE_FAST_TRAN_DET h_sbrFastTransientDetector, +- const FIXP_DBL *const *Energies, const int *const scaleEnergies, +- const INT YBufferWriteOffset, UCHAR *const tran_vector) { +- int timeSlot, band; +- +- FIXP_DBL max_delta_energy; /* helper to store maximum energy ratio */ +- int max_delta_energy_scale; /* helper to store scale of maximum energy ratio +- */ +- int ind_max = 0; /* helper to store index of maximum energy ratio */ +- int isTransientInFrame = 0; +- +- const int nTimeSlots = h_sbrFastTransientDetector->nTimeSlots; +- const int lookahead = h_sbrFastTransientDetector->lookahead; +- const int startBand = h_sbrFastTransientDetector->startBand; +- const int stopBand = h_sbrFastTransientDetector->stopBand; +- +- int *transientCandidates = h_sbrFastTransientDetector->transientCandidates; +- +- FIXP_DBL *energy_timeSlots = h_sbrFastTransientDetector->energy_timeSlots; +- int *energy_timeSlots_scale = +- h_sbrFastTransientDetector->energy_timeSlots_scale; +- +- FIXP_DBL *delta_energy = h_sbrFastTransientDetector->delta_energy; +- int *delta_energy_scale = h_sbrFastTransientDetector->delta_energy_scale; +- +- const FIXP_DBL thr = TRAN_DET_THRSHLD; +- const INT thr_scale = TRAN_DET_THRSHLD_SCALE; +- +- /*reset transient info*/ +- tran_vector[2] = 0; +- +- /* reset transient candidates */ +- FDKmemclear(transientCandidates + lookahead, nTimeSlots * sizeof(int)); +- +- for (timeSlot = lookahead; timeSlot < nTimeSlots + lookahead; timeSlot++) { +- int i, norm; +- FIXP_DBL tmpE = FL2FXCONST_DBL(0.0f); +- int headroomEnSlot = DFRACT_BITS - 1; +- +- FIXP_DBL smallNRG = FL2FXCONST_DBL(1e-2f); +- FIXP_DBL denominator; +- INT denominator_scale; +- +- /* determine minimum headroom of energy values for this timeslot */ +- for (band = startBand; band < stopBand; band++) { +- int tmp_headroom = fNormz(Energies[timeSlot][band]) - 1; +- if (tmp_headroom < headroomEnSlot) { +- headroomEnSlot = tmp_headroom; +- } +- } +- +- for (i = 0, band = startBand; band < stopBand; band++, i++) { +- /* energy is weighted by weightingfactor stored in dBf_m array */ +- /* dBf_m index runs from 0 to stopBand-startband */ +- /* energy shifted by calculated headroom for maximum precision */ +- FIXP_DBL weightedEnergy = +- fMult(Energies[timeSlot][band] << headroomEnSlot, +- h_sbrFastTransientDetector->dBf_m[i]); +- +- /* energy is added up */ +- /* shift by 6 to have a headroom for maximum 64 additions */ +- /* shift by dBf_e to handle weighting factor dependent scale factors */ +- tmpE += +- weightedEnergy >> (6 + (10 - h_sbrFastTransientDetector->dBf_e[i])); +- } +- +- /* store calculated energy for timeslot */ +- energy_timeSlots[timeSlot] = tmpE; +- +- /* calculate overall scale factor for energy of this timeslot */ +- /* = original scale factor of energies +- * (-scaleEnergies[0]+2*QMF_SCALE_OFFSET or +- * -scaleEnergies[1]+2*QMF_SCALE_OFFSET */ +- /* depending on YBufferWriteOffset) */ +- /* + weighting factor scale (10) */ +- /* + adding up scale factor ( 6) */ +- /* - headroom of energy value (headroomEnSlot) */ +- if (timeSlot < YBufferWriteOffset) { +- energy_timeSlots_scale[timeSlot] = +- (-scaleEnergies[0] + 2 * QMF_SCALE_OFFSET) + (10 + 6) - +- headroomEnSlot; +- } else { +- energy_timeSlots_scale[timeSlot] = +- (-scaleEnergies[1] + 2 * QMF_SCALE_OFFSET) + (10 + 6) - +- headroomEnSlot; +- } +- +- /* Add a small energy to the denominator, thus making the transient +- detection energy-dependent. Loud transients are being detected, +- silent ones not. */ +- +- /* make sure that smallNRG does not overflow */ +- if (-energy_timeSlots_scale[timeSlot - 1] + 1 > 5) { +- denominator = smallNRG; +- denominator_scale = 0; +- } else { +- /* Leave an additional headroom of 1 bit for this addition. */ +- smallNRG = +- scaleValue(smallNRG, -(energy_timeSlots_scale[timeSlot - 1] + 1)); +- denominator = (energy_timeSlots[timeSlot - 1] >> 1) + smallNRG; +- denominator_scale = energy_timeSlots_scale[timeSlot - 1] + 1; +- } +- +- delta_energy[timeSlot] = +- fDivNorm(energy_timeSlots[timeSlot], denominator, &norm); +- delta_energy_scale[timeSlot] = +- energy_timeSlots_scale[timeSlot] - denominator_scale + norm; +- } +- +- /*get transient candidates*/ +- /* For every timeslot, check if delta(E) exceeds the threshold. If it did, +- it could potentially be marked as a transient candidate. However, the 2 +- slots before the current one must not be transients with an energy higher +- than 1.4*E(current). If both aren't transients or if the energy of the +- current timesolot is more than 1.4 times higher than the energy in the +- last or the one before the last slot, it is marked as a transient.*/ +- +- FDK_ASSERT(lookahead >= 2); +- for (timeSlot = lookahead; timeSlot < nTimeSlots + lookahead; timeSlot++) { +- FIXP_DBL energy_cur_slot_weighted = +- fMult(energy_timeSlots[timeSlot], FL2FXCONST_DBL(1.0f / 1.4f)); +- if (!fIsLessThan(delta_energy[timeSlot], delta_energy_scale[timeSlot], thr, +- thr_scale) && +- (((transientCandidates[timeSlot - 2] == 0) && +- (transientCandidates[timeSlot - 1] == 0)) || +- !fIsLessThan(energy_cur_slot_weighted, +- energy_timeSlots_scale[timeSlot], +- energy_timeSlots[timeSlot - 1], +- energy_timeSlots_scale[timeSlot - 1]) || +- !fIsLessThan(energy_cur_slot_weighted, +- energy_timeSlots_scale[timeSlot], +- energy_timeSlots[timeSlot - 2], +- energy_timeSlots_scale[timeSlot - 2]))) { +- /* in case of strong transients, subsequent +- * qmf slots might be recognized as transients. */ +- transientCandidates[timeSlot] = 1; +- } +- } +- +- /*get transient with max energy*/ +- max_delta_energy = FL2FXCONST_DBL(0.0f); +- max_delta_energy_scale = 0; +- ind_max = 0; +- isTransientInFrame = 0; +- for (timeSlot = 0; timeSlot < nTimeSlots; timeSlot++) { +- int scale = fMax(delta_energy_scale[timeSlot], max_delta_energy_scale); +- if (transientCandidates[timeSlot] && +- ((delta_energy[timeSlot] >> (scale - delta_energy_scale[timeSlot])) > +- (max_delta_energy >> (scale - max_delta_energy_scale)))) { +- max_delta_energy = delta_energy[timeSlot]; +- max_delta_energy_scale = scale; +- ind_max = timeSlot; +- isTransientInFrame = 1; +- } +- } +- +- /*from all transient candidates take the one with the biggest energy*/ +- if (isTransientInFrame) { +- tran_vector[0] = ind_max; +- tran_vector[1] = 1; +- } else { +- /*reset transient info*/ +- tran_vector[0] = tran_vector[1] = 0; +- } +- +- /*check for transients in lookahead*/ +- for (timeSlot = nTimeSlots; timeSlot < nTimeSlots + lookahead; timeSlot++) { +- if (transientCandidates[timeSlot]) { +- tran_vector[2] = 1; +- } +- } +- +- /*update buffers*/ +- for (timeSlot = 0; timeSlot < lookahead; timeSlot++) { +- transientCandidates[timeSlot] = transientCandidates[nTimeSlots + timeSlot]; +- +- /* fixpoint stuff */ +- energy_timeSlots[timeSlot] = energy_timeSlots[nTimeSlots + timeSlot]; +- energy_timeSlots_scale[timeSlot] = +- energy_timeSlots_scale[nTimeSlots + timeSlot]; +- +- delta_energy[timeSlot] = delta_energy[nTimeSlots + timeSlot]; +- delta_energy_scale[timeSlot] = delta_energy_scale[nTimeSlots + timeSlot]; +- } +-} +diff --git a/libSBRenc/src/tran_det.h b/libSBRenc/src/tran_det.h +deleted file mode 100644 +index d10a7db..0000000 +--- a/libSBRenc/src/tran_det.h ++++ /dev/null +@@ -1,191 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** SBR encoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Transient detector prototypes $Revision: 95111 $ +-*/ +-#ifndef TRAN_DET_H +-#define TRAN_DET_H +- +-#include "sbr_encoder.h" +-#include "sbr_def.h" +- +-typedef struct { +- FIXP_DBL transients[32 + (32 / 2)]; +- FIXP_DBL thresholds[64]; +- FIXP_DBL tran_thr; /* Master threshold for transient signals */ +- FIXP_DBL split_thr_m; /* Threshold for splitting FIXFIX-frames into 2 env */ +- INT split_thr_e; /* Scale for splitting threshold */ +- FIXP_DBL prevLowBandEnergy; /* Energy of low band */ +- FIXP_DBL prevHighBandEnergy; /* Energy of high band */ +- INT tran_fc; /* Number of lowband subbands to discard */ +- INT no_cols; +- INT no_rows; +- INT mode; +- +- int frameShift; +- int tran_off; /* Offset for reading energy values. */ +-} SBR_TRANSIENT_DETECTOR; +- +-typedef SBR_TRANSIENT_DETECTOR *HANDLE_SBR_TRANSIENT_DETECTOR; +- +-#define TRAN_DET_LOOKAHEAD 2 +-#define TRAN_DET_START_FREQ 4500 /*start frequency for transient detection*/ +-#define TRAN_DET_STOP_FREQ 13500 /*stop frequency for transient detection*/ +-#define TRAN_DET_MIN_QMFBANDS \ +- 4 /* minimum qmf bands for transient detection \ +- */ +-#define QMF_HP_dBd_SLOPE_FIX \ +- FL2FXCONST_DBL(0.00075275f) /* 0.002266f/10 * log2(10) */ +-#define TRAN_DET_THRSHLD FL2FXCONST_DBL(5.0f / 8.0f) +-#define TRAN_DET_THRSHLD_SCALE (3) +- +-typedef struct { +- INT transientCandidates[32 + TRAN_DET_LOOKAHEAD]; +- INT nTimeSlots; +- INT lookahead; +- INT startBand; +- INT stopBand; +- +- FIXP_DBL dBf_m[64]; +- INT dBf_e[64]; +- +- FIXP_DBL energy_timeSlots[32 + TRAN_DET_LOOKAHEAD]; +- INT energy_timeSlots_scale[32 + TRAN_DET_LOOKAHEAD]; +- +- FIXP_DBL delta_energy[32 + TRAN_DET_LOOKAHEAD]; +- INT delta_energy_scale[32 + TRAN_DET_LOOKAHEAD]; +- +- FIXP_DBL lowpass_energy[32 + TRAN_DET_LOOKAHEAD]; +- INT lowpass_energy_scale[32 + TRAN_DET_LOOKAHEAD]; +-} FAST_TRAN_DETECTOR; +-typedef FAST_TRAN_DETECTOR *HANDLE_FAST_TRAN_DET; +- +-INT FDKsbrEnc_InitSbrFastTransientDetector( +- HANDLE_FAST_TRAN_DET h_sbrFastTransientDetector, +- const INT time_slots_per_frame, const INT bandwidth_qmf_slot, +- const INT no_qmf_channels, const INT sbr_qmf_1st_band); +- +-void FDKsbrEnc_fastTransientDetect( +- const HANDLE_FAST_TRAN_DET h_sbrFastTransientDetector, +- const FIXP_DBL *const *Energies, const int *const scaleEnergies, +- const INT YBufferWriteOffset, UCHAR *const tran_vector); +- +-void FDKsbrEnc_transientDetect( +- HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, FIXP_DBL **Energies, +- INT *scaleEnergies, UCHAR *tran_vector, int YBufferWriteOffset, +- int YBufferSzShift, int timeStep, int frameMiddleBorder); +- +-int FDKsbrEnc_InitSbrTransientDetector( +- HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, +- UINT sbrSyntaxFlags, /* SBR syntax flags derived from AOT. */ +- INT frameSize, INT sampleFreq, sbrConfigurationPtr params, int tran_fc, +- int no_cols, int no_rows, int YBufferWriteOffset, int YBufferSzShift, +- int frameShift, int tran_off); +- +-void FDKsbrEnc_frameSplitter( +- FIXP_DBL **Energies, INT *scaleEnergies, +- HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, UCHAR *freqBandTable, +- UCHAR *tran_vector, int YBufferWriteOffset, int YBufferSzShift, int nSfb, +- int timeStep, int no_cols, FIXP_DBL *tonality); +-#endif +-- +cgit v1.1 + diff --git a/sound/fdk-aac/patches-free/020-remove-hcx-rvlc-error.patch b/sound/fdk-aac/patches-free/020-remove-hcx-rvlc-error.patch new file mode 100644 index 0000000000..aaeb759069 --- /dev/null +++ b/sound/fdk-aac/patches-free/020-remove-hcx-rvlc-error.patch @@ -0,0 +1,10233 @@ +From 022f1b86ef2f992c1c5623719e403b9b28e1becc Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Mon, 24 Jun 2019 16:26:20 +0200 +Subject: Remove HCR, RVLC, error concealment + +--- + Makefile.am | 7 - + Makefile.vc | 7 - + libAACdec/src/aac_ram.h | 3 - + libAACdec/src/aac_rom.cpp | 96 -- + libAACdec/src/aac_rom.h | 4 +- + libAACdec/src/aacdec_hcr.cpp | 1498 --------------------------- + libAACdec/src/aacdec_hcr.h | 128 --- + libAACdec/src/aacdec_hcr_bit.cpp | 164 --- + libAACdec/src/aacdec_hcr_bit.h | 114 --- + libAACdec/src/aacdec_hcr_types.h | 432 -------- + libAACdec/src/aacdec_hcrs.cpp | 1551 ---------------------------- + libAACdec/src/aacdec_hcrs.h | 176 ---- + libAACdec/src/aacdecoder.cpp | 91 +- + libAACdec/src/aacdecoder.h | 3 - + libAACdec/src/aacdecoder_lib.cpp | 73 +- + libAACdec/src/block.cpp | 59 +- + libAACdec/src/channel.cpp | 19 +- + libAACdec/src/channelinfo.h | 22 - + libAACdec/src/conceal.cpp | 2095 -------------------------------------- + libAACdec/src/conceal.h | 152 --- + libAACdec/src/conceal_types.h | 203 ---- + libAACdec/src/rvlc.cpp | 1217 ---------------------- + libAACdec/src/rvlc.h | 153 --- + libAACdec/src/rvlc_info.h | 204 ---- + libAACdec/src/rvlcbit.cpp | 148 --- + libAACdec/src/rvlcbit.h | 111 -- + libAACdec/src/rvlcconceal.cpp | 787 -------------- + libAACdec/src/rvlcconceal.h | 127 --- + libAACdec/src/usacdec_lpd.cpp | 20 +- + 29 files changed, 21 insertions(+), 9643 deletions(-) + delete mode 100644 libAACdec/src/aacdec_hcr.cpp + delete mode 100644 libAACdec/src/aacdec_hcr.h + delete mode 100644 libAACdec/src/aacdec_hcr_bit.cpp + delete mode 100644 libAACdec/src/aacdec_hcr_bit.h + delete mode 100644 libAACdec/src/aacdec_hcr_types.h + delete mode 100644 libAACdec/src/aacdec_hcrs.cpp + delete mode 100644 libAACdec/src/aacdec_hcrs.h + delete mode 100644 libAACdec/src/conceal.cpp + delete mode 100644 libAACdec/src/conceal.h + delete mode 100644 libAACdec/src/conceal_types.h + delete mode 100644 libAACdec/src/rvlc.cpp + delete mode 100644 libAACdec/src/rvlc.h + delete mode 100644 libAACdec/src/rvlc_info.h + delete mode 100644 libAACdec/src/rvlcbit.cpp + delete mode 100644 libAACdec/src/rvlcbit.h + delete mode 100644 libAACdec/src/rvlcconceal.cpp + delete mode 100644 libAACdec/src/rvlcconceal.h + +diff --git a/Makefile.am b/Makefile.am +index 79e0677..16b21e1 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -50,9 +50,6 @@ AACDEC_SRC = \ + libAACdec/src/aac_ram.cpp \ + libAACdec/src/aac_rom.cpp \ + libAACdec/src/aacdec_drc.cpp \ +- libAACdec/src/aacdec_hcr.cpp \ +- libAACdec/src/aacdec_hcr_bit.cpp \ +- libAACdec/src/aacdec_hcrs.cpp \ + libAACdec/src/aacdec_pns.cpp \ + libAACdec/src/aacdec_tns.cpp \ + libAACdec/src/aacdecoder.cpp \ +@@ -60,12 +57,8 @@ AACDEC_SRC = \ + libAACdec/src/block.cpp \ + libAACdec/src/channel.cpp \ + libAACdec/src/channelinfo.cpp \ +- libAACdec/src/conceal.cpp \ + libAACdec/src/ldfiltbank.cpp \ + libAACdec/src/pulsedata.cpp \ +- libAACdec/src/rvlc.cpp \ +- libAACdec/src/rvlcbit.cpp \ +- libAACdec/src/rvlcconceal.cpp \ + libAACdec/src/stereo.cpp \ + libAACdec/src/usacdec_ace_d4t64.cpp \ + libAACdec/src/usacdec_ace_ltp.cpp \ +diff --git a/Makefile.vc b/Makefile.vc +index ac3c097..97a0615 100644 +--- a/Makefile.vc ++++ b/Makefile.vc +@@ -34,9 +34,6 @@ AACDEC_SRC = \ + libAACdec/src/aac_ram.cpp \ + libAACdec/src/aac_rom.cpp \ + libAACdec/src/aacdec_drc.cpp \ +- libAACdec/src/aacdec_hcr.cpp \ +- libAACdec/src/aacdec_hcr_bit.cpp \ +- libAACdec/src/aacdec_hcrs.cpp \ + libAACdec/src/aacdec_pns.cpp \ + libAACdec/src/aacdec_tns.cpp \ + libAACdec/src/aacdecoder.cpp \ +@@ -44,12 +41,8 @@ AACDEC_SRC = \ + libAACdec/src/block.cpp \ + libAACdec/src/channel.cpp \ + libAACdec/src/channelinfo.cpp \ +- libAACdec/src/conceal.cpp \ + libAACdec/src/ldfiltbank.cpp \ + libAACdec/src/pulsedata.cpp \ +- libAACdec/src/rvlc.cpp \ +- libAACdec/src/rvlcbit.cpp \ +- libAACdec/src/rvlcconceal.cpp \ + libAACdec/src/stereo.cpp \ + libAACdec/src/usacdec_ace_d4t64.cpp \ + libAACdec/src/usacdec_ace_ltp.cpp \ +diff --git a/libAACdec/src/aac_ram.h b/libAACdec/src/aac_ram.h +index a861e25..7ee8d26 100644 +--- a/libAACdec/src/aac_ram.h ++++ b/libAACdec/src/aac_ram.h +@@ -111,9 +111,6 @@ amm-info@iis.fraunhofer.de + + #include "ac_arith_coder.h" + +-#include "aacdec_hcr_types.h" +-#include "aacdec_hcr.h" +- + /* End of formal fix.h */ + + #define MAX_SYNCHS 10 +diff --git a/libAACdec/src/aac_rom.cpp b/libAACdec/src/aac_rom.cpp +index cbdffc4..2c3c1b1 100644 +--- a/libAACdec/src/aac_rom.cpp ++++ b/libAACdec/src/aac_rom.cpp +@@ -1583,102 +1583,6 @@ const SCHAR *aQuantTable[] = { + aValTab24, /* 30 6 */ + aValTab24}; /* 31 6 */ + +-/* arrays for HCR_TABLE_INFO structures */ +-/* maximum length of codeword in each codebook */ +-/* codebook: 0,1, 2,3, 4, 5, 6, 7, 8, 9, +- * 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 */ +-const UCHAR aMaxCwLen[MAX_CB] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, +- 49, 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, +- 29, 29, 29, 29, 33, 33, 33, 37, 37, 41}; +- +-/* 11 13 15 17 19 +- * 21 23 25 27 39 31 */ +-/* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 +- * 22 24 26 28 30 */ +-const UCHAR aDimCb[MAX_CB] = { +- 2, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; /* codebook dimension - +- zero cb got a +- dimension of 2 */ +- +-/* 11 13 15 17 19 +- * 21 23 25 27 39 31 */ +-/* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 +- * 22 24 26 28 30 */ +-const UCHAR aDimCbShift[MAX_CB] = { +- 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; /* codebook dimension */ +- +-/* 1 -> decode sign bits */ +-/* 0 -> decode no sign bits 11 13 15 17 19 21 +- * 23 25 27 39 31 */ +-/* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22 +- * 24 26 28 30 */ +-const UCHAR aSignCb[MAX_CB] = {0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +- +-/* arrays for HCR_CB_PAIRS structures */ +-const UCHAR aMinOfCbPair[MAX_CB_PAIRS] = {0, 1, 3, 5, 7, 9, 16, 17, +- 18, 19, 20, 21, 22, 23, 24, 25, +- 26, 27, 28, 29, 30, 31, 11}; +-const UCHAR aMaxOfCbPair[MAX_CB_PAIRS] = {0, 2, 4, 6, 8, 10, 16, 17, +- 18, 19, 20, 21, 22, 23, 24, 25, +- 26, 27, 28, 29, 30, 31, 11}; +- +-/* priorities of codebooks */ +-const UCHAR aCbPriority[MAX_CB] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, +- 22, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, +- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; +- +-const SCHAR aCodebook2StartInt[] = {STOP_THIS_STATE, /* cb 0 */ +- BODY_ONLY, /* cb 1 */ +- BODY_ONLY, /* cb 2 */ +- BODY_SIGN__BODY, /* cb 3 */ +- BODY_SIGN__BODY, /* cb 4 */ +- BODY_ONLY, /* cb 5 */ +- BODY_ONLY, /* cb 6 */ +- BODY_SIGN__BODY, /* cb 7 */ +- BODY_SIGN__BODY, /* cb 8 */ +- BODY_SIGN__BODY, /* cb 9 */ +- BODY_SIGN__BODY, /* cb 10 */ +- BODY_SIGN_ESC__BODY, /* cb 11 */ +- STOP_THIS_STATE, /* cb 12 */ +- STOP_THIS_STATE, /* cb 13 */ +- STOP_THIS_STATE, /* cb 14 */ +- STOP_THIS_STATE, /* cb 15 */ +- BODY_SIGN_ESC__BODY, /* cb 16 */ +- BODY_SIGN_ESC__BODY, /* cb 17 */ +- BODY_SIGN_ESC__BODY, /* cb 18 */ +- BODY_SIGN_ESC__BODY, /* cb 19 */ +- BODY_SIGN_ESC__BODY, /* cb 20 */ +- BODY_SIGN_ESC__BODY, /* cb 21 */ +- BODY_SIGN_ESC__BODY, /* cb 22 */ +- BODY_SIGN_ESC__BODY, /* cb 23 */ +- BODY_SIGN_ESC__BODY, /* cb 24 */ +- BODY_SIGN_ESC__BODY, /* cb 25 */ +- BODY_SIGN_ESC__BODY, /* cb 26 */ +- BODY_SIGN_ESC__BODY, /* cb 27 */ +- BODY_SIGN_ESC__BODY, /* cb 28 */ +- BODY_SIGN_ESC__BODY, /* cb 29 */ +- BODY_SIGN_ESC__BODY, /* cb 30 */ +- BODY_SIGN_ESC__BODY}; /* cb 31 */ +- +-const STATEFUNC aStateConstant2State[] = { +- NULL, /* 0 = STOP_THIS_STATE */ +- Hcr_State_BODY_ONLY, /* 1 = BODY_ONLY */ +- Hcr_State_BODY_SIGN__BODY, /* 2 = BODY_SIGN__BODY */ +- Hcr_State_BODY_SIGN__SIGN, /* 3 = BODY_SIGN__SIGN */ +- Hcr_State_BODY_SIGN_ESC__BODY, /* 4 = BODY_SIGN_ESC__BODY */ +- Hcr_State_BODY_SIGN_ESC__SIGN, /* 5 = BODY_SIGN_ESC__SIGN */ +- Hcr_State_BODY_SIGN_ESC__ESC_PREFIX, /* 6 = BODY_SIGN_ESC__ESC_PREFIX */ +- Hcr_State_BODY_SIGN_ESC__ESC_WORD}; /* 7 = BODY_SIGN_ESC__ESC_WORD */ +- +-/* CB: 0 1 2 3 4 5 6 7 8 9 10 12 +- * 14 16 18 20 22 24 26 28 30 */ +-const USHORT aLargestAbsoluteValue[MAX_CB] = { +- 0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, +- 8191, 0, 0, 0, 0, 15, 31, 47, 63, 95, 127, +- 159, 191, 223, 255, 319, 383, 511, 767, 1023, 2047}; /* lav */ + /* CB: 11 13 + * 15 17 19 21 23 25 27 39 31 */ + +diff --git a/libAACdec/src/aac_rom.h b/libAACdec/src/aac_rom.h +index ffaf951..503e459 100644 +--- a/libAACdec/src/aac_rom.h ++++ b/libAACdec/src/aac_rom.h +@@ -105,8 +105,6 @@ amm-info@iis.fraunhofer.de + + #include "common_fix.h" + #include "FDK_audio.h" +-#include "aacdec_hcr_types.h" +-#include "aacdec_hcrs.h" + + #define PCM_DEC FIXP_DBL + #define MAXVAL_PCM_DEC MAXVAL_DBL +@@ -165,7 +163,7 @@ typedef struct { + extern const CodeBookDescription AACcodeBookDescriptionTable[13]; + extern const CodeBookDescription AACcodeBookDescriptionSCL; + +-extern const STATEFUNC aStateConstant2State[]; ++#define MAX_CB 32 /* last used CB is cb #31 when VCB11 is used */ + + extern const SCHAR aCodebook2StartInt[]; + +diff --git a/libAACdec/src/aacdec_hcr.cpp b/libAACdec/src/aacdec_hcr.cpp +deleted file mode 100644 +index 6114756..0000000 +--- a/libAACdec/src/aacdec_hcr.cpp ++++ /dev/null +@@ -1,1498 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo, +- decode priority codewords (PCWs) +- +-*******************************************************************************/ +- +-#include "aacdec_hcr.h" +- +-#include "aacdec_hcr_types.h" +-#include "aacdec_hcr_bit.h" +-#include "aacdec_hcrs.h" +-#include "aac_ram.h" +-#include "aac_rom.h" +-#include "channel.h" +-#include "block.h" +- +-#include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */ +-#include "FDK_bitstream.h" +- +-extern int mlFileChCurr; +- +-static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine, +- UINT *errorWord); +- +-static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword, +- SHORT lengthOfReorderedSpectralData, +- UINT *errorWord); +- +-static void HcrCalcNumCodeword(H_HCR_INFO pHcr); +-static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr); +-static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr); +-static void HcrExtendedSectionInfo(H_HCR_INFO pHcr); +- +-static void DeriveNumberOfExtendedSortedSectionsInSets( +- UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection, +- int numExtendedSortedCodewordInSectionIdx, +- USHORT *pNumExtendedSortedSectionsInSets, +- int numExtendedSortedSectionsInSetsIdx); +- +-static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT quantSpecCoef, INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, +- int *pNumDecodedBits); +- +-static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- UINT codebookDim, const SCHAR *pQuantVal, +- FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx, +- INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits); +- +-static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- const UINT *pCurrentTree, +- const SCHAR *pQuantValBase, +- INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, +- int *pNumDecodedBits); +- +-static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr); +- +-static void HcrReorderQuantizedSpectralCoefficients( +- H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo); +- +-static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment, +- H_HCR_INFO pHcr, PCW_TYPE kind, +- FIXP_DBL *qsc_base_of_cw, +- UCHAR dimension); +- +-static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr); +- +-/*--------------------------------------------------------------------------------------------- +- description: Check if codebook and numSect are within allowed range +-(short only) +--------------------------------------------------------------------------------------------- +-*/ +-static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine, +- UINT *errorWord) { +- if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) { +- *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK; +- } +- if (numLine < 0 || numLine > 1024) { +- *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Check both HCR lengths +--------------------------------------------------------------------------------------------- +-*/ +-static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword, +- SHORT lengthOfReorderedSpectralData, +- UINT *errorWord) { +- if (lengthOfReorderedSpectralData < lengthOfLongestCodeword) { +- *errorWord |= HCR_SI_LENGTHS_FAILURE; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decode (and adapt if necessary) the two HCR sideinfo +-components: 'reordered_spectral_data_length' and 'longest_codeword_length' +--------------------------------------------------------------------------------------------- +-*/ +- +-void CHcr_Read(HANDLE_FDK_BITSTREAM bs, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const MP4_ELEMENT_ID globalHcrType) { +- SHORT lengOfReorderedSpectralData; +- SCHAR lengOfLongestCodeword; +- +- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = +- 0; +- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0; +- +- /* ------- SI-Value No 1 ------- */ +- lengOfReorderedSpectralData = FDKreadBits(bs, 14) + ERROR_LORSD; +- if (globalHcrType == ID_CPE) { +- if ((lengOfReorderedSpectralData >= 0) && +- (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData = +- lengOfReorderedSpectralData; /* the decoded value is within range */ +- } else { +- if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData = +- CPE_TOP_LENGTH; /* use valid maximum */ +- } +- } +- } else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE || +- globalHcrType == ID_CCE) { +- if ((lengOfReorderedSpectralData >= 0) && +- (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData = +- lengOfReorderedSpectralData; /* the decoded value is within range */ +- } else { +- if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData = +- SCE_TOP_LENGTH; /* use valid maximum */ +- } +- } +- } +- +- /* ------- SI-Value No 2 ------- */ +- lengOfLongestCodeword = FDKreadBits(bs, 6) + ERROR_LOLC; +- if ((lengOfLongestCodeword >= 0) && +- (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = +- lengOfLongestCodeword; /* the decoded value is within range */ +- } else { +- if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) { +- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = +- LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */ +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Set up HCR - must be called before every call to +-HcrDecoder(). For short block a sorting algorithm is applied to get the SI in +-the order that HCR could assemble the qsc's as if it is a long block. +------------------------------------------------------------------------------------------------ +- return: error log +--------------------------------------------------------------------------------------------- +-*/ +- +-UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, +- HANDLE_FDK_BITSTREAM bs) { +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- SHORT *pNumLinesInSec; +- UCHAR *pCodeBk; +- SHORT numSection; +- SCHAR cb; +- int numLine; +- int i; +- +- pHcr->decInOut.lengthOfReorderedSpectralData = +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData; +- pHcr->decInOut.lengthOfLongestCodeword = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword; +- pHcr->decInOut.pQuantizedSpectralCoefficientsBase = +- pAacDecoderChannelInfo->pSpectralCoefficient; +- pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0; +- pHcr->decInOut.pCodebook = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; +- pHcr->decInOut.pNumLineInSect = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; +- pHcr->decInOut.numSection = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection; +- pHcr->decInOut.errorLog = 0; +- pHcr->nonPcwSideinfo.pResultBase = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- +- FDKsyncCache(bs); +- pHcr->decInOut.bitstreamAnchor = (INT)FDKgetValidBits(bs); +- +- if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */ +- { +- SHORT band; +- SHORT maxBand; +- SCHAR group; +- SCHAR winGroupLen; +- SCHAR window; +- SCHAR numUnitInBand; +- SCHAR cntUnitInBand; +- SCHAR groupWin; +- SCHAR cb_prev; +- +- UCHAR *pCodeBook; +- const SHORT *BandOffsets; +- SCHAR numOfGroups; +- +- pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */ +- pNumLinesInSec = pHcr->decInOut.pNumLineInSect; /* out */ +- pCodeBk = pHcr->decInOut.pCodebook; /* out */ +- BandOffsets = +- GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */ +- numOfGroups = GetWindowGroups(pIcsInfo); +- +- numLine = 0; +- numSection = 0; +- cb = pCodeBook[0]; +- cb_prev = pCodeBook[0]; +- +- /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new +- * section starts */ +- +- *pCodeBk++ = cb_prev; +- +- maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); +- for (band = 0; band < maxBand; +- band++) { /* from low to high sfbs i.e. from low to high frequencies */ +- numUnitInBand = +- ((BandOffsets[band + 1] - BandOffsets[band]) >> +- FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */ +- for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0; +- cntUnitInBand--) { /* for every unit in the band */ +- for (window = 0, group = 0; group < numOfGroups; group++) { +- winGroupLen = (SCHAR)GetWindowGroupLength( +- &pAacDecoderChannelInfo->icsInfo, group); +- for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) { +- cb = pCodeBook[group * 16 + band]; +- if (cb != cb_prev) { +- errDetectorInHcrSideinfoShrt(cb, numLine, +- &pHcr->decInOut.errorLog); +- if (pHcr->decInOut.errorLog != 0) { +- return (pHcr->decInOut.errorLog); +- } +- *pCodeBk++ = cb; +- *pNumLinesInSec++ = numLine; +- numSection++; +- +- cb_prev = cb; +- numLine = LINES_PER_UNIT; +- } else { +- numLine += LINES_PER_UNIT; +- } +- } +- } +- } +- } +- +- numSection++; +- +- errDetectorInHcrSideinfoShrt(cb, numLine, &pHcr->decInOut.errorLog); +- if (numSection <= 0 || numSection > 1024 / 2) { +- pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK; +- } +- errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword, +- pHcr->decInOut.lengthOfReorderedSpectralData, +- &pHcr->decInOut.errorLog); +- if (pHcr->decInOut.errorLog != 0) { +- return (pHcr->decInOut.errorLog); +- } +- +- *pCodeBk = cb; +- *pNumLinesInSec = numLine; +- pHcr->decInOut.numSection = numSection; +- +- } else /* end short block prepare SI */ +- { /* long block */ +- errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword, +- pHcr->decInOut.lengthOfReorderedSpectralData, +- &pHcr->decInOut.errorLog); +- numSection = pHcr->decInOut.numSection; +- pNumLinesInSec = pHcr->decInOut.pNumLineInSect; +- pCodeBk = pHcr->decInOut.pCodebook; +- if (numSection <= 0 || numSection > 64) { +- pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK; +- numSection = 0; +- } +- +- for (i = numSection; i != 0; i--) { +- cb = *pCodeBk++; +- +- if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) { +- pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK; +- } +- +- numLine = *pNumLinesInSec++; +- /* FDK_ASSERT(numLine > 0); */ +- +- if ((numLine <= 0) || (numLine > 1024)) { +- pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK; +- } +- } +- if (pHcr->decInOut.errorLog != 0) { +- return (pHcr->decInOut.errorLog); +- } +- } +- +- pCodeBk = pHcr->decInOut.pCodebook; +- for (i = 0; i < numSection; i++) { +- if ((*pCodeBk == NOISE_HCB) || (*pCodeBk == INTENSITY_HCB2) || +- (*pCodeBk == INTENSITY_HCB)) { +- *pCodeBk = 0; +- } +- pCodeBk++; +- } +- +- /* HCR-sideinfo-input is complete and seems to be valid */ +- +- return (pHcr->decInOut.errorLog); +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function decodes the codewords of the spectral +-coefficients from the bitstream according to the HCR algorithm and stores the +-quantized spectral coefficients in correct order in the output buffer. +--------------------------------------------------------------------------------------------- +-*/ +- +-UINT HcrDecoder(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, +- HANDLE_FDK_BITSTREAM bs) { +- int pTmp1, pTmp2, pTmp3, pTmp4; +- int pTmp5; +- +- INT bitCntOffst; +- INT saveBitCnt = (INT)FDKgetValidBits(bs); /* save bitstream position */ +- +- HcrCalcNumCodeword(pHcr); +- +- HcrSortCodebookAndNumCodewordInSection(pHcr); +- +- HcrPrepareSegmentationGrid(pHcr); +- +- HcrExtendedSectionInfo(pHcr); +- +- if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) != 0) { +- return (pHcr->decInOut.errorLog); /* sideinfo is massively corrupt, return +- from HCR without having decoded +- anything */ +- } +- +- DeriveNumberOfExtendedSortedSectionsInSets( +- pHcr->segmentInfo.numSegment, +- pHcr->sectionInfo.pNumExtendedSortedCodewordInSection, +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx, +- pHcr->sectionInfo.pNumExtendedSortedSectionsInSets, +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx); +- +- /* store */ +- pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; +- pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx; +- pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; +- pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx; +- pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx; +- +- /* ------- decode meaningful PCWs ------ */ +- DecodePCWs(bs, pHcr); +- +- if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) == 0) { +- /* ------ decode the non-PCWs -------- */ +- DecodeNonPCWs(bs, pHcr); +- } +- +- errDetectWithinSegmentationFinal(pHcr); +- +- /* restore */ +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1; +- pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2; +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3; +- pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4; +- pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5; +- +- HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, +- pSamplingRateInfo); +- +- /* restore bitstream position */ +- bitCntOffst = (INT)FDKgetValidBits(bs) - saveBitCnt; +- if (bitCntOffst) { +- FDKpushBiDirectional(bs, bitCntOffst); +- } +- +- return (pHcr->decInOut.errorLog); +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function reorders the quantized spectral coefficients +-sectionwise for long- and short-blocks and compares to the LAV (Largest Absolute +-Value of the current codebook) -- a counter is incremented if there is an error +- detected. +- Additional for short-blocks a unit-based-deinterleaving is +-applied. Moreover (for short blocks) the scaling is derived (compare plain +-huffman decoder). +--------------------------------------------------------------------------------------------- +-*/ +- +-static void HcrReorderQuantizedSpectralCoefficients( +- H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo) { +- INT qsc; +- UINT abs_qsc; +- UINT i, j; +- USHORT numSpectralValuesInSection; +- FIXP_DBL *pTeVa; +- USHORT lavErrorCnt = 0; +- +- UINT numSection = pHcr->decInOut.numSection; +- SPECTRAL_PTR pQuantizedSpectralCoefficientsBase = +- pHcr->decInOut.pQuantizedSpectralCoefficientsBase; +- FIXP_DBL *pQuantizedSpectralCoefficients = +- SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); +- const UCHAR *pCbDimShift = aDimCbShift; +- const USHORT *pLargestAbsVal = aLargestAbsoluteValue; +- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; +- USHORT *pNumSortedCodewordInSection = +- pHcr->sectionInfo.pNumSortedCodewordInSection; +- USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset; +- FIXP_DBL pTempValues[1024]; +- FIXP_DBL *pBak = pTempValues; +- +- FDKmemclear(pTempValues, 1024 * sizeof(FIXP_DBL)); +- +- /* long and short: check if decoded huffman-values (quantized spectral +- * coefficients) are within range */ +- for (i = numSection; i != 0; i--) { +- numSpectralValuesInSection = *pNumSortedCodewordInSection++ +- << pCbDimShift[*pSortedCodebook]; +- pTeVa = &pTempValues[*pReorderOffset++]; +- for (j = numSpectralValuesInSection; j != 0; j--) { +- qsc = *pQuantizedSpectralCoefficients++; +- abs_qsc = fAbs(qsc); +- if (abs_qsc <= pLargestAbsVal[*pSortedCodebook]) { +- *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */ +- } else { /* line is too high .. */ +- if (abs_qsc == +- Q_VALUE_INVALID) { /* .. because of previous marking --> dont set +- LAV flag (would be confusing), just copy out +- the already marked value */ +- *pTeVa++ = (FIXP_DBL)qsc; +- } else { /* .. because a too high value was decoded for this cb --> set +- LAV flag */ +- *pTeVa++ = (FIXP_DBL)Q_VALUE_INVALID; +- lavErrorCnt += 1; +- } +- } +- } +- pSortedCodebook++; +- } +- +- if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) { +- FIXP_DBL *pOut; +- FIXP_DBL locMax; +- FIXP_DBL tmp; +- SCHAR groupoffset; +- SCHAR group; +- SCHAR band; +- SCHAR groupwin; +- SCHAR window; +- SCHAR numWinGroup; +- SHORT interm; +- SCHAR numSfbTransm; +- SCHAR winGroupLen; +- SHORT index; +- INT msb; +- INT lsb; +- +- SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor; +- SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale; +- const SHORT *BandOffsets = GetScaleFactorBandOffsets( +- &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); +- +- pBak = pTempValues; +- /* deinterleave unitwise for short blocks */ +- for (window = 0; window < (8); window++) { +- pOut = SPEC(pQuantizedSpectralCoefficientsBase, window, +- pAacDecoderChannelInfo->granuleLength); +- for (i = 0; i < (LINES_PER_UNIT_GROUP); i++) { +- pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) + +- i * 32; /* distance of lines between unit groups has to be +- constant for every framelength (32)! */ +- for (j = (LINES_PER_UNIT); j != 0; j--) { +- *pOut++ = *pTeVa++; +- } +- } +- } +- +- /* short blocks only */ +- /* derive global scaling-value for every sfb and every window (as it is done +- * in plain-huffman-decoder at short blocks) */ +- groupoffset = 0; +- +- numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); +- numSfbTransm = +- GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); +- +- for (group = 0; group < numWinGroup; group++) { +- winGroupLen = +- GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group); +- for (band = 0; band < numSfbTransm; band++) { +- interm = group * 16 + band; +- msb = pScaleFacHcr[interm] >> 2; +- lsb = pScaleFacHcr[interm] & 3; +- for (groupwin = 0; groupwin < winGroupLen; groupwin++) { +- window = groupoffset + groupwin; +- pBak = SPEC(pQuantizedSpectralCoefficientsBase, window, +- pAacDecoderChannelInfo->granuleLength); +- locMax = FL2FXCONST_DBL(0.0f); +- for (index = BandOffsets[band]; index < BandOffsets[band + 1]; +- index += LINES_PER_UNIT) { +- pTeVa = &pBak[index]; +- for (i = LINES_PER_UNIT; i != 0; i--) { +- tmp = (*pTeVa < FL2FXCONST_DBL(0.0f)) ? -*pTeVa++ : *pTeVa++; +- locMax = fixMax(tmp, locMax); +- } +- } +- if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) { +- locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE; +- } +- pSfbSclHcr[window * 16 + band] = +- msb - GetScaleFromValue( +- locMax, lsb); /* save global scale maxima in this sfb */ +- } +- } +- groupoffset += +- GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group); +- } +- } else { +- /* copy straight for long-blocks */ +- pQuantizedSpectralCoefficients = +- SPEC_LONG(pQuantizedSpectralCoefficientsBase); +- for (i = 1024; i != 0; i--) { +- *pQuantizedSpectralCoefficients++ = *pBak++; +- } +- } +- +- if (lavErrorCnt != 0) { +- pHcr->decInOut.errorLog |= LAV_VIOLATION; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function calculates the number of codewords +- for each section (numCodewordInSection) and the number of +-codewords for all sections (numCodeword). For zero and intensity codebooks a +-entry is also done in the variable numCodewordInSection. It is assumed that the +-codebook is a two tuples codebook. This is needed later for the calculation of +-the base addresses for the reordering of the quantize spectral coefficients at +-the end of the hcr tool. The variable numCodeword contain the number of +-codewords which are really in the bitstream. Zero or intensity codebooks does +-not increase the variable numCodewords. +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void HcrCalcNumCodeword(H_HCR_INFO pHcr) { +- int hcrSection; +- UINT numCodeword; +- +- UINT numSection = pHcr->decInOut.numSection; +- UCHAR *pCodebook = pHcr->decInOut.pCodebook; +- SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect; +- const UCHAR *pCbDimShift = aDimCbShift; +- +- USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection; +- +- numCodeword = 0; +- for (hcrSection = numSection; hcrSection != 0; hcrSection--) { +- *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook]; +- if (*pCodebook != 0) { +- numCodeword += *pNumCodewordInSection; +- } +- pNumCodewordInSection++; +- pCodebook++; +- } +- pHcr->sectionInfo.numCodeword = numCodeword; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function calculates the number +- of sorted codebooks and sorts the codebooks and the +-numCodewordInSection according to the priority. +--------------------------------------------------------------------------------------------- +-*/ +- +-static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr) { +- UINT i, j, k; +- UCHAR temp; +- UINT counter; +- UINT startOffset; +- UINT numZeroSection; +- UCHAR *pDest; +- UINT numSectionDec; +- +- UINT numSection = pHcr->decInOut.numSection; +- UCHAR *pCodebook = pHcr->decInOut.pCodebook; +- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; +- USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection; +- USHORT *pNumSortedCodewordInSection = +- pHcr->sectionInfo.pNumSortedCodewordInSection; +- UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch; +- USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset; +- const UCHAR *pCbPriority = aCbPriority; +- const UCHAR *pMinOfCbPair = aMinOfCbPair; +- const UCHAR *pMaxOfCbPair = aMaxOfCbPair; +- const UCHAR *pCbDimShift = aDimCbShift; +- +- UINT searchStart = 0; +- +- /* calculate *pNumSortedSection and store the priorities in array +- * pSortedCdebook */ +- pDest = pSortedCodebook; +- numZeroSection = 0; +- for (i = numSection; i != 0; i--) { +- if (pCbPriority[*pCodebook] == 0) { +- numZeroSection += 1; +- } +- *pDest++ = pCbPriority[*pCodebook++]; +- } +- pHcr->sectionInfo.numSortedSection = +- numSection - numZeroSection; /* numSortedSection contains no zero or +- intensity section */ +- pCodebook = pHcr->decInOut.pCodebook; +- +- /* sort priorities of the codebooks in array pSortedCdebook[] */ +- numSectionDec = numSection - 1; +- if (numSectionDec > 0) { +- counter = numSectionDec; +- for (j = numSectionDec; j != 0; j--) { +- for (i = 0; i < counter; i++) { +- /* swap priorities */ +- if (pSortedCodebook[i + 1] > pSortedCodebook[i]) { +- temp = pSortedCodebook[i]; +- pSortedCodebook[i] = pSortedCodebook[i + 1]; +- pSortedCodebook[i + 1] = temp; +- } +- } +- counter -= 1; +- } +- } +- +- /* clear codebookSwitch array */ +- for (i = numSection; i != 0; i--) { +- *pCodebookSwitch++ = 0; +- } +- pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch; +- +- /* sort sectionCodebooks and numCodwordsInSection and calculate +- * pReorderOffst[j] */ +- for (j = 0; j < numSection; j++) { +- for (i = searchStart; i < numSection; i++) { +- if (pCodebookSwitch[i] == 0 && +- (pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] || +- pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i])) { +- pCodebookSwitch[i] = 1; +- pSortedCodebook[j] = pCodebook[i]; /* sort codebook */ +- pNumSortedCodewordInSection[j] = +- pNumCodewordInSection[i]; /* sort NumCodewordInSection */ +- +- startOffset = 0; +- for (k = 0; k < i; k++) { /* make entry in pReorderOffst */ +- startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]]; +- } +- pReorderOffset[j] = +- startOffset; /* offset for reordering the codewords */ +- +- if (i == searchStart) { +- k = i; +- while (pCodebookSwitch[k++] == 1) searchStart++; +- } +- break; +- } +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function calculates the segmentation, which includes +-numSegment, leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment. +- The segmentation could be visualized a as kind of +-'overlay-grid' for the bitstream-block holding the HCR-encoded +-quantized-spectral-coefficients. +--------------------------------------------------------------------------------------------- +-*/ +- +-static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr) { +- USHORT i, j; +- USHORT numSegment = 0; +- INT segmentStart = 0; +- UCHAR segmentWidth; +- UCHAR lastSegmentWidth; +- UCHAR sortedCodebook; +- UCHAR endFlag = 0; +- INT intermediateResult; +- +- SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword; +- SHORT lengthOfReorderedSpectralData = +- pHcr->decInOut.lengthOfReorderedSpectralData; +- UINT numSortedSection = pHcr->sectionInfo.numSortedSection; +- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; +- USHORT *pNumSortedCodewordInSection = +- pHcr->sectionInfo.pNumSortedCodewordInSection; +- INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- INT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- const UCHAR *pMaxCwLength = aMaxCwLen; +- +- for (i = numSortedSection; i != 0; i--) { +- sortedCodebook = *pSortedCodebook++; +- segmentWidth = +- fMin((INT)pMaxCwLength[sortedCodebook], (INT)lengthOfLongestCodeword); +- +- for (j = *pNumSortedCodewordInSection; j != 0; j--) { +- /* width allows a new segment */ +- intermediateResult = segmentStart; +- if ((segmentStart + segmentWidth) <= lengthOfReorderedSpectralData) { +- /* store segment start, segment length and increment the number of +- * segments */ +- *pLeftStartOfSegment++ = intermediateResult; +- *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1; +- *pRemainingBitsInSegment++ = segmentWidth; +- segmentStart += segmentWidth; +- numSegment += 1; +- } +- /* width does not allow a new segment */ +- else { +- /* correct the last segment length */ +- pLeftStartOfSegment--; +- pRightStartOfSegment--; +- pRemainingBitsInSegment--; +- segmentStart = *pLeftStartOfSegment; +- +- lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart; +- *pRemainingBitsInSegment = lastSegmentWidth; +- *pRightStartOfSegment = segmentStart + lastSegmentWidth - 1; +- endFlag = 1; +- break; +- } +- } +- pNumSortedCodewordInSection++; +- if (endFlag != 0) { +- break; +- } +- } +- pHcr->segmentInfo.numSegment = numSegment; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function adapts the sorted section boundaries to the +-boundaries of segmentation. If the section lengths does not fit completely into +-the current segment, the section is spitted into two so called 'extended +- sections'. The extended-section-info +-(pNumExtendedSortedCodewordInSectin and pExtendedSortedCodebook) is updated in +-this case. +- +--------------------------------------------------------------------------------------------- +-*/ +- +-static void HcrExtendedSectionInfo(H_HCR_INFO pHcr) { +- UINT srtSecCnt = 0; /* counter for sorted sections */ +- UINT xSrtScCnt = 0; /* counter for extended sorted sections */ +- UINT remainNumCwInSortSec; +- UINT inSegmentRemainNumCW; +- +- UINT numSortedSection = pHcr->sectionInfo.numSortedSection; +- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; +- USHORT *pNumSortedCodewordInSection = +- pHcr->sectionInfo.pNumSortedCodewordInSection; +- UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook; +- USHORT *pNumExtSortCwInSect = +- pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; +- UINT numSegment = pHcr->segmentInfo.numSegment; +- UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec; +- SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword; +- const UCHAR *pMaxCwLength = aMaxCwLen; +- +- remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; +- inSegmentRemainNumCW = numSegment; +- +- while (srtSecCnt < numSortedSection) { +- if (inSegmentRemainNumCW < remainNumCwInSortSec) { +- pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW; +- pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; +- +- remainNumCwInSortSec -= inSegmentRemainNumCW; +- inSegmentRemainNumCW = numSegment; +- /* data of a sorted section was not integrated in extended sorted section +- */ +- } else if (inSegmentRemainNumCW == remainNumCwInSortSec) { +- pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW; +- pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; +- +- srtSecCnt++; +- remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; +- inSegmentRemainNumCW = numSegment; +- /* data of a sorted section was integrated in extended sorted section */ +- } else { /* inSegmentRemainNumCW > remainNumCwInSortSec */ +- pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec; +- pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; +- +- inSegmentRemainNumCW -= remainNumCwInSortSec; +- srtSecCnt++; +- remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; +- /* data of a sorted section was integrated in extended sorted section */ +- } +- pMaxLenOfCbInExtSrtSec[xSrtScCnt] = +- fMin((INT)pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]], +- (INT)lengthOfLongestCodeword); +- +- xSrtScCnt += 1; +- +- if (xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW; +- return; +- } +- } +- pNumExtSortCwInSect[xSrtScCnt] = 0; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function calculates the number of extended sorted +-sections which belong to the sets. Each set from set 0 (one and only set for the +-PCWs) till to the last set gets a entry in the array to which +- 'pNumExtendedSortedSectinsInSets' points to. +- +- Calculation: The entrys in +-pNumExtendedSortedCodewordInSectin are added untill the value numSegment is +-reached. Then the sum_variable is cleared and the calculation starts from the +-beginning. As much extended sorted Sections are summed up to reach the value +-numSegment, as much is the current entry in *pNumExtendedSortedCodewordInSectin. +--------------------------------------------------------------------------------------------- +-*/ +-static void DeriveNumberOfExtendedSortedSectionsInSets( +- UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection, +- int numExtendedSortedCodewordInSectionIdx, +- USHORT *pNumExtendedSortedSectionsInSets, +- int numExtendedSortedSectionsInSetsIdx) { +- USHORT counter = 0; +- UINT cwSum = 0; +- USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection; +- USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets; +- +- while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) { +- cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx]; +- numExtendedSortedCodewordInSectionIdx++; +- if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- return; +- } +- if (cwSum > numSegment) { +- return; +- } +- counter++; +- if (counter > 1024 / 4) { +- return; +- } +- if (cwSum == numSegment) { +- pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; +- numExtendedSortedSectionsInSetsIdx++; +- if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { +- return; +- } +- counter = 0; +- cwSum = 0; +- } +- } +- pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = +- counter; /* save last entry for the last - probably shorter - set */ +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function decodes all priority codewords (PCWs) in a +-spectrum (within set 0). The calculation of the PCWs is managed in two loops. +-The loopcounter of the outer loop is set to the first value pointer +- pNumExtendedSortedSectionsInSets points to. This value +-represents the number of extended sorted sections within set 0. The loopcounter +-of the inner loop is set to the first value pointer +- pNumExtendedSortedCodewordInSectin points to. The value +-represents the number of extended sorted codewords in sections (the original +-sections have been splitted to go along with the borders of the sets). Each time +-the number of the extended sorted codewords in sections are de- coded, the +-pointer 'pNumExtendedSortedCodewordInSectin' is incremented by one. +--------------------------------------------------------------------------------------------- +-*/ +-static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) { +- UINT i; +- USHORT extSortSec; +- USHORT curExtSortCwInSec; +- UCHAR codebook; +- UCHAR dimension; +- const UINT *pCurrentTree; +- const SCHAR *pQuantValBase; +- const SCHAR *pQuantVal; +- +- USHORT *pNumExtendedSortedCodewordInSection = +- pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; +- int numExtendedSortedCodewordInSectionIdx = +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; +- UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; +- int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; +- USHORT *pNumExtendedSortedSectionsInSets = +- pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; +- int numExtendedSortedSectionsInSetsIdx = +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; +- FIXP_DBL *pQuantizedSpectralCoefficients = +- SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); +- int quantizedSpectralCoefficientsIdx = +- pHcr->decInOut.quantizedSpectralCoefficientsIdx; +- INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec; +- int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx; +- UCHAR maxAllowedCwLen; +- int numDecodedBits; +- const UCHAR *pCbDimension = aDimCb; +- const UCHAR *pCbSign = aSignCb; +- +- /* clear result array */ +- FDKmemclear(pQuantizedSpectralCoefficients + quantizedSpectralCoefficientsIdx, +- 1024 * sizeof(FIXP_DBL)); +- +- /* decode all PCWs in the extended sorted section(s) belonging to set 0 */ +- for (extSortSec = +- pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; +- extSortSec != 0; extSortSec--) { +- codebook = +- pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for +- this extended +- sorted section +- and increment ptr +- to cb of next +- ext. sort sec */ +- extendedSortedCodebookIdx++; +- if (extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- return; +- } +- dimension = pCbDimension[codebook]; /* get dimension of codebook of this +- extended sort. sec. */ +- pCurrentTree = +- aHuffTable[codebook]; /* convert codebook to pointer to QSCs */ +- pQuantValBase = +- aQuantTable[codebook]; /* convert codebook to index to table of QSCs */ +- maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx]; +- maxLenOfCbInExtSrtSecIdx++; +- if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- return; +- } +- +- /* switch for decoding with different codebooks: */ +- if (pCbSign[codebook] == +- 0) { /* no sign bits follow after the codeword-body */ +- /* PCW_BodyONLY */ +- /*==============*/ +- +- for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection +- [numExtendedSortedCodewordInSectionIdx]; +- curExtSortCwInSec != 0; curExtSortCwInSec--) { +- numDecodedBits = 0; +- +- /* decode PCW_BODY */ +- pQuantVal = DecodePCW_Body( +- bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase, +- pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits); +- +- /* result is written out here because NO sign bits follow the body */ +- for (i = dimension; i != 0; i--) { +- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = +- (FIXP_DBL)*pQuantVal++; /* write quant. spec. coef. into +- spectrum; sign is already valid */ +- quantizedSpectralCoefficientsIdx++; +- if (quantizedSpectralCoefficientsIdx >= 1024) { +- return; +- } +- } +- +- /* one more PCW should be decoded */ +- +- if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG)) { +- pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED; +- } +- +- if (1 == errDetectPcwSegmentation( +- *pRemainingBitsInSegment - ERROR_PCW_BODY, pHcr, PCW_BODY, +- pQuantizedSpectralCoefficients + +- quantizedSpectralCoefficientsIdx - dimension, +- dimension)) { +- return; +- } +- pLeftStartOfSegment++; /* update pointer for decoding the next PCW */ +- pRemainingBitsInSegment++; /* update pointer for decoding the next PCW +- */ +- } +- } else if ((codebook < 11) && (pCbSign[codebook] == +- 1)) { /* possibly there follow 1,2,3 or 4 +- sign bits after the codeword-body */ +- /* PCW_Body and PCW_Sign */ +- /*=======================*/ +- +- for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection +- [numExtendedSortedCodewordInSectionIdx]; +- curExtSortCwInSec != 0; curExtSortCwInSec--) { +- int err; +- numDecodedBits = 0; +- +- pQuantVal = DecodePCW_Body( +- bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase, +- pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits); +- +- err = DecodePCW_Sign( +- bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal, +- pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx, +- pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits); +- if (err != 0) { +- return; +- } +- /* one more PCW should be decoded */ +- +- if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG)) { +- pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED; +- } +- +- if (1 == errDetectPcwSegmentation( +- *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN, pHcr, +- PCW_BODY_SIGN, +- pQuantizedSpectralCoefficients + +- quantizedSpectralCoefficientsIdx - dimension, +- dimension)) { +- return; +- } +- pLeftStartOfSegment++; +- pRemainingBitsInSegment++; +- } +- } else if ((pCbSign[codebook] == 1) && +- (codebook >= 11)) { /* possibly there follow some sign bits and +- maybe one or two escape sequences after +- the cw-body */ +- /* PCW_Body, PCW_Sign and maybe PCW_Escape */ +- /*=========================================*/ +- +- for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection +- [numExtendedSortedCodewordInSectionIdx]; +- curExtSortCwInSec != 0; curExtSortCwInSec--) { +- int err; +- numDecodedBits = 0; +- +- /* decode PCW_BODY */ +- pQuantVal = DecodePCW_Body( +- bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase, +- pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits); +- +- err = DecodePCW_Sign( +- bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal, +- pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx, +- pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits); +- if (err != 0) { +- return; +- } +- +- /* decode PCW_ESCAPE if present */ +- quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK; +- +- if (fixp_abs(pQuantizedSpectralCoefficients +- [quantizedSpectralCoefficientsIdx]) == +- (FIXP_DBL)ESCAPE_VALUE) { +- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = +- (FIXP_DBL)DecodeEscapeSequence( +- bs, pHcr->decInOut.bitstreamAnchor, +- pQuantizedSpectralCoefficients +- [quantizedSpectralCoefficientsIdx], +- pLeftStartOfSegment, pRemainingBitsInSegment, +- &numDecodedBits); +- } +- quantizedSpectralCoefficientsIdx++; +- if (quantizedSpectralCoefficientsIdx >= 1024) { +- return; +- } +- +- if (fixp_abs(pQuantizedSpectralCoefficients +- [quantizedSpectralCoefficientsIdx]) == +- (FIXP_DBL)ESCAPE_VALUE) { +- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = +- (FIXP_DBL)DecodeEscapeSequence( +- bs, pHcr->decInOut.bitstreamAnchor, +- pQuantizedSpectralCoefficients +- [quantizedSpectralCoefficientsIdx], +- pLeftStartOfSegment, pRemainingBitsInSegment, +- &numDecodedBits); +- } +- quantizedSpectralCoefficientsIdx++; +- if (quantizedSpectralCoefficientsIdx >= 1024) { +- return; +- } +- +- /* one more PCW should be decoded */ +- +- if (maxAllowedCwLen < +- (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG)) { +- pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED; +- } +- +- if (1 == errDetectPcwSegmentation( +- *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN_ESC, pHcr, +- PCW_BODY_SIGN_ESC, +- pQuantizedSpectralCoefficients + +- quantizedSpectralCoefficientsIdx - +- DIMENSION_OF_ESCAPE_CODEBOOK, +- DIMENSION_OF_ESCAPE_CODEBOOK)) { +- return; +- } +- pLeftStartOfSegment++; +- pRemainingBitsInSegment++; +- } +- } +- +- /* all PCWs belonging to this extended section should be decoded */ +- numExtendedSortedCodewordInSectionIdx++; +- if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR + MAX_HCR_SETS) { +- return; +- } +- } +- /* all PCWs should be decoded */ +- +- numExtendedSortedSectionsInSetsIdx++; +- if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { +- return; +- } +- +- /* Write back indexes into structure */ +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = +- numExtendedSortedCodewordInSectionIdx; +- pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = +- numExtendedSortedSectionsInSetsIdx; +- pHcr->decInOut.quantizedSpectralCoefficientsIdx = +- quantizedSpectralCoefficientsIdx; +- pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function checks immediately after every decoded PCW, +-whether out of the current segment too many bits have been read or not. If an +-error occurrs, probably the sideinfo or the HCR-bitstream block holding the +-huffman encoded quantized spectral coefficients is distorted. In this case the +-two or four quantized spectral coefficients belonging to the current codeword +- are marked (for being detected by concealment later). +--------------------------------------------------------------------------------------------- +-*/ +-static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment, +- H_HCR_INFO pHcr, PCW_TYPE kind, +- FIXP_DBL *qsc_base_of_cw, +- UCHAR dimension) { +- SCHAR i; +- if (remainingBitsInSegment < 0) { +- /* log the error */ +- switch (kind) { +- case PCW_BODY: +- pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY; +- break; +- case PCW_BODY_SIGN: +- pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN; +- break; +- case PCW_BODY_SIGN_ESC: +- pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC; +- break; +- } +- /* mark the erred lines */ +- for (i = dimension; i != 0; i--) { +- *qsc_base_of_cw++ = (FIXP_DBL)Q_VALUE_INVALID; +- } +- return 1; +- } +- return 0; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function checks if all segments are empty after +-decoding. There are _no lines markded_ as invalid because it could not be traced +-back where from the remaining bits are. +--------------------------------------------------------------------------------------------- +-*/ +-static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr) { +- UCHAR segmentationErrorFlag = 0; +- USHORT i; +- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- UINT numSegment = pHcr->segmentInfo.numSegment; +- +- for (i = numSegment; i != 0; i--) { +- if (*pRemainingBitsInSegment++ != 0) { +- segmentationErrorFlag = 1; +- } +- } +- if (segmentationErrorFlag == 1) { +- pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function walks one step within the decoding tree. Which +-branch is taken depends on the decoded carryBit input parameter. +--------------------------------------------------------------------------------------------- +-*/ +-void CarryBitToBranchValue(UCHAR carryBit, UINT treeNode, UINT *branchValue, +- UINT *branchNode) { +- if (carryBit == 0) { +- *branchNode = +- (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT: 00FFF000 */ +- } else { +- *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */ +- } +- +- *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */ +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decodes the body of a priority codeword (PCW) +------------------------------------------------------------------------------------------------ +- return: - return value is pointer to first of two or four quantized +-spectral coefficients +--------------------------------------------------------------------------------------------- +-*/ +-static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- const UINT *pCurrentTree, +- const SCHAR *pQuantValBase, +- INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, +- int *pNumDecodedBits) { +- UCHAR carryBit; +- UINT branchNode; +- UINT treeNode; +- UINT branchValue; +- const SCHAR *pQuantVal; +- +- /* decode PCW_BODY */ +- treeNode = *pCurrentTree; /* get first node of current tree belonging to +- current codebook */ +- +- /* decode whole PCW-codeword-body */ +- while (1) { +- carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment, +- pLeftStartOfSegment, /* dummy */ +- FROM_LEFT_TO_RIGHT); +- *pRemainingBitsInSegment -= 1; +- *pNumDecodedBits += 1; +- +- CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode); +- +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */ +- break; /* end of branch in tree reached i.e. a whole PCW-Body is decoded +- */ +- } else { +- treeNode = *( +- pCurrentTree + +- branchValue); /* update treeNode for further step in decoding tree */ +- } +- } +- +- pQuantVal = +- pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4 +- quantized values */ +- +- return pQuantVal; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function decodes one escape sequence. In case of a +-escape codebook and in case of the absolute value of the quantized spectral +-value == 16, a escapeSequence is decoded in two steps: +- 1. escape prefix +- 2. escape word +--------------------------------------------------------------------------------------------- +-*/ +- +-static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT quantSpecCoef, INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, +- int *pNumDecodedBits) { +- UINT i; +- INT sign; +- UINT escapeOnesCounter = 0; +- UINT carryBit; +- INT escape_word = 0; +- +- /* decode escape prefix */ +- while (1) { +- carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment, +- pLeftStartOfSegment, /* dummy */ +- FROM_LEFT_TO_RIGHT); +- *pRemainingBitsInSegment -= 1; +- *pNumDecodedBits += 1; +- +- if (carryBit != 0) { +- escapeOnesCounter += 1; +- } else { +- escapeOnesCounter += 4; +- break; +- } +- } +- +- /* decode escape word */ +- for (i = escapeOnesCounter; i != 0; i--) { +- carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment, +- pLeftStartOfSegment, /* dummy */ +- FROM_LEFT_TO_RIGHT); +- *pRemainingBitsInSegment -= 1; +- *pNumDecodedBits += 1; +- +- escape_word <<= 1; +- escape_word = escape_word | carryBit; +- } +- +- sign = (quantSpecCoef >= 0) ? 1 : -1; +- +- quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word); +- +- return quantSpecCoef; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decodes the Signbits of a priority codeword (PCW) and writes +-out the resulting quantized spectral values into unsorted sections +------------------------------------------------------------------------------------------------ +- output: - two or four lines at position in corresponding section +-(which are not located at the desired position, i.e. they must be reordered in +-the last of eight function of HCR) +------------------------------------------------------------------------------------------------ +- return: - updated pQuantSpecCoef pointer (to next empty storage for a +-line) +--------------------------------------------------------------------------------------------- +-*/ +-static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- UINT codebookDim, const SCHAR *pQuantVal, +- FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx, +- INT *pLeftStartOfSegment, +- SCHAR *pRemainingBitsInSegment, +- int *pNumDecodedBits) { +- UINT i; +- UINT carryBit; +- INT quantSpecCoef; +- +- for (i = codebookDim; i != 0; i--) { +- quantSpecCoef = *pQuantVal++; +- if (quantSpecCoef != 0) { +- carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment, +- pLeftStartOfSegment, /* dummy */ +- FROM_LEFT_TO_RIGHT); +- *pRemainingBitsInSegment -= 1; +- *pNumDecodedBits += 1; +- if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024 >> 1)) { +- return -1; +- } +- +- /* adapt sign of values according to the decoded sign bit */ +- if (carryBit != 0) { +- pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef; +- } else { +- pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef; +- } +- } else { +- pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f); +- } +- *quantSpecCoefIdx += 1; +- if (*quantSpecCoefIdx >= 1024) { +- return -1; +- } +- } +- return 0; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Mutes spectral lines which have been marked as erroneous +-(Q_VALUE_INVALID) +--------------------------------------------------------------------------------------------- +-*/ +-void HcrMuteErroneousLines(H_HCR_INFO hHcr) { +- int c; +- FIXP_DBL *RESTRICT pLong = +- SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase); +- +- /* if there is a line with value Q_VALUE_INVALID mute it */ +- for (c = 0; c < 1024; c++) { +- if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) { +- pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */ +- } +- } +-} +diff --git a/libAACdec/src/aacdec_hcr.h b/libAACdec/src/aacdec_hcr.h +deleted file mode 100644 +index be21144..0000000 +--- a/libAACdec/src/aacdec_hcr.h ++++ /dev/null +@@ -1,128 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Interface function declaration; common defines +- and structures; defines for switching error-generator, +- -detector, and -concealment +- +-*******************************************************************************/ +- +-#ifndef AACDEC_HCR_H +-#define AACDEC_HCR_H +- +-#include "channelinfo.h" +-#include "FDK_bitstream.h" +- +-UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, +- HANDLE_FDK_BITSTREAM bs); +-UINT HcrDecoder(H_HCR_INFO hHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, +- HANDLE_FDK_BITSTREAM bs); +-void CarryBitToBranchValue(UCHAR carryBit, UINT treeNode, UINT *branchValue, +- UINT *branchNode); +- +-void CHcr_Read(HANDLE_FDK_BITSTREAM bs, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const MP4_ELEMENT_ID globalHcrType); +-void HcrMuteErroneousLines(H_HCR_INFO hHcr); +- +-void setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type); +-INT getHcrType(H_HCR_INFO hHcr); +- +-#endif /* AACDEC_HCR_H */ +diff --git a/libAACdec/src/aacdec_hcr_bit.cpp b/libAACdec/src/aacdec_hcr_bit.cpp +deleted file mode 100644 +index 0198659..0000000 +--- a/libAACdec/src/aacdec_hcr_bit.cpp ++++ /dev/null +@@ -1,164 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Bitstream reading +- +-*******************************************************************************/ +- +-#include "aacdec_hcr_bit.h" +- +-/*--------------------------------------------------------------------------------------------- +- description: This function toggles the read direction. +------------------------------------------------------------------------------------------------ +- input: current read direction +------------------------------------------------------------------------------------------------ +- return: new read direction +--------------------------------------------------------------------------------------------- +-*/ +-UCHAR ToggleReadDirection(UCHAR readDirection) { +- if (readDirection == FROM_LEFT_TO_RIGHT) { +- return FROM_RIGHT_TO_LEFT; +- } else { +- return FROM_LEFT_TO_RIGHT; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function returns a bit from the bitstream according to +-read direction. It is called very often, therefore it makes sense to inline it +-(runtime). +------------------------------------------------------------------------------------------------ +- input: - handle to FDK bitstream +- - reference value marking start of bitfield +- - pLeftStartOfSegment +- - pRightStartOfSegment +- - readDirection +------------------------------------------------------------------------------------------------ +- return: - bit from bitstream +--------------------------------------------------------------------------------------------- +-*/ +-UINT HcrGetABitFromBitstream(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT *pLeftStartOfSegment, +- INT *pRightStartOfSegment, UCHAR readDirection) { +- UINT bit; +- INT readBitOffset; +- +- if (readDirection == FROM_LEFT_TO_RIGHT) { +- readBitOffset = (INT)FDKgetValidBits(bs) - bsAnchor + *pLeftStartOfSegment; +- if (readBitOffset) { +- FDKpushBiDirectional(bs, readBitOffset); +- } +- +- bit = FDKreadBits(bs, 1); +- +- *pLeftStartOfSegment += 1; +- } else { +- readBitOffset = (INT)FDKgetValidBits(bs) - bsAnchor + *pRightStartOfSegment; +- if (readBitOffset) { +- FDKpushBiDirectional(bs, readBitOffset); +- } +- +- /* to be replaced with a brother function of FDKreadBits() */ +- bit = FDKreadBits(bs, 1); +- FDKpushBack(bs, 2); +- +- *pRightStartOfSegment -= 1; +- } +- +- return (bit); +-} +diff --git a/libAACdec/src/aacdec_hcr_bit.h b/libAACdec/src/aacdec_hcr_bit.h +deleted file mode 100644 +index 77242ac..0000000 +--- a/libAACdec/src/aacdec_hcr_bit.h ++++ /dev/null +@@ -1,114 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Bitstream reading prototypes +- +-*******************************************************************************/ +- +-#ifndef AACDEC_HCR_BIT_H +-#define AACDEC_HCR_BIT_H +- +-#include "aacdec_hcr.h" +- +-UCHAR ToggleReadDirection(UCHAR readDirection); +- +-UINT HcrGetABitFromBitstream(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT *pLeftStartOfSegment, +- INT *pRightStartOfSegment, UCHAR readDirection); +- +-#endif /* AACDEC_HCR_BIT_H */ +diff --git a/libAACdec/src/aacdec_hcr_types.h b/libAACdec/src/aacdec_hcr_types.h +deleted file mode 100644 +index 1cc3cb0..0000000 +--- a/libAACdec/src/aacdec_hcr_types.h ++++ /dev/null +@@ -1,432 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Common defines and structures; defines for +- switching error-generator, -detector, and -concealment; +- +-*******************************************************************************/ +- +-#ifndef AACDEC_HCR_TYPES_H +-#define AACDEC_HCR_TYPES_H +- +-#include "FDK_bitstream.h" +-#include "overlapadd.h" +- +-/* ------------------------------------------------ */ +-/* ------------------------------------------------ */ +- +-#define LINES_PER_UNIT 4 +- +-/* ------------------------------------------------ */ +-/* ------------------------------------------------ */ +-/* ----------- basic HCR configuration ------------ */ +- +-#define MAX_SFB_HCR \ +- (((1024 / 8) / LINES_PER_UNIT) * 8) /* (8 * 16) is not enough because sfbs \ +- are split in units for blocktype \ +- short */ +-#define NUMBER_OF_UNIT_GROUPS (LINES_PER_UNIT * 8) +-#define LINES_PER_UNIT_GROUP (1024 / NUMBER_OF_UNIT_GROUPS) /* 15 16 30 32 */ +- +-/* ------------------------------------------------ */ +-/* ------------------------------------------------ */ +-/* ------------------------------------------------ */ +- +-#define FROM_LEFT_TO_RIGHT 0 +-#define FROM_RIGHT_TO_LEFT 1 +- +-#define MAX_CB_PAIRS 23 +-#define MAX_HCR_SETS 14 +- +-#define ESCAPE_VALUE 16 +-#define POSITION_OF_FLAG_A 21 +-#define POSITION_OF_FLAG_B 20 +- +-#define MAX_CB 32 /* last used CB is cb #31 when VCB11 is used */ +- +-#define MAX_CB_CHECK \ +- 32 /* support for VCB11 available -- is more general, could therefore used \ +- in both cases */ +- +-#define NUMBER_OF_BIT_IN_WORD 32 +- +-/* log */ +-#define THIRTYTWO_LOG_DIV_TWO_LOG 5 +-#define EIGHT_LOG_DIV_TWO_LOG 3 +-#define FOUR_LOG_DIV_TWO_LOG 2 +- +-/* borders */ +-#define CPE_TOP_LENGTH 12288 +-#define SCE_TOP_LENGTH 6144 +-#define LEN_OF_LONGEST_CW_TOP_LENGTH 49 +- +-/* qsc's of high level */ +-#define Q_VALUE_INVALID \ +- 8192 /* mark a invalid line with this value (to be concealed later on) */ +-#define HCR_DIRAC 500 /* a line of high level */ +- +-/* masks */ +-#define MASK_LEFT 0xFFF000 +-#define MASK_RIGHT 0xFFF +-#define CLR_BIT_10 0x3FF +-#define TEST_BIT_10 0x400 +- +-#define LEFT_OFFSET 12 +- +-/* when set HCR is replaced by a dummy-module which just fills the outputbuffer +- * with a dirac sequence */ +-/* use this if HCR is suspected to write in other modules -- if error is stell +- * there, HCR is innocent */ +- +-/* ------------------------------ */ +-/* - insert HCR errors - */ +-/* ------------------------------ */ +- +-/* modify input lengths -- high protected */ +-#define ERROR_LORSD 0 /* offset: error if different from zero */ +-#define ERROR_LOLC 0 /* offset: error if different from zero */ +- +-/* segments are earlier empty as expected when decoding PCWs */ +-#define ERROR_PCW_BODY \ +- 0 /* set a positive values to trigger the error (make segments earlyer \ +- appear to be empty) */ +-#define ERROR_PCW_BODY_SIGN \ +- 0 /* set a positive values to trigger the error (make segments earlyer \ +- appear to be empty) */ +-#define ERROR_PCW_BODY_SIGN_ESC \ +- 0 /* set a positive values to trigger the error (make segments earlyer \ +- appear to be empty) */ +- +-/* pretend there are too many bits decoded (enlarge length of codeword) at PCWs +- * -- use a positive value */ +-#define ERROR_PCW_BODY_ONLY_TOO_LONG \ +- 0 /* set a positive values to trigger the error */ +-#define ERROR_PCW_BODY_SIGN_TOO_LONG \ +- 0 /* set a positive values to trigger the error */ +-#define ERROR_PCW_BODY_SIGN_ESC_TOO_LONG \ +- 0 /* set a positive values to trigger the error */ +- +-/* modify HCR bitstream block */ +- +-#define MODULO_DIVISOR_HCR 30 +- +-/* ------------------------------ */ +-/* - detect HCR errors - */ +-/* ------------------------------ */ +-/* check input data */ +- +-/* during decoding */ +- +-/* all the segments are checked -- therefore -- if this check passes, its a kind +- of evidence that the decoded PCWs and non-PCWs are fine */ +- +-/* if a codeword is decoded there exists a border for the number of bits, which +- are allowed to read for this codeword. This border is the minimum of the +- length of the longest codeword (for the currently used codebook) and the +- separately transmitted 'lengthOfLongestCodeword' in this frame and channel. +- The number of decoded bits is counted (for PCWs only -- there it makes really +- sense in my opinion). If this number exceeds the border (derived as minimum +- -- see above), a error is detected. */ +- +-/* ----------------------------------------------------------------------------------------------------- +- This error check could be set to zero because due to a test within +- RVLC-Escape-huffman-Decoder a too long codeword could not be detected -- it +- seems that for RVLC-Escape-Codeword the coderoom is used to 100%. Therefore I +- assume that the coderoom is used to 100% also for the codebooks 1..11 used at +- HCR Therefore this test is deactivated pending further notice +- ----------------------------------------------------------------------------------------------------- +- */ +- +-/* test if the number of remaining bits in a segment is _below_ zero. If there +- are no errors the lowest allowed value for remainingBitsInSegment is zero. +- This check also could be set to zero (save runtime) */ +- +-/* other */ +-/* when set to '1', avoid setting the LAV-Flag in errorLog due to a +- previous-line-marking (at PCW decoder). A little more runtime is needed then +- when writing values out into output-buffer. */ +- +-/* ------------------------------ */ +-/* - conceal HCR errors - */ +-/* ------------------------------ */ +- +-#define HCR_ERROR_CONCEALMENT \ +- 1 /* if set to '1', HCR _mutes_ the erred quantized spectral coefficients */ +- +-// ------------------------------------------------------------------------------------------------------------------ +-// errorLog: A word of 32 bits used for +-// logging possible errors within HCR +-// in case of distorted +-// bitstreams. Table of all +-// known errors: +-// ------------------------------------------------------------------------------------------------------------------------ +-// bit fatal location meaning +-// ----+-----+-----------+-------------------------------------- +-#define SEGMENT_OVERRIDE_ERR_PCW_BODY \ +- 0x80000000 // 31 no PCW-Dec During PCW decoding it is checked after +- // every PCW if there are too many bits decoded (immediate +- // check). +-#define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN \ +- 0x40000000 // 30 no PCW-Dec During PCW decoding it is checked after +- // every PCW if there are too many bits decoded (immediate +- // check). +-#define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC \ +- 0x20000000 // 29 no PCW-Dec During PCW decoding it is checked after +- // every PCW if there are too many bits decoded (immediate +- // check). +-#define EXTENDED_SORTED_COUNTER_OVERFLOW \ +- 0x10000000 // 28 yes Init-Dec Error during extending sideinfo +- // (neither a PCW nor a nonPCW was decoded so far) +- // 0x08000000 // 27 reserved +- // 0x04000000 // 26 reserved +- // 0x02000000 // 25 reserved +- // 0x01000000 // 24 reserved +- // 0x00800000 // 23 reserved +- // 0x00400000 // 22 reserved +- // 0x00200000 // 21 reserved +- // 0x00100000 // 20 reserved +- +-/* special errors */ +-#define TOO_MANY_PCW_BODY_BITS_DECODED \ +- 0x00080000 // 19 yes PCW-Dec During PCW-body-decoding too many bits +- // have been read from bitstream -- advice: skip non-PCW decoding +-#define TOO_MANY_PCW_BODY_SIGN_BITS_DECODED \ +- 0x00040000 // 18 yes PCW-Dec During PCW-body-sign-decoding too many +- // bits have been read from bitstream -- advice: skip non-PCW +- // decoding +-#define TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED \ +- 0x00020000 // 17 yes PCW-Dec During PCW-body-sign-esc-decoding too +- // many bits have been read from bitstream -- advice: skip +- // non-PCW decoding +- +-// 0x00010000 // 16 reserved +-#define STATE_ERROR_BODY_ONLY \ +- 0x00008000 // 15 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN__BODY \ +- 0x00004000 // 14 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN__SIGN \ +- 0x00002000 // 13 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN_ESC__BODY \ +- 0x00001000 // 12 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN_ESC__SIGN \ +- 0x00000800 // 11 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX \ +- 0x00000400 // 10 no NonPCW-Dec State machine returned with error +-#define STATE_ERROR_BODY_SIGN_ESC__ESC_WORD \ +- 0x00000200 // 9 no NonPCW-Dec State machine returned with error +-#define HCR_SI_LENGTHS_FAILURE \ +- 0x00000100 // 8 yes Init-Dec LengthOfLongestCodeword must not be +- // less than lenghtOfReorderedSpectralData +-#define NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK \ +- 0x00000080 // 7 yes Init-Dec The number of sections is not within +- // the allowed range (short block) +-#define NUM_SECT_OUT_OF_RANGE_LONG_BLOCK \ +- 0x00000040 // 6 yes Init-Dec The number of sections is not within +- // the allowed range (long block) +-#define LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK \ +- 0x00000020 // 5 yes Init-Dec The number of lines per section is not +- // within the allowed range (short block) +-#define CB_OUT_OF_RANGE_SHORT_BLOCK \ +- 0x00000010 // 4 yes Init-Dec The codebook is not within the allowed +- // range (short block) +-#define LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK \ +- 0x00000008 // 3 yes Init-Dec The number of lines per section is not +- // within the allowed range (long block) +-#define CB_OUT_OF_RANGE_LONG_BLOCK \ +- 0x00000004 // 2 yes Init-Dec The codebook is not within the allowed +- // range (long block) +-#define LAV_VIOLATION \ +- 0x00000002 // 1 no Final The absolute value of at least one +- // decoded line was too high for the according codebook. +-#define BIT_IN_SEGMENTATION_ERROR \ +- 0x00000001 // 0 no Final After PCW and non-PWC-decoding at least +- // one segment is not zero (global check). +- +-/*----------*/ +-#define HCR_FATAL_PCW_ERROR_MASK 0x100E01FC +- +-typedef enum { PCW_BODY, PCW_BODY_SIGN, PCW_BODY_SIGN_ESC } PCW_TYPE; +- +-/* interface Decoder <---> HCR */ +-typedef struct { +- UINT errorLog; +- SPECTRAL_PTR pQuantizedSpectralCoefficientsBase; +- int quantizedSpectralCoefficientsIdx; +- SHORT lengthOfReorderedSpectralData; +- SHORT numSection; +- SHORT *pNumLineInSect; +- INT bitstreamAnchor; +- SCHAR lengthOfLongestCodeword; +- UCHAR *pCodebook; +-} HCR_INPUT_OUTPUT; +- +-typedef struct { +- const UCHAR *pMinOfCbPair; +- const UCHAR *pMaxOfCbPair; +-} HCR_CB_PAIRS; +- +-typedef struct { +- const USHORT *pLargestAbsVal; +- const UCHAR *pMaxCwLength; +- const UCHAR *pCbDimension; +- const UCHAR *pCbDimShift; +- const UCHAR *pCbSign; +- const UCHAR *pCbPriority; +-} HCR_TABLE_INFO; +- +-typedef struct { +- UINT numSegment; +- UINT pSegmentBitfield[((1024 >> 1) / NUMBER_OF_BIT_IN_WORD + 1)]; +- UINT pCodewordBitfield[((1024 >> 1) / NUMBER_OF_BIT_IN_WORD + 1)]; +- UINT segmentOffset; +- INT pLeftStartOfSegment[1024 >> 1]; +- INT pRightStartOfSegment[1024 >> 1]; +- SCHAR pRemainingBitsInSegment[1024 >> 1]; +- UCHAR readDirection; +- UCHAR numWordForBitfield; +- USHORT pNumBitValidInLastWord; +-} HCR_SEGMENT_INFO; +- +-typedef struct { +- UINT numCodeword; +- UINT numSortedSection; +- USHORT pNumCodewordInSection[MAX_SFB_HCR]; +- USHORT pNumSortedCodewordInSection[MAX_SFB_HCR]; +- USHORT pNumExtendedSortedCodewordInSection[MAX_SFB_HCR + MAX_HCR_SETS]; +- int numExtendedSortedCodewordInSectionIdx; +- USHORT pNumExtendedSortedSectionsInSets[MAX_HCR_SETS]; +- int numExtendedSortedSectionsInSetsIdx; +- USHORT pReorderOffset[MAX_SFB_HCR]; +- UCHAR pSortedCodebook[MAX_SFB_HCR]; +- +- UCHAR pExtendedSortedCodebook[MAX_SFB_HCR + MAX_HCR_SETS]; +- int extendedSortedCodebookIdx; +- UCHAR pMaxLenOfCbInExtSrtSec[MAX_SFB_HCR + MAX_HCR_SETS]; +- int maxLenOfCbInExtSrtSecIdx; +- UCHAR pCodebookSwitch[MAX_SFB_HCR]; +-} HCR_SECTION_INFO; +- +-typedef UINT (*STATEFUNC)(HANDLE_FDK_BITSTREAM, void *); +- +-typedef struct { +- /* worst-case and 1024/4 non-PCWs exist in worst-case */ +- FIXP_DBL +- *pResultBase; /* Base address for spectral data output target buffer */ +- UINT iNode[1024 >> 2]; /* Helper indices for code books */ +- USHORT +- iResultPointer[1024 >> 2]; /* Helper indices for accessing pResultBase */ +- UINT pEscapeSequenceInfo[1024 >> 2]; +- UINT codewordOffset; +- STATEFUNC pState; +- UCHAR pCodebook[1024 >> 2]; +- UCHAR pCntSign[1024 >> 2]; +- /* this array holds the states coded as integer values within the range +- * [0,1,..,7] */ +- SCHAR pSta[1024 >> 2]; +-} HCR_NON_PCW_SIDEINFO; +- +-typedef struct { +- HCR_INPUT_OUTPUT decInOut; +- HCR_SEGMENT_INFO segmentInfo; +- HCR_SECTION_INFO sectionInfo; +- HCR_NON_PCW_SIDEINFO nonPcwSideinfo; +-} CErHcrInfo; +- +-typedef CErHcrInfo *H_HCR_INFO; +- +-#endif /* AACDEC_HCR_TYPES_H */ +diff --git a/libAACdec/src/aacdec_hcrs.cpp b/libAACdec/src/aacdec_hcrs.cpp +deleted file mode 100644 +index d2bc867..0000000 +--- a/libAACdec/src/aacdec_hcrs.cpp ++++ /dev/null +@@ -1,1551 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Prepare decoding of non-PCWs, segmentation- and +- bitfield-handling, HCR-Statemachine +- +-*******************************************************************************/ +- +-#include "aacdec_hcrs.h" +- +-#include "aacdec_hcr.h" +- +-#include "aacdec_hcr_bit.h" +-#include "aac_rom.h" +-#include "aac_ram.h" +- +-static UINT InitSegmentBitfield(UINT *pNumSegment, +- SCHAR *pRemainingBitsInSegment, +- UINT *pSegmentBitfield, +- UCHAR *pNumWordForBitfield, +- USHORT *pNumBitValidInLastWord); +- +-static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr); +- +-static INT ModuloValue(INT input, INT bufferlength); +- +-static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset, +- UINT *pBitfield); +- +-/*--------------------------------------------------------------------------------------------- +- description: This function decodes all non-priority codewords (non-PCWs) by +-using a state-machine. +--------------------------------------------------------------------------------------------- +-*/ +-void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) { +- UINT numValidSegment; +- INT segmentOffset; +- INT codewordOffsetBase; +- INT codewordOffset; +- UINT trial; +- +- UINT *pNumSegment; +- SCHAR *pRemainingBitsInSegment; +- UINT *pSegmentBitfield; +- UCHAR *pNumWordForBitfield; +- USHORT *pNumBitValidInLastWord; +- UINT *pCodewordBitfield; +- INT bitfieldWord; +- INT bitInWord; +- UINT tempWord; +- UINT interMediateWord; +- INT tempBit; +- INT carry; +- +- UINT numCodeword; +- UCHAR numSet; +- UCHAR currentSet; +- UINT codewordInSet; +- UINT remainingCodewordsInSet; +- SCHAR *pSta; +- UINT ret; +- +- pNumSegment = &(pHcr->segmentInfo.numSegment); +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield); +- pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord); +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- numValidSegment = InitSegmentBitfield(pNumSegment, pRemainingBitsInSegment, +- pSegmentBitfield, pNumWordForBitfield, +- pNumBitValidInLastWord); +- +- if (numValidSegment != 0) { +- numCodeword = pHcr->sectionInfo.numCodeword; +- numSet = ((numCodeword - 1) / *pNumSegment) + 1; +- +- pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT; +- +- /* Process sets subsequently */ +- for (currentSet = 1; currentSet < numSet; currentSet++) { +- /* step 1 */ +- numCodeword -= +- *pNumSegment; /* number of remaining non PCWs [for all sets] */ +- if (numCodeword < *pNumSegment) { +- codewordInSet = numCodeword; /* for last set */ +- } else { +- codewordInSet = *pNumSegment; /* for all sets except last set */ +- } +- +- /* step 2 */ +- /* prepare array 'CodewordBitfield'; as much ones are written from left in +- * all words, as much decodedCodewordInSetCounter nonPCWs exist in this +- * set */ +- tempWord = 0xFFFFFFFF; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- +- for (bitfieldWord = *pNumWordForBitfield; bitfieldWord != 0; +- bitfieldWord--) { /* loop over all used words */ +- if (codewordInSet > NUMBER_OF_BIT_IN_WORD) { /* more codewords than +- number of bits => fill +- ones */ +- /* fill a whole word with ones */ +- *pCodewordBitfield++ = tempWord; +- codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */ +- } else { +- /* prepare last tempWord */ +- for (remainingCodewordsInSet = codewordInSet; +- remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD; +- remainingCodewordsInSet++) { +- tempWord = +- tempWord & +- ~(1 +- << (NUMBER_OF_BIT_IN_WORD - 1 - +- remainingCodewordsInSet)); /* set a zero at bit number +- (NUMBER_OF_BIT_IN_WORD-1-i) +- in tempWord */ +- } +- *pCodewordBitfield++ = tempWord; +- tempWord = 0x00000000; +- } +- } +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- +- /* step 3 */ +- /* build non-PCW sideinfo for each non-PCW of the current set */ +- InitNonPCWSideInformationForCurrentSet(pHcr); +- +- /* step 4 */ +- /* decode all non-PCWs belonging to this set */ +- +- /* loop over trials */ +- codewordOffsetBase = 0; +- for (trial = *pNumSegment; trial > 0; trial--) { +- /* loop over number of words in bitfields */ +- segmentOffset = 0; /* start at zero in every segment */ +- pHcr->segmentInfo.segmentOffset = +- segmentOffset; /* store in structure for states */ +- codewordOffset = codewordOffsetBase; +- pHcr->nonPcwSideinfo.codewordOffset = +- codewordOffset; /* store in structure for states */ +- +- for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield; +- bitfieldWord++) { +- /* derive tempWord with bitwise and */ +- tempWord = +- pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord]; +- +- /* if tempWord is not zero, decode something */ +- if (tempWord != 0) { +- /* loop over all bits in tempWord; start state machine if & is true +- */ +- for (bitInWord = NUMBER_OF_BIT_IN_WORD; bitInWord > 0; +- bitInWord--) { +- interMediateWord = ((UINT)1 << (bitInWord - 1)); +- if ((tempWord & interMediateWord) == interMediateWord) { +- /* get state and start state machine */ +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; +- +- while (pHcr->nonPcwSideinfo.pState) { +- ret = ((STATEFUNC)pHcr->nonPcwSideinfo.pState)(bs, pHcr); +- if (ret != 0) { +- return; +- } +- } +- } +- +- /* update both offsets */ +- segmentOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ +- pHcr->segmentInfo.segmentOffset = segmentOffset; +- codewordOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ +- codewordOffset = +- ModuloValue(codewordOffset, +- *pNumSegment); /* index of the current codeword +- lies within modulo range */ +- pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; +- } +- } else { +- segmentOffset += +- NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ +- pHcr->segmentInfo.segmentOffset = segmentOffset; +- codewordOffset += +- NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ +- codewordOffset = ModuloValue( +- codewordOffset, +- *pNumSegment); /* index of the current codeword lies within +- modulo range */ +- pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; +- } +- } /* end of bitfield word loop */ +- +- /* decrement codeword - pointer */ +- codewordOffsetBase -= 1; +- codewordOffsetBase = +- ModuloValue(codewordOffsetBase, *pNumSegment); /* index of the +- current codeword +- base lies within +- modulo range */ +- +- /* rotate numSegment bits in codewordBitfield */ +- /* rotation of *numSegment bits in bitfield of codewords +- * (circle-rotation) */ +- /* get last valid bit */ +- tempBit = pCodewordBitfield[*pNumWordForBitfield - 1] & +- (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); +- tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); +- +- /* write zero into place where tempBit was fetched from */ +- pCodewordBitfield[*pNumWordForBitfield - 1] = +- pCodewordBitfield[*pNumWordForBitfield - 1] & +- ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); +- +- /* rotate last valid word */ +- pCodewordBitfield[*pNumWordForBitfield - 1] = +- pCodewordBitfield[*pNumWordForBitfield - 1] >> 1; +- +- /* transfare carry bit 0 from current word into bitposition 31 from next +- * word and rotate current word */ +- for (bitfieldWord = *pNumWordForBitfield - 2; bitfieldWord > -1; +- bitfieldWord--) { +- /* get carry (=bit at position 0) from current word */ +- carry = pCodewordBitfield[bitfieldWord] & 1; +- +- /* put the carry bit at position 31 into word right from current word +- */ +- pCodewordBitfield[bitfieldWord + 1] = +- pCodewordBitfield[bitfieldWord + 1] | +- (carry << (NUMBER_OF_BIT_IN_WORD - 1)); +- +- /* shift current word */ +- pCodewordBitfield[bitfieldWord] = +- pCodewordBitfield[bitfieldWord] >> 1; +- } +- +- /* put tempBit into free bit-position 31 from first word */ +- pCodewordBitfield[0] = +- pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD - 1)); +- +- } /* end of trial loop */ +- +- /* toggle read direction */ +- pHcr->segmentInfo.readDirection = +- ToggleReadDirection(pHcr->segmentInfo.readDirection); +- } +- /* end of set loop */ +- +- /* all non-PCWs of this spectrum are decoded */ +- } +- +- /* all PCWs and all non PCWs are decoded. They are unbacksorted in output +- * buffer. Here is the Interface with comparing QSCs to asm decoding */ +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function prepares the bitfield used for the +- segments. The list is set up once to be used in all +-following sets. If a segment is decoded empty, the according bit from the +-Bitfield is removed. +------------------------------------------------------------------------------------------------ +- return: numValidSegment = the number of valid segments +--------------------------------------------------------------------------------------------- +-*/ +-static UINT InitSegmentBitfield(UINT *pNumSegment, +- SCHAR *pRemainingBitsInSegment, +- UINT *pSegmentBitfield, +- UCHAR *pNumWordForBitfield, +- USHORT *pNumBitValidInLastWord) { +- SHORT i; +- USHORT r; +- UCHAR bitfieldWord; +- UINT tempWord; +- USHORT numValidSegment; +- +- *pNumWordForBitfield = +- (*pNumSegment == 0) +- ? 0 +- : ((*pNumSegment - 1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; +- +- /* loop over all words, which are completely used or only partial */ +- /* bit in pSegmentBitfield is zero if segment is empty; bit in +- * pSegmentBitfield is one if segment is not empty */ +- numValidSegment = 0; +- *pNumBitValidInLastWord = *pNumSegment; +- +- /* loop over words */ +- for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield - 1; +- bitfieldWord++) { +- tempWord = 0xFFFFFFFF; /* set ones */ +- r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; +- for (i = 0; i < NUMBER_OF_BIT_IN_WORD; i++) { +- if (pRemainingBitsInSegment[r + i] == 0) { +- tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 - +- i)); /* set a zero at bit number +- (NUMBER_OF_BIT_IN_WORD-1-i) in +- tempWord */ +- } else { +- numValidSegment += 1; /* count segments which are not empty */ +- } +- } +- pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ +- *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of +- zeros on LSB side in +- the last word */ +- } +- +- /* calculate last word: prepare special tempWord */ +- tempWord = 0xFFFFFFFF; +- for (i = 0; i < (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); i++) { +- tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */ +- } +- +- /* calculate last word */ +- r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; +- for (i = 0; i < *pNumBitValidInLastWord; i++) { +- if (pRemainingBitsInSegment[r + i] == 0) { +- tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 - +- i)); /* set a zero at bit number +- (NUMBER_OF_BIT_IN_WORD-1-i) in +- tempWord */ +- } else { +- numValidSegment += 1; /* count segments which are not empty */ +- } +- } +- pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ +- +- return numValidSegment; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function sets up sideinfo for the non-PCW decoder (for the +-current set). +----------------------------------------------------------------------------------------------*/ +-static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) { +- USHORT i, k; +- UCHAR codebookDim; +- UINT startNode; +- +- UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook; +- UINT *iNode = pHcr->nonPcwSideinfo.iNode; +- UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign; +- USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; +- SCHAR *pSta = pHcr->nonPcwSideinfo.pSta; +- USHORT *pNumExtendedSortedCodewordInSection = +- pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; +- int numExtendedSortedCodewordInSectionIdx = +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; +- UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; +- int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; +- USHORT *pNumExtendedSortedSectionsInSets = +- pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; +- int numExtendedSortedSectionsInSetsIdx = +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; +- int quantizedSpectralCoefficientsIdx = +- pHcr->decInOut.quantizedSpectralCoefficientsIdx; +- const UCHAR *pCbDimension = aDimCb; +- int iterationCounter = 0; +- +- /* loop over number of extended sorted sections in the current set so all +- * codewords sideinfo variables within this set can be prepared for decoding +- */ +- for (i = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; +- i != 0; i--) { +- codebookDim = +- pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; +- startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; +- +- for (k = pNumExtendedSortedCodewordInSection +- [numExtendedSortedCodewordInSectionIdx]; +- k != 0; k--) { +- iterationCounter++; +- if (iterationCounter > (1024 >> 2)) { +- return; +- } +- *pSta++ = aCodebook2StartInt +- [pExtendedSortedCodebook[extendedSortedCodebookIdx]]; +- *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx]; +- *iNode++ = startNode; +- *pCntSign++ = 0; +- *iResultPointer++ = quantizedSpectralCoefficientsIdx; +- *pEscapeSequenceInfo++ = 0; +- quantizedSpectralCoefficientsIdx += +- codebookDim; /* update pointer by codebookDim --> point to next +- starting value for writing out */ +- if (quantizedSpectralCoefficientsIdx >= 1024) { +- return; +- } +- } +- numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in +- current set */ +- extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set +- */ +- if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS) || +- extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- return; +- } +- } +- numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */ +- if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) { +- return; +- } +- +- /* Write back indexes */ +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = +- numExtendedSortedCodewordInSectionIdx; +- pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; +- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = +- numExtendedSortedSectionsInSetsIdx; +- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = +- numExtendedSortedCodewordInSectionIdx; +- pHcr->decInOut.quantizedSpectralCoefficientsIdx = +- quantizedSpectralCoefficientsIdx; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function returns the input value if the value is in the +- range of bufferlength. If is smaller, one bufferlength +-is added, if is bigger one bufferlength is subtracted. +------------------------------------------------------------------------------------------------ +- return: modulo result +--------------------------------------------------------------------------------------------- +-*/ +-static INT ModuloValue(INT input, INT bufferlength) { +- if (input > (bufferlength - 1)) { +- return (input - bufferlength); +- } +- if (input < 0) { +- return (input + bufferlength); +- } +- return input; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This function clears a bit from current bitfield and +- switches off the statemachine. +- +- A bit is cleared in two cases: +- a) a codeword is decoded, then a bit is cleared in codeword +-bitfield b) a segment is decoded empty, then a bit is cleared in segment +-bitfield +--------------------------------------------------------------------------------------------- +-*/ +-static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset, +- UINT *pBitfield) { +- UINT numBitfieldWord; +- UINT numBitfieldBit; +- +- /* get both values needed for clearing the bit */ +- numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int = wordNr */ +- numBitfieldBit = offset - (numBitfieldWord +- << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr */ +- +- /* clear a bit in bitfield */ +- pBitfield[numBitfieldWord] = +- pBitfield[numBitfieldWord] & +- ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 - numBitfieldBit)); +- +- /* switch off state machine because codeword is decoded and/or because segment +- * is empty */ +- *ptrState = NULL; +-} +- +-/* ========================================================================================= +- the states of the statemachine +- ========================================================================================= +- */ +- +-/*--------------------------------------------------------------------------------------------- +- description: Decodes the body of a codeword. This State is used for +-codebooks 1,2,5 and 6. No sign bits are decoded, because the table of the +-quantized spectral values has got a valid sign at the quantized spectral lines. +------------------------------------------------------------------------------------------------ +- output: Two or four quantizes spectral values written at position +-where pResultPointr points to +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- FIXP_DBL *pResultBase; +- UINT *iNode; +- USHORT *iResultPointer; +- UINT codewordOffset; +- UINT branchNode; +- UINT branchValue; +- UINT iQSC; +- UINT treeNode; +- UCHAR carryBit; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- SCHAR *pRemainingBitsInSegment; +- UCHAR readDirection; +- UCHAR *pCodebook; +- UCHAR dimCntr; +- const UINT *pCurrentTree; +- const UCHAR *pCbDimension; +- const SCHAR *pQuantVal; +- const SCHAR *pQuantValBase; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- pCodebook = pHcr->nonPcwSideinfo.pCodebook; +- iNode = pHcr->nonPcwSideinfo.iNode; +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- +- pCbDimension = aDimCb; +- +- treeNode = iNode[codewordOffset]; +- pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; +- +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ +- treeNode, &branchValue, &branchNode); +- +- /* if end of branch reached write out lines and count bits needed for sign, +- * otherwise store node in codeword sideinfo */ +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; ==> body is complete */ +- pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base +- address of +- quantized +- values +- belonging to +- current +- codebook */ +- pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid +- line [of 2 or 4 quantized +- values] */ +- +- iQSC = iResultPointer[codewordOffset]; /* get position of first line for +- writing out result */ +- +- for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; +- dimCntr--) { +- pResultBase[iQSC++] = +- (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into +- spectrum; no Sign bits +- available in this state */ +- } +- +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- break; /* end of branch in tree reached i.e. a whole nonPCW-Body is +- decoded */ +- } else { /* body is not decoded completely: */ +- treeNode = *( +- pCurrentTree + +- branchValue); /* update treeNode for further step in decoding tree */ +- } +- } +- iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe +- decoding of codeword body not finished +- yet */ +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY; +- return BODY_ONLY; +- } +- } +- +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decodes the codeword body, writes out result and counts the +-number of quantized spectral values, which are different form zero. For those +-values sign bits are needed. +- +- If sign bit counter cntSign is different from zero, switch to +-next state to decode sign Bits there. If sign bit counter cntSign is zero, no +-sign bits are needed and codeword is decoded. +------------------------------------------------------------------------------------------------ +- output: Two or four written quantizes spectral values written at +-position where pResultPointr points to. The signs of those lines may be wrong. +-If the signs [on just one signle sign] is wrong, the next state will correct it. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- +- UCHAR *pCodebook; +- UINT *iNode; +- UCHAR *pCntSign; +- FIXP_DBL *pResultBase; +- USHORT *iResultPointer; +- UINT codewordOffset; +- +- UINT iQSC; +- UINT cntSign; +- UCHAR dimCntr; +- UCHAR carryBit; +- SCHAR *pSta; +- UINT treeNode; +- UINT branchValue; +- UINT branchNode; +- const UCHAR *pCbDimension; +- const UINT *pCurrentTree; +- const SCHAR *pQuantValBase; +- const SCHAR *pQuantVal; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- pCodebook = pHcr->nonPcwSideinfo.pCodebook; +- iNode = pHcr->nonPcwSideinfo.iNode; +- pCntSign = pHcr->nonPcwSideinfo.pCntSign; +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- pCbDimension = aDimCb; +- +- treeNode = iNode[codewordOffset]; +- pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; +- +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ +- treeNode, &branchValue, &branchNode); +- +- /* if end of branch reached write out lines and count bits needed for sign, +- * otherwise store node in codeword sideinfo */ +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; if set body complete */ +- /* body completely decoded; branchValue is valid, set pQuantVal to first +- * (of two or four) quantized spectral coefficients */ +- pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base +- address of +- quantized +- values +- belonging to +- current +- codebook */ +- pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid +- line [of 2 or 4 quantized +- values] */ +- +- iQSC = iResultPointer[codewordOffset]; /* get position of first line for +- writing result */ +- +- /* codeword decoding result is written out here: Write out 2 or 4 +- * quantized spectral values with probably */ +- /* wrong sign and count number of values which are different from zero for +- * sign bit decoding [which happens in next state] */ +- cntSign = 0; +- for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; +- dimCntr--) { +- pResultBase[iQSC++] = +- (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ +- if (*pQuantVal++ != 0) { +- cntSign += 1; +- } +- } +- +- if (cntSign == 0) { +- ClearBitFromBitfield( +- &(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and switch off +- statemachine */ +- } else { +- pCntSign[codewordOffset] = cntSign; /* write sign count result into +- codewordsideinfo of current +- codeword */ +- pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */ +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; /* get state from +- separate array of +- cw-sideinfo */ +- } +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- break; /* end of branch in tree reached i.e. a whole nonPCW-Body is +- decoded */ +- } else { /* body is not decoded completely: */ +- treeNode = *( +- pCurrentTree + +- branchValue); /* update treeNode for further step in decoding tree */ +- } +- } +- iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe +- decoding of codeword body not finished +- yet */ +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY; +- return BODY_SIGN__BODY; +- } +- } +- +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This state decodes the sign bits belonging to a codeword. The +-state is called as often in different "trials" until pCntSgn[codewordOffset] is +-zero. +------------------------------------------------------------------------------------------------ +- output: The two or four quantizes spectral values (written in previous +-state) have now the correct sign. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- +- UCHAR *pCntSign; +- FIXP_DBL *pResultBase; +- USHORT *iResultPointer; +- UINT codewordOffset; +- +- UCHAR carryBit; +- UINT iQSC; +- UCHAR cntSign; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- /*pCodebook = */ +- pCntSign = pHcr->nonPcwSideinfo.pCntSign; +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- +- iQSC = iResultPointer[codewordOffset]; +- cntSign = pCntSign[codewordOffset]; +- +- /* loop for sign bit decoding */ +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- cntSign -= +- 1; /* decrement sign counter because one sign bit has been read */ +- +- /* search for a line (which was decoded in previous state) which is not +- * zero. [This value will get a sign] */ +- while (pResultBase[iQSC] == (FIXP_DBL)0) { +- if (++iQSC >= 1024) { /* points to current value different from zero */ +- return BODY_SIGN__SIGN; +- } +- } +- +- /* put sign together with line; if carryBit is zero, the sign is ok already; +- * no write operation necessary in this case */ +- if (carryBit != 0) { +- pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */ +- } +- +- iQSC++; /* update pointer to next (maybe valid) value */ +- +- if (cntSign == 0) { /* if (cntSign==0) ==> set state CODEWORD_DECODED */ +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- break; /* whole nonPCW-Body and according sign bits are decoded */ +- } +- } +- pCntSign[codewordOffset] = cntSign; +- iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */ +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN; +- return BODY_SIGN__SIGN; +- } +- } +- +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decodes the codeword body in case of codebook is 11. Writes +-out resulting two or four lines [with probably wrong sign] and counts the number +-of lines, which are different form zero. This information is needed in next +- state where sign bits will be decoded, if necessary. +- If sign bit counter cntSign is zero, no sign bits are needed +-and codeword is decoded completely. +------------------------------------------------------------------------------------------------ +- output: Two lines (quantizes spectral coefficients) which are probably +-wrong. The sign may be wrong and if one or two values is/are 16, the following +-states will decode the escape sequence to correct the values which are wirtten +-here. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- +- UINT *iNode; +- UCHAR *pCntSign; +- FIXP_DBL *pResultBase; +- USHORT *iResultPointer; +- UINT codewordOffset; +- +- UCHAR carryBit; +- UINT iQSC; +- UINT cntSign; +- UINT dimCntr; +- UINT treeNode; +- SCHAR *pSta; +- UINT branchNode; +- UINT branchValue; +- const UINT *pCurrentTree; +- const SCHAR *pQuantValBase; +- const SCHAR *pQuantVal; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- iNode = pHcr->nonPcwSideinfo.iNode; +- pCntSign = pHcr->nonPcwSideinfo.pCntSign; +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- treeNode = iNode[codewordOffset]; +- pCurrentTree = aHuffTable[ESCAPE_CODEBOOK]; +- +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- /* make a step in tree */ +- CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode); +- +- /* if end of branch reached write out lines and count bits needed for sign, +- * otherwise store node in codeword sideinfo */ +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; if set body complete */ +- +- /* body completely decoded; branchValue is valid */ +- /* set pQuantVol to first (of two or four) quantized spectral coefficients +- */ +- pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of +- quantized values +- belonging to current +- codebook */ +- pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid +- line [of 2 or 4 quantized +- values] */ +- +- /* make backup from original resultPointer in node storage for state +- * BODY_SIGN_ESC__SIGN */ +- iNode[codewordOffset] = iResultPointer[codewordOffset]; +- +- /* get position of first line for writing result */ +- iQSC = iResultPointer[codewordOffset]; +- +- /* codeword decoding result is written out here: Write out 2 or 4 +- * quantized spectral values with probably */ +- /* wrong sign and count number of values which are different from zero for +- * sign bit decoding [which happens in next state] */ +- cntSign = 0; +- +- for (dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr--) { +- pResultBase[iQSC++] = +- (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ +- if (*pQuantVal++ != 0) { +- cntSign += 1; +- } +- } +- +- if (cntSign == 0) { +- ClearBitFromBitfield( +- &(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and switch off +- statemachine */ +- /* codeword decoded */ +- } else { +- /* write sign count result into codewordsideinfo of current codeword */ +- pCntSign[codewordOffset] = cntSign; +- pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */ +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; /* get state from +- separate array of +- cw-sideinfo */ +- } +- pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation +- of for loop counter (see +- above) is done here */ +- break; /* end of branch in tree reached i.e. a whole nonPCW-Body is +- decoded */ +- } else { /* body is not decoded completely: */ +- /* update treeNode for further step in decoding tree and store updated +- * treeNode because maybe no more bits left in segment */ +- treeNode = *(pCurrentTree + branchValue); +- iNode[codewordOffset] = treeNode; +- } +- } +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY; +- return BODY_SIGN_ESC__BODY; +- } +- } +- +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: This state decodes the sign bits, if a codeword of codebook 11 +-needs some. A flag named 'flagB' in codeword sideinfo is set, if the second line +-of quantized spectral values is 16. The 'flagB' is used in case of decoding of a +-escape sequence is necessary as far as the second line is concerned. +- +- If only the first line needs an escape sequence, the flagB is +-cleared. If only the second line needs an escape sequence, the flagB is not +-used. +- +- For storing sideinfo in case of escape sequence decoding one +-single word can be used for both escape sequences because they are decoded not +-at the same time: +- +- +- bit 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 +-4 3 2 1 0 +- ===== == == =========== =========== +-=================================== ^ ^ ^ ^ ^ +-^ | | | | | | res. flagA flagB +-escapePrefixUp escapePrefixDown escapeWord +- +------------------------------------------------------------------------------------------------ +- output: Two lines with correct sign. If one or two values is/are 16, +-the lines are not valid, otherwise they are. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- +- UINT *iNode; +- UCHAR *pCntSign; +- FIXP_DBL *pResultBase; +- USHORT *iResultPointer; +- UINT *pEscapeSequenceInfo; +- UINT codewordOffset; +- +- UINT iQSC; +- UCHAR cntSign; +- UINT flagA; +- UINT flagB; +- UINT flags; +- UCHAR carryBit; +- SCHAR *pSta; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- iNode = pHcr->nonPcwSideinfo.iNode; +- pCntSign = pHcr->nonPcwSideinfo.pCntSign; +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- iQSC = iResultPointer[codewordOffset]; +- cntSign = pCntSign[codewordOffset]; +- +- /* loop for sign bit decoding */ +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- /* decrement sign counter because one sign bit has been read */ +- cntSign -= 1; +- pCntSign[codewordOffset] = cntSign; +- +- /* get a quantized spectral value (which was decoded in previous state) +- * which is not zero. [This value will get a sign] */ +- while (pResultBase[iQSC] == (FIXP_DBL)0) { +- if (++iQSC >= 1024) { +- return BODY_SIGN_ESC__SIGN; +- } +- } +- iResultPointer[codewordOffset] = iQSC; +- +- /* put negative sign together with quantized spectral value; if carryBit is +- * zero, the sign is ok already; no write operation necessary in this case +- */ +- if (carryBit != 0) { +- pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */ +- } +- iQSC++; /* update index to next (maybe valid) value */ +- iResultPointer[codewordOffset] = iQSC; +- +- if (cntSign == 0) { +- /* all sign bits are decoded now */ +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- +- /* check decoded values if codeword is decoded: Check if one or two escape +- * sequences 16 follow */ +- +- /* step 0 */ +- /* restore pointer to first decoded quantized value [ = original +- * pResultPointr] from index iNode prepared in State_BODY_SIGN_ESC__BODY +- */ +- iQSC = iNode[codewordOffset]; +- +- /* step 1 */ +- /* test first value if escape sequence follows */ +- flagA = 0; /* for first possible escape sequence */ +- if (fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE) { +- flagA = 1; +- } +- +- /* step 2 */ +- /* test second value if escape sequence follows */ +- flagB = 0; /* for second possible escape sequence */ +- if (fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE) { +- flagB = 1; +- } +- +- /* step 3 */ +- /* evaluate flag result and go on if necessary */ +- if (!flagA && !flagB) { +- ClearBitFromBitfield( +- &(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and switch off +- statemachine */ +- } else { +- /* at least one of two lines is 16 */ +- /* store both flags at correct positions in non PCW codeword sideinfo +- * pEscapeSequenceInfo[codewordOffset] */ +- flags = flagA << POSITION_OF_FLAG_A; +- flags |= (flagB << POSITION_OF_FLAG_B); +- pEscapeSequenceInfo[codewordOffset] = flags; +- +- /* set next state */ +- pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; /* get state from +- separate array of +- cw-sideinfo */ +- +- /* set result pointer to the first line of the two decoded lines */ +- iResultPointer[codewordOffset] = iNode[codewordOffset]; +- +- if (!flagA && flagB) { +- /* update pResultPointr ==> state Stat_BODY_SIGN_ESC__ESC_WORD writes +- * to correct position. Second value is the one and only escape value +- */ +- iQSC = iResultPointer[codewordOffset]; +- iQSC++; +- iResultPointer[codewordOffset] = iQSC; +- } +- +- } /* at least one of two lines is 16 */ +- break; /* nonPCW-Body at cb 11 and according sign bits are decoded */ +- +- } /* if ( cntSign == 0 ) */ +- } /* loop over remaining Bits in segment */ +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN; +- return BODY_SIGN_ESC__SIGN; +- } +- } +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decode escape prefix of first or second escape sequence. The +-escape prefix consists of ones. The following zero is also decoded here. +------------------------------------------------------------------------------------------------ +- output: If the single separator-zero which follows the +-escape-prefix-ones is not yet decoded: The value 'escapePrefixUp' in word +-pEscapeSequenceInfo[codewordOffset] is updated. +- +- If the single separator-zero which follows the +-escape-prefix-ones is decoded: Two updated values 'escapePrefixUp' and +-'escapePrefixDown' in word pEscapeSequenceInfo[codewordOffset]. This State is +-finished. Switch to next state. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT segmentOffset; +- UINT *pEscapeSequenceInfo; +- UINT codewordOffset; +- UCHAR carryBit; +- UINT escapePrefixUp; +- SCHAR *pSta; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- escapePrefixUp = +- (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> +- LSB_ESCAPE_PREFIX_UP; +- +- /* decode escape prefix */ +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- /* count ones and store sum in escapePrefixUp */ +- if (carryBit == 1) { +- escapePrefixUp += 1; /* update conter for ones */ +- +- /* store updated counter in sideinfo of current codeword */ +- pEscapeSequenceInfo[codewordOffset] &= +- ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ +- escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ +- pEscapeSequenceInfo[codewordOffset] |= +- escapePrefixUp; /* insert new escapePrefixUp */ +- escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ +- } else { /* separator [zero] reached */ +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- escapePrefixUp += +- 4; /* if escape_separator '0' appears, add 4 and ==> break */ +- +- /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit +- * position escapePrefixUp */ +- pEscapeSequenceInfo[codewordOffset] &= +- ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ +- escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ +- pEscapeSequenceInfo[codewordOffset] |= +- escapePrefixUp; /* insert new escapePrefixUp */ +- escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ +- +- /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit +- * position escapePrefixDown */ +- pEscapeSequenceInfo[codewordOffset] &= +- ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ +- escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ +- pEscapeSequenceInfo[codewordOffset] |= +- escapePrefixUp; /* insert new escapePrefixDown */ +- +- pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */ +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; /* get state from separate +- array of cw-sideinfo */ +- break; +- } +- } +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX; +- return BODY_SIGN_ESC__ESC_PREFIX; +- } +- } +- +- return STOP_THIS_STATE; +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Decode escapeWord of escape sequence. If the escape sequence +-is decoded completely, assemble quantized-spectral-escape-coefficient and +-replace the previous decoded 16 by the new value. Test flagB. If flagB is set, +-the second escape sequence must be decoded. If flagB is not set, the codeword is +-decoded and the state machine is switched off. +------------------------------------------------------------------------------------------------ +- output: Two lines with valid sign. At least one of both lines has got +-the correct value. +------------------------------------------------------------------------------------------------ +- return: 0 +--------------------------------------------------------------------------------------------- +-*/ +-UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) { +- H_HCR_INFO pHcr = (H_HCR_INFO)ptr; +- SCHAR *pRemainingBitsInSegment; +- INT *pLeftStartOfSegment; +- INT *pRightStartOfSegment; +- UCHAR readDirection; +- UINT *pSegmentBitfield; +- UINT *pCodewordBitfield; +- UINT segmentOffset; +- +- FIXP_DBL *pResultBase; +- USHORT *iResultPointer; +- UINT *pEscapeSequenceInfo; +- UINT codewordOffset; +- +- UINT escapeWord; +- UINT escapePrefixDown; +- UINT escapePrefixUp; +- UCHAR carryBit; +- UINT iQSC; +- INT sign; +- UINT flagA; +- UINT flagB; +- SCHAR *pSta; +- +- pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; +- pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; +- pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; +- readDirection = pHcr->segmentInfo.readDirection; +- pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; +- pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; +- segmentOffset = pHcr->segmentInfo.segmentOffset; +- +- pResultBase = pHcr->nonPcwSideinfo.pResultBase; +- iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; +- pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; +- codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; +- pSta = pHcr->nonPcwSideinfo.pSta; +- +- escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD; +- escapePrefixDown = +- (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >> +- LSB_ESCAPE_PREFIX_DOWN; +- +- /* decode escape word */ +- for (; pRemainingBitsInSegment[segmentOffset] > 0; +- pRemainingBitsInSegment[segmentOffset] -= 1) { +- carryBit = HcrGetABitFromBitstream( +- bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset], +- &pRightStartOfSegment[segmentOffset], readDirection); +- +- /* build escape word */ +- escapeWord <<= +- 1; /* left shift previous decoded part of escapeWord by on bit */ +- escapeWord = escapeWord | carryBit; /* assemble escape word by bitwise or */ +- +- /* decrement counter for length of escape word because one more bit was +- * decoded */ +- escapePrefixDown -= 1; +- +- /* store updated escapePrefixDown */ +- pEscapeSequenceInfo[codewordOffset] &= +- ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ +- escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ +- pEscapeSequenceInfo[codewordOffset] |= +- escapePrefixDown; /* insert new escapePrefixDown */ +- escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */ +- +- /* store updated escapeWord */ +- pEscapeSequenceInfo[codewordOffset] &= +- ~MASK_ESCAPE_WORD; /* delete old escapeWord */ +- pEscapeSequenceInfo[codewordOffset] |= +- escapeWord; /* insert new escapeWord */ +- +- if (escapePrefixDown == 0) { +- pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of +- for loop counter (see +- above) is done here */ +- +- /* escape sequence decoded. Assemble escape-line and replace original line +- */ +- +- /* step 0 */ +- /* derive sign */ +- iQSC = iResultPointer[codewordOffset]; +- sign = (pResultBase[iQSC] >= (FIXP_DBL)0) +- ? 1 +- : -1; /* get sign of escape value 16 */ +- +- /* step 1 */ +- /* get escapePrefixUp */ +- escapePrefixUp = +- (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> +- LSB_ESCAPE_PREFIX_UP; +- +- /* step 2 */ +- /* calculate escape value */ +- pResultBase[iQSC] = +- (FIXP_DBL)(sign * (((INT)1 << escapePrefixUp) + (INT)escapeWord)); +- +- /* get both flags from sideinfo (flags are not shifted to the +- * lsb-position) */ +- flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A; +- flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B; +- +- /* step 3 */ +- /* clear the whole escape sideinfo word */ +- pEscapeSequenceInfo[codewordOffset] = 0; +- +- /* change state in dependence of flag flagB */ +- if (flagA != 0) { +- /* first escape sequence decoded; previous decoded 16 has been replaced +- * by valid line */ +- +- /* clear flagA in sideinfo word because this escape sequence has already +- * beed decoded */ +- pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A; +- +- if (flagB == 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield +- and switch off +- statemachine */ +- } else { +- /* updated pointer to next and last 16 */ +- iQSC++; +- iResultPointer[codewordOffset] = iQSC; +- +- /* change state */ +- pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; +- pHcr->nonPcwSideinfo.pState = +- aStateConstant2State[pSta[codewordOffset]]; /* get state from +- separate array of +- cw-sideinfo */ +- } +- } else { +- ClearBitFromBitfield( +- &(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pCodewordBitfield); /* clear a bit in bitfield and switch off +- statemachine */ +- } +- break; +- } +- } +- +- if (pRemainingBitsInSegment[segmentOffset] <= 0) { +- ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, +- pSegmentBitfield); /* clear a bit in bitfield and +- switch off statemachine */ +- +- if (pRemainingBitsInSegment[segmentOffset] < 0) { +- pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD; +- return BODY_SIGN_ESC__ESC_WORD; +- } +- } +- +- return STOP_THIS_STATE; +-} +diff --git a/libAACdec/src/aacdec_hcrs.h b/libAACdec/src/aacdec_hcrs.h +deleted file mode 100644 +index acb2f40..0000000 +--- a/libAACdec/src/aacdec_hcrs.h ++++ /dev/null +@@ -1,176 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: HCR Decoder: Defines of state-constants, masks and +- state-prototypes +- +-*******************************************************************************/ +- +-#ifndef AACDEC_HCRS_H +-#define AACDEC_HCRS_H +- +-#include "FDK_bitstream.h" +-#include "aacdec_hcr_types.h" +-/* The four different kinds of types of states are: */ +-/* different states are defined as constants */ /* start middle=self next +- stop */ +-#define STOP_THIS_STATE \ +- 0 /* */ +-#define BODY_ONLY \ +- 1 /* X X X */ +-#define BODY_SIGN__BODY \ +- 2 /* X X X X [stop if no sign] */ +-#define BODY_SIGN__SIGN \ +- 3 /* X X [stop if sign bits decoded] */ +-#define BODY_SIGN_ESC__BODY \ +- 4 /* X X X X [stop if no sign] */ +-#define BODY_SIGN_ESC__SIGN \ +- 5 /* X X X [stop if no escape sequence] */ +-#define BODY_SIGN_ESC__ESC_PREFIX \ +- 6 /* X X */ +-#define BODY_SIGN_ESC__ESC_WORD \ +- 7 /* X X X [stop if abs(second qsc) != 16] */ +- +-/* examples: */ +- +-/* BODY_ONLY means only the codeword body will be decoded; no +- * sign bits will follow and no escapesequence will follow */ +- +-/* BODY_SIGN__BODY means that the codeword consists of two parts; +- * body and sign part. The part '__BODY' after the two underscores shows */ +-/* that the bits which are currently decoded belong +- * to the '__BODY' of the codeword and not to the sign part. */ +- +-/* BODY_SIGN_ESC__ESC_PB means that the codeword consists of three parts; +- * body, sign and (here: two) escape sequences; */ +-/* P = Prefix = ones */ +-/* W = Escape Word */ +-/* A = first possible (of two) Escape sequeces */ +-/* B = second possible (of two) Escape sequeces */ +-/* The part after the two underscores shows that +- * the current bits which are decoded belong to the '__ESC_PB' - part of the */ +-/* codeword. That means the body and the sign bits +- * are decoded completely and the bits which are decoded now belong to */ +-/* the escape sequence [P = prefix; B=second +- * possible escape sequence] */ +- +-#define MSB_31_MASK 0x80000000 /* masks MSB (= Bit 31) in a 32 bit word */ +-#define DIMENSION_OF_ESCAPE_CODEBOOK 2 /* for cb >= 11 is dimension 2 */ +-#define ESCAPE_CODEBOOK 11 +- +-#define MASK_ESCAPE_PREFIX_UP 0x000F0000 +-#define LSB_ESCAPE_PREFIX_UP 16 +- +-#define MASK_ESCAPE_PREFIX_DOWN 0x0000F000 +-#define LSB_ESCAPE_PREFIX_DOWN 12 +- +-#define MASK_ESCAPE_WORD 0x00000FFF +-#define MASK_FLAG_A 0x00200000 +-#define MASK_FLAG_B 0x00100000 +- +-extern void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO hHcr); +- +-UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM, void*); +-UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM, void*); +- +-#endif /* AACDEC_HCRS_H */ +diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp +index 2419ecc..6c03567 100644 +--- a/libAACdec/src/aacdecoder.cpp ++++ b/libAACdec/src/aacdecoder.cpp +@@ -163,17 +163,12 @@ amm-info@iis.fraunhofer.de + + #include "sac_dec_lib.h" + +-#include "aacdec_hcr.h" +-#include "rvlc.h" +- + #include "usacdec_lpd.h" + + #include "ac_arith_coder.h" + + #include "tpdec_lib.h" + +-#include "conceal.h" +- + #include "FDK_crc.h" + #define PS_IS_EXPLICITLY_DISABLED(aot, flags) \ + (((aot) == AOT_DRM_AAC) && !(flags & AC_PS_PRESENT)) +@@ -1191,10 +1186,6 @@ LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open( + /* initialize progam config */ + CProgramConfig_Init(&self->pce); + +- /* initialize error concealment common data */ +- CConcealment_InitCommonData(&self->concealCommonData); +- self->concealMethodUser = ConcealMethodNone; /* undefined -> auto mode */ +- + self->hDrcInfo = GetDrcInfo(); + if (self->hDrcInfo == NULL) { + goto bail; +@@ -1202,8 +1193,7 @@ LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open( + /* Init common DRC structure */ + aacDecoder_drcInit(self->hDrcInfo); + /* Set default frame delay */ +- aacDecoder_drcSetParam(self->hDrcInfo, DRC_BS_DELAY, +- CConcealment_GetDelay(&self->concealCommonData)); ++ aacDecoder_drcSetParam(self->hDrcInfo, DRC_BS_DELAY, 0); + + self->workBufferCore2 = GetWorkBufferCore2(); + if (self->workBufferCore2 == NULL) goto bail; +@@ -2085,15 +2075,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + if (self->pAacDecoderStaticChannelInfo[ch]->pCpeStaticData != + NULL) { + self->pAacDecoderStaticChannelInfo[ch] +- ->pCpeStaticData->jointStereoPersistentData +- .spectralCoeffs[ch2] = +- self->pAacDecoderStaticChannelInfo[ch] +- ->concealmentInfo.spectralCoefficient; +- self->pAacDecoderStaticChannelInfo[ch] +- ->pCpeStaticData->jointStereoPersistentData.specScale[ch2] = +- self->pAacDecoderStaticChannelInfo[ch] +- ->concealmentInfo.specScale; +- self->pAacDecoderStaticChannelInfo[ch] + ->pCpeStaticData->jointStereoPersistentData.scratchBuffer = + (FIXP_DBL *)self->pTimeData2; + } +@@ -2193,12 +2174,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + /* Delete mixdown metadata from the past */ + pcmDmx_Reset(self->hPcmUtils, PCMDMX_RESET_BS_DATA); + +- /* Reset concealment only if ASC changed. Otherwise it will be done with +- any config callback. E.g. every time the LATM SMC is present. */ +- CConcealment_InitChannelData( +- &self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, +- &self->concealCommonData, initRenderMode, +- self->streamInfo.aacSamplesPerFrame); + ch++; + chIdx++; + } +@@ -2336,12 +2311,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + int ch; + /* Clear history */ + for (ch = 0; ch < self->aacChannels; ch++) { +- /* Reset concealment */ +- CConcealment_InitChannelData( +- &self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, +- &self->concealCommonData, +- self->pAacDecoderChannelInfo[0]->renderMode, +- self->streamInfo.aacSamplesPerFrame); + /* Clear overlap-add buffers to avoid clicks. */ + FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, + OverlapBufferSize * sizeof(FIXP_DBL)); +@@ -2403,15 +2372,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + if (ch >= self->aacChannels) { + return AAC_DEC_UNKNOWN; + } +- +- /* if last frame was broken and this frame is no independent frame, +- * correct decoding is impossible we need to trigger concealment */ +- if ((CConcealment_GetLastFrameOk( +- &self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, +- 1) == 0) && +- !(self->flags[streamIndex] & AC_INDEP)) { +- self->frameOK = 0; +- } + ch++; + } + } +@@ -3081,13 +3041,8 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + * following concealment method, mark the frame as erroneous */ + { + CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- CConcealmentInfo *hConcealmentInfo = +- &pAacDecoderStaticChannelInfo->concealmentInfo; + const int mute_release_active = +- (self->frameOK && !(flags & AACDEC_CONCEAL)) && +- ((hConcealmentInfo->concealState >= ConcealState_Mute) && +- (hConcealmentInfo->cntValidFrames + 1 <= +- hConcealmentInfo->pConcealParams->numMuteReleaseFrames)); ++ (self->frameOK && !(flags & AACDEC_CONCEAL)); + const int icsIsInvalid = (GetScaleFactorBandsTransmitted(pIcsInfo) > + GetScaleFactorBandsTotal(pIcsInfo)); + const int icsInfoUsedinFadeOut = +@@ -3098,29 +3053,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + } + } + +- /* +- Conceal defective spectral data +- */ +- { +- CAacDecoderChannelInfo **ppAacDecoderChannelInfo = +- &pAacDecoderChannelInfo; +- CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo = +- &pAacDecoderStaticChannelInfo; +- { +- concealApplyReturnCode = CConcealment_Apply( +- &(*ppAacDecoderStaticChannelInfo)->concealmentInfo, +- *ppAacDecoderChannelInfo, *ppAacDecoderStaticChannelInfo, +- &self->samplingRateInfo[streamIndex], +- self->streamInfo.aacSamplesPerFrame, +- pAacDecoderStaticChannelInfo->last_lpd_mode, +- (self->frameOK && !(flags & AACDEC_CONCEAL)), +- self->flags[streamIndex]); +- } +- } +- if (concealApplyReturnCode == -1) { +- frameOk_butConceal = 1; +- } +- + if (flags & (AACDEC_INTR)) { + /* Reset DRC control data for this channel */ + aacDecoder_drcInitChannelData(&pAacDecoderStaticChannelInfo->drcData); +@@ -3191,20 +3123,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + ErrorStatus = AAC_DEC_UNKNOWN; + break; + } +- /* TimeDomainFading */ +- if (!CConceal_TDFading_Applied[c]) { +- CConceal_TDFading_Applied[c] = CConcealment_TDFading( +- self->streamInfo.aacSamplesPerFrame, +- &self->pAacDecoderStaticChannelInfo[c], pTimeData + offset, 0); +- if (c + 1 < (8) && c < aacChannels - 1) { +- /* update next TDNoise Seed to avoid muting in case of Parametric +- * Stereo */ +- self->pAacDecoderStaticChannelInfo[c + 1] +- ->concealmentInfo.TDNoiseSeed = +- self->pAacDecoderStaticChannelInfo[c] +- ->concealmentInfo.TDNoiseSeed; +- } +- } + } + } + +@@ -3249,11 +3167,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + } + } + +- /* Add additional concealment delay */ +- self->streamInfo.outputDelay += +- CConcealment_GetDelay(&self->concealCommonData) * +- self->streamInfo.aacSamplesPerFrame; +- + /* Map DRC data to StreamInfo structure */ + aacDecoder_drcGetInfo(self->hDrcInfo, &self->streamInfo.drcPresMode, + &self->streamInfo.drcProgRefLev); +diff --git a/libAACdec/src/aacdecoder.h b/libAACdec/src/aacdecoder.h +index 0711160..3750389 100644 +--- a/libAACdec/src/aacdecoder.h ++++ b/libAACdec/src/aacdecoder.h +@@ -236,9 +236,6 @@ struct AAC_DECODER_INSTANCE { + 1)]; /*!< Pointer to persistent data shared by both channels of a CPE. + This structure is allocated once for each CPE. */ + +- CConcealParams concealCommonData; +- CConcealmentMethod concealMethodUser; +- + CUsacCoreExtensions usacCoreExt; /*!< Data and handles to extend USAC FD/LPD + core decoder (SBR, MPS, ...) */ + UINT numUsacElements[(1 * 1)]; +diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp +index bde978e..1fc6ea0 100644 +--- a/libAACdec/src/aacdecoder_lib.cpp ++++ b/libAACdec/src/aacdecoder_lib.cpp +@@ -107,8 +107,6 @@ amm-info@iis.fraunhofer.de + #include "tpdec_lib.h" + #include "FDK_core.h" /* FDK_tools version info */ + +-#include "conceal.h" +- + #include "aacdec_drc.h" + + #include "sac_dec_lib.h" +@@ -280,26 +278,6 @@ static INT aacDecoder_ConfigCallback(void *handle, + { err = aacDecoder_Config(self, pAscStruct, configMode, configChanged); } + } + if (err == AAC_DEC_OK) { +- /* +- revert concealment method if either +- - Interpolation concealment might not be meaningful +- - Interpolation concealment is not implemented +- */ +- if ((self->flags[0] & (AC_LD | AC_ELD) && +- (self->concealMethodUser == ConcealMethodNone) && +- CConcealment_GetDelay(&self->concealCommonData) > +- 0) /* might not be meaningful but allow if user has set it +- expicitly */ +- || (self->flags[0] & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && +- CConcealment_GetDelay(&self->concealCommonData) > +- 0) /* not implemented */ +- ) { +- /* Revert to error concealment method Noise Substitution. +- Because interpolation is not implemented for USAC or +- the additional delay is unwanted for low delay codecs. */ +- setConcealMethod(self, 1); +- } +- aacDecoder_setMetadataExpiry(self, self->metadataExpiry); + errTp = TRANSPORTDEC_OK; + } else { + if (err == AAC_DEC_NEED_TO_RESTART) { +@@ -529,17 +507,12 @@ static AAC_DECODER_ERROR setConcealMethod( + const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */ + const INT method) { + AAC_DECODER_ERROR errorStatus = AAC_DEC_OK; +- CConcealParams *pConcealData = NULL; + int method_revert = 0; + HANDLE_AAC_DRC hDrcInfo = NULL; + HANDLE_PCM_DOWNMIX hPcmDmx = NULL; +- CConcealmentMethod backupMethod = ConcealMethodNone; +- int backupDelay = 0; +- int bsDelay = 0; + + /* check decoder handle */ + if (self != NULL) { +- pConcealData = &self->concealCommonData; + hDrcInfo = self->hDrcInfo; + hPcmDmx = self->hPcmUtils; + if (self->flags[0] & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && method >= 2) { +@@ -555,33 +528,13 @@ static AAC_DECODER_ERROR setConcealMethod( + } + } + +- /* Get current method/delay */ +- backupMethod = CConcealment_GetMethod(pConcealData); +- backupDelay = CConcealment_GetDelay(pConcealData); +- +- /* Be sure to set AAC and SBR concealment method simultaneously! */ +- errorStatus = CConcealment_SetParams( +- pConcealData, +- (method_revert == 0) ? (int)method : (int)1, // concealMethod +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeOutSlope +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeInSlope +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealMuteRelease +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED // concealComfNoiseLevel +- ); +- if ((errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE)) { +- goto bail; +- } +- +- /* Get new delay */ +- bsDelay = CConcealment_GetDelay(pConcealData); +- +- errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, bsDelay); ++ errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, 0); + if ((errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE)) { + goto bail; + } + + if (errorStatus == AAC_DEC_OK) { +- PCMDMX_ERROR err = pcmDmx_SetParam(hPcmDmx, DMX_BS_DATA_DELAY, bsDelay); ++ PCMDMX_ERROR err = pcmDmx_SetParam(hPcmDmx, DMX_BS_DATA_DELAY, 0); + switch (err) { + case PCMDMX_INVALID_HANDLE: + errorStatus = AAC_DEC_INVALID_HANDLE; +@@ -596,15 +549,10 @@ static AAC_DECODER_ERROR setConcealMethod( + + bail: + if ((errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE)) { +- /* Revert to the initial state */ +- CConcealment_SetParams( +- pConcealData, (int)backupMethod, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, +- AACDEC_CONCEAL_PARAM_NOT_SPECIFIED); + /* Revert DRC bitstream delay */ +- aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, backupDelay); ++ aacDecoder_drcSetParam(hDrcInfo, DRC_BS_DELAY, 0); + /* Revert PCM mixdown bitstream delay */ +- pcmDmx_SetParam(hPcmDmx, DMX_BS_DATA_DELAY, backupDelay); ++ pcmDmx_SetParam(hPcmDmx, DMX_BS_DATA_DELAY, 0); + } + + return errorStatus; +@@ -834,9 +782,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_SetParam( + packed into a helper function which keeps all modules and libs in a + consistent state even in the case an error occures. */ + errorStatus = setConcealMethod(self, value); +- if (errorStatus == AAC_DEC_OK) { +- self->concealMethodUser = (CConcealmentMethod)value; +- } + break; + + default: +@@ -966,8 +911,7 @@ LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, + aacDec->limiterEnableCurr = 0; + + /* Assure that all modules have same delay */ +- if (setConcealMethod(aacDec, +- CConcealment_GetMethod(&aacDec->concealCommonData))) { ++ if (setConcealMethod(aacDec, 0)) { + err = -1; + goto bail; + } +@@ -1359,9 +1303,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + break; + } + +- if ((ErrorStatus != AAC_DEC_OK) || (flags & AACDEC_CONCEAL) || +- self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > +- ConcealState_FadeIn) { ++ if ((ErrorStatus != AAC_DEC_OK) || (flags & AACDEC_CONCEAL)) { + self->frameOK = 0; /* if an error has occured do concealment in the SBR + decoder too */ + } +@@ -1457,9 +1399,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + domain signal before the QMF synthesis. Therefore the DRC gains + need to be delayed by the QMF synthesis delay. */ + if (self->mpsEnableCurr) drcDelay = 257; +- /* Take into account concealment delay */ +- drcDelay += CConcealment_GetDelay(&self->concealCommonData) * +- self->streamInfo.frameSize; + + for (ch = 0; ch < self->streamInfo.numChannels; ch++) { + UCHAR mapValue = FDK_chMapDescr_getMapValue( +diff --git a/libAACdec/src/block.cpp b/libAACdec/src/block.cpp +index b3d09a6..a394cd7 100644 +--- a/libAACdec/src/block.cpp ++++ b/libAACdec/src/block.cpp +@@ -114,9 +114,6 @@ amm-info@iis.fraunhofer.de + + #include "ac_arith_coder.h" + +-#include "aacdec_hcr.h" +-#include "rvlc.h" +- + #if defined(__arm__) + #include "arm/block_arm.cpp" + #endif +@@ -331,12 +328,7 @@ AAC_DECODER_ERROR CBlock_ReadSectionData( + int group; + UCHAR sect_cb; + UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; +- /* HCR input (long) */ +- SHORT *pNumLinesInSec = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; + int numLinesInSecIdx = 0; +- UCHAR *pHcrCodeBook = +- pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; + const SHORT *BandOffsets = GetScaleFactorBandOffsets( + &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); + pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0; +@@ -376,22 +368,8 @@ AAC_DECODER_ERROR CBlock_ReadSectionData( + top = band + sect_len; + + if (flags & AC_ER_HCR) { +- /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */ +- if (numLinesInSecIdx >= MAX_SFB_HCR) { +- return AAC_DEC_PARSE_ERROR; +- } +- if (top > (int)GetNumberOfScaleFactorBands( +- &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo)) { +- return AAC_DEC_PARSE_ERROR; +- } +- pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band]; +- numLinesInSecIdx++; +- if (sect_cb == BOOKSCL) { +- return AAC_DEC_INVALID_CODE_BOOK; +- } else { +- *pHcrCodeBook++ = sect_cb; +- } +- pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++; ++ /* HCR disabled */ ++ return AAC_DEC_PARSE_ERROR; + } + + /* Check spectral line limits */ +@@ -718,41 +696,12 @@ AAC_DECODER_ERROR CBlock_ReadSpectralData( + /* plain huffman decoding (short) finished */ + } + +- /* HCR - Huffman Codeword Reordering short */ + else /* if ( flags & AC_ER_HCR ) */ + + { +- H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo; +- +- int hcrStatus = 0; +- +- /* advanced Huffman decoding starts here (HCR decoding :) */ +- if (pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData != 0) { +- /* HCR initialization short */ +- hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); +- +- if (hcrStatus != 0) { +- return AAC_DEC_DECODE_FRAME_ERROR; +- } +- +- /* HCR decoding short */ +- hcrStatus = +- HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); +- +- if (hcrStatus != 0) { +-#if HCR_ERROR_CONCEALMENT +- HcrMuteErroneousLines(hHcr); +-#else +- return AAC_DEC_DECODE_FRAME_ERROR; +-#endif /* HCR_ERROR_CONCEALMENT */ +- } +- +- FDKpushFor(bs, pAacDecoderChannelInfo->pDynData->specificTo.aac +- .lenOfReorderedSpectralData); +- } ++ /* HCR - Huffman Codeword Reordering disabled */ ++ return AAC_DEC_DECODE_FRAME_ERROR; + } +- /* HCR - Huffman Codeword Reordering short finished */ + + if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) && + !(flags & (AC_ELD | AC_SCALABLE))) { +diff --git a/libAACdec/src/channel.cpp b/libAACdec/src/channel.cpp +index a020034..e17ccf4 100644 +--- a/libAACdec/src/channel.cpp ++++ b/libAACdec/src/channel.cpp +@@ -106,12 +106,6 @@ amm-info@iis.fraunhofer.de + #include "aacdec_tns.h" + #include "FDK_bitstream.h" + +-#include "conceal.h" +- +-#include "rvlc.h" +- +-#include "aacdec_hcr.h" +- + #include "usacdec_lpd.h" + #include "usacdec_fac.h" + +@@ -376,9 +370,6 @@ void CChannelElement_Decode( + ->pCpeStaticData->jointStereoPersistentData.clearSpectralCoeffs = 0; + } + } +- +- CRvlc_ElementCheck(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, +- flags, el_channels); + } + + void CChannel_CodebookTableInit( +@@ -596,8 +587,8 @@ AAC_DECODER_ERROR CChannelElement_Read( + + case scale_factor_data: + if (flags & AC_ER_RVLC) { +- /* read RVLC data from bitstream (error sens. cat. 1) */ +- CRvlc_Read(pAacDecoderChannelInfo[ch], hBs); ++ /* RVLC not supported */ ++ error = AAC_DEC_DECODE_FRAME_ERROR; + } else { + error = CBlock_ReadScaleFactorData(pAacDecoderChannelInfo[ch], hBs, + flags); +@@ -730,15 +721,13 @@ AAC_DECODER_ERROR CChannelElement_Read( + } break; + case esc2_rvlc: + if (flags & AC_ER_RVLC) { +- CRvlc_Decode(pAacDecoderChannelInfo[ch], +- pAacDecoderStaticChannelInfo[ch], hBs); ++ error = AAC_DEC_UNSUPPORTED_FORMAT; + } + break; + + case esc1_hcr: + if (flags & AC_ER_HCR) { +- CHcr_Read(hBs, pAacDecoderChannelInfo[ch], +- numberOfChannels == 2 ? ID_CPE : ID_SCE); ++ error = AAC_DEC_UNSUPPORTED_FORMAT; + } + break; + +diff --git a/libAACdec/src/channelinfo.h b/libAACdec/src/channelinfo.h +index 4523400..04f0012 100644 +--- a/libAACdec/src/channelinfo.h ++++ b/libAACdec/src/channelinfo.h +@@ -117,17 +117,12 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_pns.h" + +-#include "aacdec_hcr_types.h" +-#include "rvlc_info.h" +- + #include "usacdec_acelp.h" + #include "usacdec_const.h" + #include "usacdec_rom.h" + + #include "ac_arith_coder.h" + +-#include "conceal_types.h" +- + #include "aacdec_drc_types.h" + + #define WB_SECTION_SIZE (1024 * 2) +@@ -257,7 +252,6 @@ typedef struct { + ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */ + + CDrcChannelData drcData; +- CConcealmentInfo concealmentInfo; + + CpePersistentData *pCpeStaticData; + +@@ -280,11 +274,6 @@ typedef struct { + shouldBeUnion { + struct { + CPulseData PulseData; +- SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels +- except for Drm syntax */ +- UCHAR +- aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for +- Drm syntax. Same as "aCodeBook" ? */ + SHORT lenOfReorderedSpectralData; + SCHAR lenOfLongestCodeword; + SCHAR numberSection; +@@ -325,17 +314,6 @@ typedef struct { + + CJointStereoData jointStereoData; /* One for one element */ + +- shouldBeUnion { +- struct { +- CErHcrInfo erHcrInfo; +- CErRvlcInfo erRvlcInfo; +- SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */ +- SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */ +- SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */ +- } aac; +- } +- overlay; +- + } CAacDecoderCommonData; + + typedef struct { +diff --git a/libAACdec/src/conceal.cpp b/libAACdec/src/conceal.cpp +deleted file mode 100644 +index 5895cb8..0000000 +--- a/libAACdec/src/conceal.cpp ++++ /dev/null +@@ -1,2095 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Josef Hoepfl +- +- Description: independent channel concealment +- +-*******************************************************************************/ +- +-/*! +- \page concealment AAC core concealment +- +- This AAC core implementation includes a concealment function, which can be +- enabled using the several defines during compilation. +- +- There are various tests inside the core, starting with simple CRC tests and +- ending in a variety of plausibility checks. If such a check indicates an +- invalid bitstream, then concealment is applied. +- +- Concealment is also applied when the calling main program indicates a +- distorted or missing data frame using the frameOK flag. This is used for error +- detection on the transport layer. (See below) +- +- There are three concealment-modes: +- +- 1) Muting: The spectral data is simply set to zero in case of an detected +- error. +- +- 2) Noise substitution: In case of an detected error, concealment copies the +- last frame and adds attenuates the spectral data. For this mode you have to +- set the #CONCEAL_NOISE define. Noise substitution adds no additional delay. +- +- 3) Interpolation: The interpolation routine swaps the spectral data from the +- previous and the current frame just before the final frequency to time +- conversion. In case a single frame is corrupted, concealmant interpolates +- between the last good and the first good frame to create the spectral data for +- the missing frame. If multiple frames are corrupted, concealment implements +- first a fade out based on slightly modified spectral values from the last good +- frame. As soon as good frames are available, concealmant fades in the new +- spectral data. For this mode you have to set the #CONCEAL_INTER define. Note +- that in this case, you also need to set #SBR_BS_DELAY_ENABLE, which basically +- adds approriate delay in the SBR decoder. Note that the +- Interpolating-Concealment increases the delay of your decoder by one frame and +- that it does require additional resources such as memory and computational +- complexity. +- +-

How concealment can be used with errors on the transport layer

+- +- Many errors can or have to be detected on the transport layer. For example in +- IP based systems packet loss can occur. The transport protocol used should +- indicate such packet loss by inserting an empty frame with frameOK=0. +-*/ +- +-#include "conceal.h" +- +-#include "aac_rom.h" +-#include "genericStds.h" +- +-/* PNS (of block) */ +-#include "aacdec_pns.h" +-#include "block.h" +- +-#define CONCEAL_DFLT_COMF_NOISE_LEVEL (0x100000) +- +-#define CONCEAL_NOT_DEFINED ((UCHAR)-1) +- +-/* default settings */ +-#define CONCEAL_DFLT_FADEOUT_FRAMES (6) +-#define CONCEAL_DFLT_FADEIN_FRAMES (5) +-#define CONCEAL_DFLT_MUTE_RELEASE_FRAMES (0) +- +-#define CONCEAL_DFLT_FADE_FACTOR (0.707106781186548f) /* 1/sqrt(2) */ +- +-/* some often used constants: */ +-#define FIXP_ZERO FL2FXCONST_DBL(0.0f) +-#define FIXP_ONE FL2FXCONST_DBL(1.0f) +-#define FIXP_FL_CORRECTION FL2FXCONST_DBL(0.53333333333333333f) +- +-/* For parameter conversion */ +-#define CONCEAL_PARAMETER_BITS (8) +-#define CONCEAL_MAX_QUANT_FACTOR ((1 << CONCEAL_PARAMETER_BITS) - 1) +-/*#define CONCEAL_MIN_ATTENUATION_FACTOR_025 ( FL2FXCONST_DBL(0.971627951577106174) )*/ /* -0.25 dB */ +-#define CONCEAL_MIN_ATTENUATION_FACTOR_025_LD \ +- FL2FXCONST_DBL(-0.041524101186092029596853445212299) +-/*#define CONCEAL_MIN_ATTENUATION_FACTOR_050 ( FL2FXCONST_DBL(0.944060876285923380) )*/ /* -0.50 dB */ +-#define CONCEAL_MIN_ATTENUATION_FACTOR_050_LD \ +- FL2FXCONST_DBL(-0.083048202372184059253597008145293) +- +-typedef enum { +- CConcealment_NoExpand, +- CConcealment_Expand, +- CConcealment_Compress +-} CConcealmentExpandType; +- +-static const FIXP_SGL facMod4Table[4] = { +- FL2FXCONST_SGL(0.500000000f), /* FIXP_SGL(0x4000), 2^-(1-0,00) */ +- FL2FXCONST_SGL(0.594603558f), /* FIXP_SGL(0x4c1b), 2^-(1-0,25) */ +- FL2FXCONST_SGL(0.707106781f), /* FIXP_SGL(0x5a82), 2^-(1-0,50) */ +- FL2FXCONST_SGL(0.840896415f) /* FIXP_SGL(0x6ba2) 2^-(1-0,75) */ +-}; +- +-static void CConcealment_CalcBandEnergy( +- FIXP_DBL *spectrum, const SamplingRateInfo *pSamplingRateInfo, +- const int blockType, CConcealmentExpandType ex, int *sfbEnergy); +- +-static void CConcealment_InterpolateBuffer(FIXP_DBL *spectrum, +- SHORT *pSpecScalePrev, +- SHORT *pSpecScaleAct, +- SHORT *pSpecScaleOut, int *enPrv, +- int *enAct, int sfbCnt, +- const SHORT *pSfbOffset); +- +-static int CConcealment_ApplyInter( +- CConcealmentInfo *pConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const int improveTonal, const int frameOk, const int mute_release_active); +- +-static int CConcealment_ApplyNoise( +- CConcealmentInfo *pConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const UINT flags); +- +-static void CConcealment_UpdateState( +- CConcealmentInfo *pConcealmentInfo, int frameOk, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const int samplesPerFrame, CAacDecoderChannelInfo *pAacDecoderChannelInfo); +- +-static void CConcealment_ApplyRandomSign(int iRandomPhase, FIXP_DBL *spec, +- int samplesPerFrame); +- +-/* TimeDomainFading */ +-static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart, +- FIXP_DBL fadeStop, FIXP_PCM *pcmdata); +-static void CConcealment_TDFadeFillFadingStations(FIXP_DBL *fadingStations, +- int *fadingSteps, +- FIXP_DBL fadeStop, +- FIXP_DBL fadeStart, +- TDfadingType fadingType); +-static void CConcealment_TDFading_doLinearFadingSteps(int *fadingSteps); +- +-/* Streamline the state machine */ +-static int CConcealment_ApplyFadeOut( +- int mode, CConcealmentInfo *pConcealmentInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const int samplesPerFrame, CAacDecoderChannelInfo *pAacDecoderChannelInfo); +- +-static int CConcealment_TDNoise_Random(ULONG *seed); +-static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo, +- const int len, FIXP_PCM *const pcmdata); +- +-static BLOCK_TYPE CConcealment_GetWinSeq(int prevWinSeq) { +- BLOCK_TYPE newWinSeq = BLOCK_LONG; +- +- /* Try to have only long blocks */ +- if (prevWinSeq == BLOCK_START || prevWinSeq == BLOCK_SHORT) { +- newWinSeq = BLOCK_STOP; +- } +- +- return (newWinSeq); +-} +- +-/*! +- \brief Init common concealment information data +- +- \param pConcealCommonData Pointer to the concealment common data structure. +-*/ +-void CConcealment_InitCommonData(CConcealParams *pConcealCommonData) { +- if (pConcealCommonData != NULL) { +- int i; +- +- /* Set default error concealment technique */ +- pConcealCommonData->method = ConcealMethodInter; +- +- pConcealCommonData->numFadeOutFrames = CONCEAL_DFLT_FADEOUT_FRAMES; +- pConcealCommonData->numFadeInFrames = CONCEAL_DFLT_FADEIN_FRAMES; +- pConcealCommonData->numMuteReleaseFrames = CONCEAL_DFLT_MUTE_RELEASE_FRAMES; +- +- pConcealCommonData->comfortNoiseLevel = +- (FIXP_DBL)CONCEAL_DFLT_COMF_NOISE_LEVEL; +- +- /* Init fade factors (symetric) */ +- pConcealCommonData->fadeOutFactor[0] = +- FL2FXCONST_SGL(CONCEAL_DFLT_FADE_FACTOR); +- pConcealCommonData->fadeInFactor[0] = pConcealCommonData->fadeOutFactor[0]; +- +- for (i = 1; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- pConcealCommonData->fadeOutFactor[i] = +- FX_DBL2FX_SGL(fMult(pConcealCommonData->fadeOutFactor[i - 1], +- FL2FXCONST_SGL(CONCEAL_DFLT_FADE_FACTOR))); +- pConcealCommonData->fadeInFactor[i] = +- pConcealCommonData->fadeOutFactor[i]; +- } +- } +-} +- +-/*! +- \brief Get current concealment method. +- +- \param pConcealCommonData Pointer to common concealment data (for all +- channels) +-*/ +-CConcealmentMethod CConcealment_GetMethod(CConcealParams *pConcealCommonData) { +- CConcealmentMethod method = ConcealMethodNone; +- +- if (pConcealCommonData != NULL) { +- method = pConcealCommonData->method; +- } +- +- return (method); +-} +- +-/*! +- \brief Init concealment information for each channel +- +- \param pConcealChannelInfo Pointer to the channel related concealment info +- structure to be initialized. \param pConcealCommonData Pointer to common +- concealment data (for all channels) \param initRenderMode Initial render +- mode to be set for the current channel. \param samplesPerFrame The number +- of samples per frame. +-*/ +-void CConcealment_InitChannelData(CConcealmentInfo *pConcealChannelInfo, +- CConcealParams *pConcealCommonData, +- AACDEC_RENDER_MODE initRenderMode, +- int samplesPerFrame) { +- int i; +- pConcealChannelInfo->TDNoiseSeed = 0; +- FDKmemclear(pConcealChannelInfo->TDNoiseStates, +- sizeof(pConcealChannelInfo->TDNoiseStates)); +- pConcealChannelInfo->TDNoiseCoef[0] = FL2FXCONST_SGL(0.05f); +- pConcealChannelInfo->TDNoiseCoef[1] = FL2FXCONST_SGL(0.5f); +- pConcealChannelInfo->TDNoiseCoef[2] = FL2FXCONST_SGL(0.45f); +- +- pConcealChannelInfo->pConcealParams = pConcealCommonData; +- +- pConcealChannelInfo->lastRenderMode = initRenderMode; +- +- pConcealChannelInfo->windowShape = CONCEAL_NOT_DEFINED; +- pConcealChannelInfo->windowSequence = BLOCK_LONG; /* default type */ +- pConcealChannelInfo->lastWinGrpLen = 1; +- +- pConcealChannelInfo->concealState = ConcealState_Ok; +- +- FDKmemclear(pConcealChannelInfo->spectralCoefficient, +- 1024 * sizeof(FIXP_CNCL)); +- +- for (i = 0; i < 8; i++) { +- pConcealChannelInfo->specScale[i] = 0; +- } +- +- pConcealChannelInfo->iRandomPhase = 0; +- +- pConcealChannelInfo->prevFrameOk[0] = 1; +- pConcealChannelInfo->prevFrameOk[1] = 1; +- +- pConcealChannelInfo->cntFadeFrames = 0; +- pConcealChannelInfo->cntValidFrames = 0; +- pConcealChannelInfo->fade_old = (FIXP_DBL)MAXVAL_DBL; +- pConcealChannelInfo->winGrpOffset[0] = 0; +- pConcealChannelInfo->winGrpOffset[1] = 0; +- pConcealChannelInfo->attGrpOffset[0] = 0; +- pConcealChannelInfo->attGrpOffset[1] = 0; +-} +- +-/*! +- \brief Set error concealment parameters +- +- \param concealParams +- \param method +- \param fadeOutSlope +- \param fadeInSlope +- \param muteRelease +- \param comfNoiseLevel +-*/ +-AAC_DECODER_ERROR +-CConcealment_SetParams(CConcealParams *concealParams, int method, +- int fadeOutSlope, int fadeInSlope, int muteRelease, +- FIXP_DBL comfNoiseLevel) { +- /* set concealment technique */ +- if (method != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { +- switch ((CConcealmentMethod)method) { +- case ConcealMethodMute: +- case ConcealMethodNoise: +- case ConcealMethodInter: +- /* Be sure to enable delay adjustment of SBR decoder! */ +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } else { +- /* set param */ +- concealParams->method = (CConcealmentMethod)method; +- } +- break; +- +- default: +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- +- /* set number of frames for fade-out slope */ +- if (fadeOutSlope != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { +- if ((fadeOutSlope < CONCEAL_MAX_NUM_FADE_FACTORS) && (fadeOutSlope >= 0)) { +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } else { +- /* set param */ +- concealParams->numFadeOutFrames = fadeOutSlope; +- } +- } else { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- +- /* set number of frames for fade-in slope */ +- if (fadeInSlope != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { +- if ((fadeInSlope < CONCEAL_MAX_NUM_FADE_FACTORS) && (fadeInSlope >= 0)) { +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } else { +- /* set param */ +- concealParams->numFadeInFrames = fadeInSlope; +- } +- } else { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- +- /* set number of error-free frames after which the muting will be released */ +- if (muteRelease != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { +- if ((muteRelease < (CONCEAL_MAX_NUM_FADE_FACTORS << 1)) && +- (muteRelease >= 0)) { +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } else { +- /* set param */ +- concealParams->numMuteReleaseFrames = muteRelease; +- } +- } else { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- +- /* set confort noise level which will be inserted while in state 'muting' */ +- if (comfNoiseLevel != (FIXP_DBL)AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { +- if ((comfNoiseLevel < (FIXP_DBL)0) || +- (comfNoiseLevel > (FIXP_DBL)MAXVAL_DBL)) { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } else { +- concealParams->comfortNoiseLevel = (FIXP_DBL)comfNoiseLevel; +- } +- } +- +- return (AAC_DEC_OK); +-} +- +-/*! +- \brief Set fade-out/in attenuation factor vectors +- +- \param concealParams +- \param fadeOutAttenuationVector +- \param fadeInAttenuationVector +- +- \return 0 if OK all other values indicate errors +-*/ +-AAC_DECODER_ERROR +-CConcealment_SetAttenuation(CConcealParams *concealParams, +- const SHORT *fadeOutAttenuationVector, +- const SHORT *fadeInAttenuationVector) { +- if ((fadeOutAttenuationVector == NULL) && (fadeInAttenuationVector == NULL)) { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- +- /* Fade-out factors */ +- if (fadeOutAttenuationVector != NULL) { +- int i; +- +- /* check quantized factors first */ +- for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- if ((fadeOutAttenuationVector[i] < 0) || +- (fadeOutAttenuationVector[i] > CONCEAL_MAX_QUANT_FACTOR)) { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } +- +- /* now dequantize factors */ +- for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- concealParams->fadeOutFactor[i] = +- FX_DBL2FX_SGL(fLdPow(CONCEAL_MIN_ATTENUATION_FACTOR_025_LD, 0, +- (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0 / 2.0) >> +- (CONCEAL_PARAMETER_BITS - 1)) * +- (INT)fadeOutAttenuationVector[i]), +- CONCEAL_PARAMETER_BITS)); +- } +- } +- +- /* Fade-in factors */ +- if (fadeInAttenuationVector != NULL) { +- int i; +- +- /* check quantized factors first */ +- for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- if ((fadeInAttenuationVector[i] < 0) || +- (fadeInAttenuationVector[i] > CONCEAL_MAX_QUANT_FACTOR)) { +- return AAC_DEC_SET_PARAM_FAIL; +- } +- } +- if (concealParams == NULL) { +- return AAC_DEC_INVALID_HANDLE; +- } +- +- /* now dequantize factors */ +- for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- concealParams->fadeInFactor[i] = FX_DBL2FX_SGL( +- fLdPow(CONCEAL_MIN_ATTENUATION_FACTOR_025_LD, 0, +- (FIXP_DBL)((INT)(FIXP_ONE >> CONCEAL_PARAMETER_BITS) * +- (INT)fadeInAttenuationVector[i]), +- CONCEAL_PARAMETER_BITS)); +- } +- } +- +- return (AAC_DEC_OK); +-} +- +-/*! +- \brief Get state of concealment module. +- +- \param pConcealChannelInfo +- +- \return Concealment state. +-*/ +-CConcealmentState CConcealment_GetState(CConcealmentInfo *pConcealChannelInfo) { +- CConcealmentState state = ConcealState_Ok; +- +- if (pConcealChannelInfo != NULL) { +- state = pConcealChannelInfo->concealState; +- } +- +- return (state); +-} +- +-/*! +- \brief Store data for concealment techniques applied later +- +- Interface function to store data for different concealment strategies +- */ +-void CConcealment_Store( +- CConcealmentInfo *hConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { +- UCHAR nbDiv = NB_DIV; +- +- if (!(pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD && +- pAacDecoderChannelInfo->data.usac.mod[nbDiv - 1] == 0)) +- +- { +- FIXP_DBL *pSpectralCoefficient = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- +- SHORT tSpecScale[8]; +- UCHAR tWindowShape; +- BLOCK_TYPE tWindowSequence; +- +- /* store old window infos for swapping */ +- tWindowSequence = hConcealmentInfo->windowSequence; +- tWindowShape = hConcealmentInfo->windowShape; +- +- /* store old scale factors for swapping */ +- FDKmemcpy(tSpecScale, hConcealmentInfo->specScale, 8 * sizeof(SHORT)); +- +- /* store new window infos */ +- hConcealmentInfo->windowSequence = GetWindowSequence(pIcsInfo); +- hConcealmentInfo->windowShape = GetWindowShape(pIcsInfo); +- hConcealmentInfo->lastWinGrpLen = +- *(GetWindowGroupLengthTable(pIcsInfo) + GetWindowGroups(pIcsInfo) - 1); +- +- /* store new scale factors */ +- FDKmemcpy(hConcealmentInfo->specScale, pSpecScale, 8 * sizeof(SHORT)); +- +- if (hConcealmentInfo->pConcealParams->method < ConcealMethodInter) { +- /* store new spectral bins */ +-#if (CNCL_FRACT_BITS == DFRACT_BITS) +- FDKmemcpy(hConcealmentInfo->spectralCoefficient, pSpectralCoefficient, +- 1024 * sizeof(FIXP_CNCL)); +-#else +- FIXP_CNCL *RESTRICT pCncl = +- &hConcealmentInfo->spectralCoefficient[1024 - 1]; +- FIXP_DBL *RESTRICT pSpec = &pSpectralCoefficient[1024 - 1]; +- int i; +- for (i = 1024; i != 0; i--) { +- *pCncl-- = FX_DBL2FX_CNCL(*pSpec--); +- } +-#endif +- } else { +- /* swap spectral data */ +-#if (FIXP_CNCL == FIXP_DBL) +- C_ALLOC_SCRATCH_START(pSpecTmp, FIXP_DBL, 1024); +- FDKmemcpy(pSpecTmp, pSpectralCoefficient, 1024 * sizeof(FIXP_DBL)); +- FDKmemcpy(pSpectralCoefficient, hConcealmentInfo->spectralCoefficient, +- 1024 * sizeof(FIXP_DBL)); +- FDKmemcpy(hConcealmentInfo->spectralCoefficient, pSpecTmp, +- 1024 * sizeof(FIXP_DBL)); +- C_ALLOC_SCRATCH_END(pSpecTmp, FIXP_DBL, 1024); +-#else +- FIXP_CNCL *RESTRICT pCncl = +- &hConcealmentInfo->spectralCoefficient[1024 - 1]; +- FIXP_DBL *RESTRICT pSpec = &pSpectralCoefficient[1024 - 1]; +- FIXP_DBL tSpec; +- +- for (int i = 1024; i != 0; i--) { +- tSpec = *pSpec; +- *pSpec-- = FX_CNCL2FX_DBL(*pCncl); +- *pCncl-- = FX_DBL2FX_CNCL(tSpec); +- } +-#endif +- +- /* complete swapping of window infos */ +- pIcsInfo->WindowSequence = tWindowSequence; +- pIcsInfo->WindowShape = tWindowShape; +- +- /* complete swapping of scale factors */ +- FDKmemcpy(pSpecScale, tSpecScale, 8 * sizeof(SHORT)); +- } +- } +- +- if (pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD) { +- /* Store LSF4 */ +- FDKmemcpy(hConcealmentInfo->lsf4, pAacDecoderStaticChannelInfo->lpc4_lsf, +- sizeof(hConcealmentInfo->lsf4)); +- /* Store TCX gain */ +- hConcealmentInfo->last_tcx_gain = +- pAacDecoderStaticChannelInfo->last_tcx_gain; +- hConcealmentInfo->last_tcx_gain_e = +- pAacDecoderStaticChannelInfo->last_tcx_gain_e; +- } +-} +- +-/*! +- \brief Apply concealment +- +- Interface function to different concealment strategies +- */ +-int CConcealment_Apply( +- CConcealmentInfo *hConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const UCHAR lastLpdMode, const int frameOk, const UINT flags) { +- int appliedProcessing = 0; +- const int mute_release_active = +- frameOk && (hConcealmentInfo->concealState >= ConcealState_Mute) && +- (hConcealmentInfo->cntValidFrames + 1 <= +- hConcealmentInfo->pConcealParams->numMuteReleaseFrames); +- +- if (hConcealmentInfo->windowShape == CONCEAL_NOT_DEFINED) { +- /* Initialize window_shape with same value as in the current (parsed) frame. +- Because section 4.6.11.3.2 (Windowing and block switching) of ISO/IEC +- 14496-3:2009 says: For the first raw_data_block() to be decoded the +- window_shape of the left and right half of the window are identical. */ +- hConcealmentInfo->windowShape = pAacDecoderChannelInfo->icsInfo.WindowShape; +- } +- +- if (frameOk && !mute_release_active) { +- /* Update render mode if frameOk except for ongoing mute release state. */ +- hConcealmentInfo->lastRenderMode = +- (SCHAR)pAacDecoderChannelInfo->renderMode; +- +- /* Rescue current data for concealment in future frames */ +- CConcealment_Store(hConcealmentInfo, pAacDecoderChannelInfo, +- pAacDecoderStaticChannelInfo); +- /* Reset index to random sign vector to make sign calculation frame agnostic +- (only depends on number of subsequently concealed spectral blocks) */ +- hConcealmentInfo->iRandomPhase = 0; +- } else { +- if (hConcealmentInfo->lastRenderMode == AACDEC_RENDER_INVALID) { +- hConcealmentInfo->lastRenderMode = AACDEC_RENDER_IMDCT; +- } +- pAacDecoderChannelInfo->renderMode = +- (AACDEC_RENDER_MODE)hConcealmentInfo->lastRenderMode; +- } +- +- /* hand current frame status to the state machine */ +- CConcealment_UpdateState(hConcealmentInfo, frameOk, +- pAacDecoderStaticChannelInfo, samplesPerFrame, +- pAacDecoderChannelInfo); +- +- { +- if (!frameOk && pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_IMDCT) { +- /* LPC extrapolation */ +- CLpc_Conceal(pAacDecoderChannelInfo->data.usac.lsp_coeff, +- pAacDecoderStaticChannelInfo->lpc4_lsf, +- pAacDecoderStaticChannelInfo->lsf_adaptive_mean, +- hConcealmentInfo->lastRenderMode == AACDEC_RENDER_IMDCT); +- FDKmemcpy(hConcealmentInfo->lsf4, pAacDecoderStaticChannelInfo->lpc4_lsf, +- sizeof(pAacDecoderStaticChannelInfo->lpc4_lsf)); +- } +- +- /* Create data for signal rendering according to the selected concealment +- * method and decoder operating mode. */ +- +- if ((!frameOk || mute_release_active) && +- (pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD)) { +- /* Restore old LSF4 */ +- FDKmemcpy(pAacDecoderStaticChannelInfo->lpc4_lsf, hConcealmentInfo->lsf4, +- sizeof(pAacDecoderStaticChannelInfo->lpc4_lsf)); +- /* Restore old TCX gain */ +- pAacDecoderStaticChannelInfo->last_tcx_gain = +- hConcealmentInfo->last_tcx_gain; +- pAacDecoderStaticChannelInfo->last_tcx_gain_e = +- hConcealmentInfo->last_tcx_gain_e; +- } +- +- if (!(pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD && +- pAacDecoderStaticChannelInfo->last_lpd_mode == 0)) { +- switch (hConcealmentInfo->pConcealParams->method) { +- default: +- case ConcealMethodMute: +- if (!frameOk) { +- /* Mute spectral data in case of errors */ +- FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, +- samplesPerFrame * sizeof(FIXP_DBL)); +- /* Set last window shape */ +- pAacDecoderChannelInfo->icsInfo.WindowShape = +- hConcealmentInfo->windowShape; +- appliedProcessing = 1; +- } +- break; +- +- case ConcealMethodNoise: +- /* Noise substitution error concealment technique */ +- appliedProcessing = CConcealment_ApplyNoise( +- hConcealmentInfo, pAacDecoderChannelInfo, +- pAacDecoderStaticChannelInfo, pSamplingRateInfo, samplesPerFrame, +- flags); +- break; +- +- case ConcealMethodInter: +- /* Energy interpolation concealment based on 3GPP */ +- appliedProcessing = CConcealment_ApplyInter( +- hConcealmentInfo, pAacDecoderChannelInfo, pSamplingRateInfo, +- samplesPerFrame, 0, /* don't use tonal improvement */ +- frameOk, mute_release_active); +- break; +- } +- } else if (!frameOk || mute_release_active) { +- /* simply restore the buffer */ +- FIXP_DBL *pSpectralCoefficient = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +-#if (CNCL_FRACT_BITS != DFRACT_BITS) +- FIXP_CNCL *RESTRICT pCncl = +- &hConcealmentInfo->spectralCoefficient[1024 - 1]; +- FIXP_DBL *RESTRICT pSpec = &pSpectralCoefficient[1024 - 1]; +- int i; +-#endif +- +- /* restore window infos (gri) do we need that? */ +- pIcsInfo->WindowSequence = hConcealmentInfo->windowSequence; +- pIcsInfo->WindowShape = hConcealmentInfo->windowShape; +- +- if (hConcealmentInfo->concealState != ConcealState_Mute) { +- /* restore scale factors */ +- FDKmemcpy(pSpecScale, hConcealmentInfo->specScale, 8 * sizeof(SHORT)); +- +- /* restore spectral bins */ +-#if (CNCL_FRACT_BITS == DFRACT_BITS) +- FDKmemcpy(pSpectralCoefficient, hConcealmentInfo->spectralCoefficient, +- 1024 * sizeof(FIXP_DBL)); +-#else +- for (i = 1024; i != 0; i--) { +- *pSpec-- = FX_CNCL2FX_DBL(*pCncl--); +- } +-#endif +- } else { +- /* clear scale factors */ +- FDKmemclear(pSpecScale, 8 * sizeof(SHORT)); +- +- /* clear buffer */ +- FDKmemclear(pSpectralCoefficient, 1024 * sizeof(FIXP_CNCL)); +- } +- } +- } +- /* update history */ +- hConcealmentInfo->prevFrameOk[0] = hConcealmentInfo->prevFrameOk[1]; +- hConcealmentInfo->prevFrameOk[1] = frameOk; +- +- return mute_release_active ? -1 : appliedProcessing; +-} +- +-/*! +-\brief Apply concealment noise substitution +- +- In case of frame lost this function produces a noisy frame with respect to the +- energies values of past frame. +- */ +-static int CConcealment_ApplyNoise( +- CConcealmentInfo *pConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const UINT flags) { +- FIXP_DBL *pSpectralCoefficient = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- +- int appliedProcessing = 0; +- +- FDK_ASSERT(pConcealmentInfo != NULL); +- FDK_ASSERT((samplesPerFrame >= 120) && (samplesPerFrame <= 1024)); +- +- switch (pConcealmentInfo->concealState) { +- case ConcealState_Ok: +- /* Nothing to do here! */ +- break; +- +- case ConcealState_Single: +- case ConcealState_FadeOut: +- appliedProcessing = CConcealment_ApplyFadeOut( +- /*mode =*/1, pConcealmentInfo, pAacDecoderStaticChannelInfo, +- samplesPerFrame, pAacDecoderChannelInfo); +- break; +- +- case ConcealState_Mute: { +- /* set dummy window parameters */ +- pIcsInfo->Valid = 0; /* Trigger the generation of a consitent IcsInfo */ +- pIcsInfo->WindowShape = +- pConcealmentInfo->windowShape; /* Prevent an invalid WindowShape +- (required for F/T transform) */ +- pIcsInfo->WindowSequence = +- CConcealment_GetWinSeq(pConcealmentInfo->windowSequence); +- pConcealmentInfo->windowSequence = +- pIcsInfo->WindowSequence; /* Store for next frame +- (spectrum in concealment +- buffer can't be used at +- all) */ +- +- /* mute spectral data */ +- FDKmemclear(pSpectralCoefficient, samplesPerFrame * sizeof(FIXP_DBL)); +- FDKmemclear(pConcealmentInfo->spectralCoefficient, +- samplesPerFrame * sizeof(FIXP_DBL)); +- +- appliedProcessing = 1; +- } break; +- +- case ConcealState_FadeIn: { +- /* TimeDomainFading: */ +- /* Attenuation of signal is done in CConcealment_TDFading() */ +- +- appliedProcessing = 1; +- } break; +- +- default: +- /* we shouldn't come here anyway */ +- FDK_ASSERT(0); +- break; +- } +- +- return appliedProcessing; +-} +- +-/*! +- \brief Apply concealment interpolation +- +- The function swaps the data from the current and the previous frame. If an +- error has occured, frame interpolation is performed to restore the missing +- frame. In case of multiple faulty frames, fade-in and fade-out is applied. +-*/ +-static int CConcealment_ApplyInter( +- CConcealmentInfo *pConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const int improveTonal, const int frameOk, const int mute_release_active) { +-#if defined(FDK_ASSERT_ENABLE) +- CConcealParams *pConcealCommonData = pConcealmentInfo->pConcealParams; +-#endif +- +- FIXP_DBL *pSpectralCoefficient = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; +- +- int sfbEnergyPrev[64]; +- int sfbEnergyAct[64]; +- +- int i, appliedProcessing = 0; +- +- /* clear/init */ +- FDKmemclear(sfbEnergyPrev, 64 * sizeof(int)); +- FDKmemclear(sfbEnergyAct, 64 * sizeof(int)); +- +- if (!frameOk || mute_release_active) { +- /* Restore last frame from concealment buffer */ +- pIcsInfo->WindowShape = pConcealmentInfo->windowShape; +- pIcsInfo->WindowSequence = pConcealmentInfo->windowSequence; +- +- /* Restore spectral data */ +- for (i = 0; i < samplesPerFrame; i++) { +- pSpectralCoefficient[i] = +- FX_CNCL2FX_DBL(pConcealmentInfo->spectralCoefficient[i]); +- } +- +- /* Restore scale factors */ +- FDKmemcpy(pSpecScale, pConcealmentInfo->specScale, 8 * sizeof(SHORT)); +- } +- +- /* if previous frame was not ok */ +- if (!pConcealmentInfo->prevFrameOk[1] || mute_release_active) { +- /* if current frame (f_n) is ok and the last but one frame (f_(n-2)) +- was ok, too, then interpolate both frames in order to generate +- the current output frame (f_(n-1)). Otherwise, use the last stored +- frame (f_(n-2) or f_(n-3) or ...). */ +- if (frameOk && pConcealmentInfo->prevFrameOk[0] && !mute_release_active) { +- appliedProcessing = 1; +- +- /* Interpolate both frames in order to generate the current output frame +- * (f_(n-1)). */ +- if (pIcsInfo->WindowSequence == BLOCK_SHORT) { +- /* f_(n-2) == BLOCK_SHORT */ +- /* short--??????--short, short--??????--long interpolation */ +- /* short--short---short, short---long---long interpolation */ +- +- int wnd; +- +- if (pConcealmentInfo->windowSequence == +- BLOCK_SHORT) { /* f_n == BLOCK_SHORT */ +- /* short--short---short interpolation */ +- +- int scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Short; +- const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; +- pIcsInfo->WindowShape = (samplesPerFrame <= 512) ? 2 : 1; +- pIcsInfo->WindowSequence = BLOCK_SHORT; +- +- for (wnd = 0; wnd < 8; wnd++) { +- CConcealment_CalcBandEnergy( +- &pSpectralCoefficient[wnd * +- (samplesPerFrame / 8)], /* spec_(n-2) */ +- pSamplingRateInfo, BLOCK_SHORT, CConcealment_NoExpand, +- sfbEnergyPrev); +- +- CConcealment_CalcBandEnergy( +- &pConcealmentInfo->spectralCoefficient[wnd * (samplesPerFrame / +- 8)], /* spec_n */ +- pSamplingRateInfo, BLOCK_SHORT, CConcealment_NoExpand, +- sfbEnergyAct); +- +- CConcealment_InterpolateBuffer( +- &pSpectralCoefficient[wnd * +- (samplesPerFrame / 8)], /* spec_(n-1) */ +- &pSpecScale[wnd], &pConcealmentInfo->specScale[wnd], +- &pSpecScale[wnd], sfbEnergyPrev, sfbEnergyAct, +- scaleFactorBandsTotal, pSfbOffset); +- } +- } else { /* f_n != BLOCK_SHORT */ +- /* short---long---long interpolation */ +- +- int scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Long; +- const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; +- SHORT specScaleOut; +- +- CConcealment_CalcBandEnergy( +- &pSpectralCoefficient[samplesPerFrame - +- (samplesPerFrame / +- 8)], /* [wnd] spec_(n-2) */ +- pSamplingRateInfo, BLOCK_SHORT, CConcealment_Expand, +- sfbEnergyAct); +- +- CConcealment_CalcBandEnergy( +- pConcealmentInfo->spectralCoefficient, /* spec_n */ +- pSamplingRateInfo, BLOCK_LONG, CConcealment_NoExpand, +- sfbEnergyPrev); +- +- pIcsInfo->WindowShape = 0; +- pIcsInfo->WindowSequence = BLOCK_STOP; +- +- for (i = 0; i < samplesPerFrame; i++) { +- pSpectralCoefficient[i] = +- pConcealmentInfo->spectralCoefficient[i]; /* spec_n */ +- } +- +- for (i = 0; i < 8; i++) { /* search for max(specScale) */ +- if (pSpecScale[i] > pSpecScale[0]) { +- pSpecScale[0] = pSpecScale[i]; +- } +- } +- +- CConcealment_InterpolateBuffer( +- pSpectralCoefficient, /* spec_(n-1) */ +- &pConcealmentInfo->specScale[0], &pSpecScale[0], &specScaleOut, +- sfbEnergyPrev, sfbEnergyAct, scaleFactorBandsTotal, pSfbOffset); +- +- pSpecScale[0] = specScaleOut; +- } +- } else { +- /* long--??????--short, long--??????--long interpolation */ +- /* long---long---short, long---long---long interpolation */ +- +- int scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Long; +- const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; +- SHORT specScaleAct = pConcealmentInfo->specScale[0]; +- +- CConcealment_CalcBandEnergy(pSpectralCoefficient, /* spec_(n-2) */ +- pSamplingRateInfo, BLOCK_LONG, +- CConcealment_NoExpand, sfbEnergyPrev); +- +- if (pConcealmentInfo->windowSequence == +- BLOCK_SHORT) { /* f_n == BLOCK_SHORT */ +- /* long---long---short interpolation */ +- +- pIcsInfo->WindowShape = (samplesPerFrame <= 512) ? 2 : 1; +- pIcsInfo->WindowSequence = BLOCK_START; +- +- for (i = 1; i < 8; i++) { /* search for max(specScale) */ +- if (pConcealmentInfo->specScale[i] > specScaleAct) { +- specScaleAct = pConcealmentInfo->specScale[i]; +- } +- } +- +- /* Expand first short spectrum */ +- CConcealment_CalcBandEnergy( +- pConcealmentInfo->spectralCoefficient, /* spec_n */ +- pSamplingRateInfo, BLOCK_SHORT, CConcealment_Expand, /* !!! */ +- sfbEnergyAct); +- } else { +- /* long---long---long interpolation */ +- +- pIcsInfo->WindowShape = 0; +- pIcsInfo->WindowSequence = BLOCK_LONG; +- +- CConcealment_CalcBandEnergy( +- pConcealmentInfo->spectralCoefficient, /* spec_n */ +- pSamplingRateInfo, BLOCK_LONG, CConcealment_NoExpand, +- sfbEnergyAct); +- } +- +- CConcealment_InterpolateBuffer( +- pSpectralCoefficient, /* spec_(n-1) */ +- &pSpecScale[0], &specScaleAct, &pSpecScale[0], sfbEnergyPrev, +- sfbEnergyAct, scaleFactorBandsTotal, pSfbOffset); +- } +- } +- +- /* Noise substitution of sign of the output spectral coefficients */ +- CConcealment_ApplyRandomSign(pConcealmentInfo->iRandomPhase, +- pSpectralCoefficient, samplesPerFrame); +- /* Increment random phase index to avoid repetition artifacts. */ +- pConcealmentInfo->iRandomPhase = +- (pConcealmentInfo->iRandomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); +- } +- +- /* scale spectrum according to concealment state */ +- switch (pConcealmentInfo->concealState) { +- case ConcealState_Single: +- appliedProcessing = 1; +- break; +- +- case ConcealState_FadeOut: { +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames < +- CONCEAL_MAX_NUM_FADE_FACTORS); +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames < +- pConcealCommonData->numFadeOutFrames); +- +- /* TimeDomainFading: */ +- /* Attenuation of signal is done in CConcealment_TDFading() */ +- +- appliedProcessing = 1; +- } break; +- +- case ConcealState_FadeIn: { +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames < +- CONCEAL_MAX_NUM_FADE_FACTORS); +- FDK_ASSERT(pConcealmentInfo->cntFadeFrames < +- pConcealCommonData->numFadeInFrames); +- +- /* TimeDomainFading: */ +- /* Attenuation of signal is done in CConcealment_TDFading() */ +- +- appliedProcessing = 1; +- } break; +- +- case ConcealState_Mute: { +- /* set dummy window parameters */ +- pIcsInfo->Valid = 0; /* Trigger the generation of a consitent IcsInfo */ +- pIcsInfo->WindowShape = +- pConcealmentInfo->windowShape; /* Prevent an invalid WindowShape +- (required for F/T transform) */ +- pIcsInfo->WindowSequence = +- CConcealment_GetWinSeq(pConcealmentInfo->windowSequence); +- pConcealmentInfo->windowSequence = +- pIcsInfo->WindowSequence; /* Store for next frame +- (spectrum in concealment +- buffer can't be used at +- all) */ +- +- /* mute spectral data */ +- FDKmemclear(pSpectralCoefficient, samplesPerFrame * sizeof(FIXP_DBL)); +- +- appliedProcessing = 1; +- } break; +- +- default: +- /* nothing to do here */ +- break; +- } +- +- return appliedProcessing; +-} +- +-/*! +- \brief Calculate the spectral energy +- +- The function calculates band-wise the spectral energy. This is used for +- frame interpolation. +-*/ +-static void CConcealment_CalcBandEnergy( +- FIXP_DBL *spectrum, const SamplingRateInfo *pSamplingRateInfo, +- const int blockType, CConcealmentExpandType expandType, int *sfbEnergy) { +- const SHORT *pSfbOffset; +- int line, sfb, scaleFactorBandsTotal = 0; +- +- /* In the following calculations, enAccu is initialized with LSB-value in +- * order to avoid zero energy-level */ +- +- line = 0; +- +- switch (blockType) { +- case BLOCK_LONG: +- case BLOCK_START: +- case BLOCK_STOP: +- +- if (expandType == CConcealment_NoExpand) { +- /* standard long calculation */ +- scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Long; +- pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; +- +- for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { +- FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; +- int sfbScale = +- (sizeof(LONG) << 3) - +- CntLeadingZeros(pSfbOffset[sfb + 1] - pSfbOffset[sfb]) - 1; +- /* scaling depends on sfb width. */ +- for (; line < pSfbOffset[sfb + 1]; line++) { +- enAccu += fPow2Div2(*(spectrum + line)) >> sfbScale; +- } +- *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; +- } +- } else { +- /* compress long to short */ +- scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Short; +- pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; +- +- for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { +- FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; +- int sfbScale = +- (sizeof(LONG) << 3) - +- CntLeadingZeros(pSfbOffset[sfb + 1] - pSfbOffset[sfb]) - 1; +- /* scaling depends on sfb width. */ +- for (; line < pSfbOffset[sfb + 1] << 3; line++) { +- enAccu += +- (enAccu + (fPow2Div2(*(spectrum + line)) >> sfbScale)) >> 3; +- } +- *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; +- } +- } +- break; +- +- case BLOCK_SHORT: +- +- if (expandType == CConcealment_NoExpand) { +- /* standard short calculation */ +- scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Short; +- pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; +- +- for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { +- FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; +- int sfbScale = +- (sizeof(LONG) << 3) - +- CntLeadingZeros(pSfbOffset[sfb + 1] - pSfbOffset[sfb]) - 1; +- /* scaling depends on sfb width. */ +- for (; line < pSfbOffset[sfb + 1]; line++) { +- enAccu += fPow2Div2(*(spectrum + line)) >> sfbScale; +- } +- *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; +- } +- } else { +- /* expand short to long spectrum */ +- scaleFactorBandsTotal = +- pSamplingRateInfo->NumberOfScaleFactorBands_Long; +- pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; +- +- for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { +- FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; +- int sfbScale = +- (sizeof(LONG) << 3) - +- CntLeadingZeros(pSfbOffset[sfb + 1] - pSfbOffset[sfb]) - 1; +- /* scaling depends on sfb width. */ +- for (; line < pSfbOffset[sfb + 1]; line++) { +- enAccu += fPow2Div2(*(spectrum + (line >> 3))) >> sfbScale; +- } +- *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; +- } +- } +- break; +- } +-} +- +-/*! +- \brief Interpolate buffer +- +- The function creates the interpolated spectral data according to the +- energy of the last good frame and the current (good) frame. +-*/ +-static void CConcealment_InterpolateBuffer(FIXP_DBL *spectrum, +- SHORT *pSpecScalePrv, +- SHORT *pSpecScaleAct, +- SHORT *pSpecScaleOut, int *enPrv, +- int *enAct, int sfbCnt, +- const SHORT *pSfbOffset) { +- int sfb, line = 0; +- int fac_shift; +- int fac_mod; +- FIXP_DBL accu; +- +- for (sfb = 0; sfb < sfbCnt; sfb++) { +- fac_shift = +- enPrv[sfb] - enAct[sfb] + ((*pSpecScaleAct - *pSpecScalePrv) << 1); +- fac_mod = fac_shift & 3; +- fac_shift = (fac_shift >> 2) + 1; +- fac_shift += *pSpecScalePrv - fixMax(*pSpecScalePrv, *pSpecScaleAct); +- +- for (; line < pSfbOffset[sfb + 1]; line++) { +- accu = fMult(*(spectrum + line), facMod4Table[fac_mod]); +- if (fac_shift < 0) { +- accu >>= -fac_shift; +- } else { +- accu <<= fac_shift; +- } +- *(spectrum + line) = accu; +- } +- } +- *pSpecScaleOut = fixMax(*pSpecScalePrv, *pSpecScaleAct); +-} +- +-/*! +- \brief Find next fading frame in case of changing fading direction +- +- \param pConcealCommonData Pointer to the concealment common data structure. +- \param actFadeIndex Last index used for fading +- \param direction Direction of change: 0 : change from FADE-OUT to FADE-IN, 1 +- : change from FADE-IN to FADE-OUT +- +- This function determines the next fading index to be used for the fading +- direction to be changed to. +-*/ +- +-static INT findEquiFadeFrame(CConcealParams *pConcealCommonData, +- INT actFadeIndex, int direction) { +- FIXP_SGL *pFactor; +- FIXP_SGL referenceVal; +- FIXP_SGL minDiff = (FIXP_SGL)MAXVAL_SGL; +- +- INT nextFadeIndex = 0; +- +- int i; +- +- /* init depending on direction */ +- if (direction == 0) { /* FADE-OUT => FADE-IN */ +- if (actFadeIndex < 0) { +- referenceVal = (FIXP_SGL)MAXVAL_SGL; +- } else { +- referenceVal = pConcealCommonData->fadeOutFactor[actFadeIndex] >> 1; +- } +- pFactor = pConcealCommonData->fadeInFactor; +- } else { /* FADE-IN => FADE-OUT */ +- if (actFadeIndex < 0) { +- referenceVal = (FIXP_SGL)MAXVAL_SGL; +- } else { +- referenceVal = pConcealCommonData->fadeInFactor[actFadeIndex] >> 1; +- } +- pFactor = pConcealCommonData->fadeOutFactor; +- } +- +- /* search for minimum difference */ +- for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { +- FIXP_SGL diff = fixp_abs((pFactor[i] >> 1) - referenceVal); +- if (diff < minDiff) { +- minDiff = diff; +- nextFadeIndex = i; +- } +- } +- +- /* check and adjust depending on direction */ +- if (direction == 0) { /* FADE-OUT => FADE-IN */ +- if (nextFadeIndex > pConcealCommonData->numFadeInFrames) { +- nextFadeIndex = fMax(pConcealCommonData->numFadeInFrames - 1, 0); +- } +- if (((pFactor[nextFadeIndex] >> 1) <= referenceVal) && +- (nextFadeIndex > 0)) { +- nextFadeIndex -= 1; +- } +- } else { /* FADE-IN => FADE-OUT */ +- if (((pFactor[nextFadeIndex] >> 1) >= referenceVal) && +- (nextFadeIndex < CONCEAL_MAX_NUM_FADE_FACTORS - 1)) { +- nextFadeIndex += 1; +- } +- } +- +- return (nextFadeIndex); +-} +- +-/*! +- \brief Update the concealment state +- +- The function updates the state of the concealment state-machine. The +- states are: mute, fade-in, fade-out, interpolate and frame-ok. +-*/ +-static void CConcealment_UpdateState( +- CConcealmentInfo *pConcealmentInfo, int frameOk, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const int samplesPerFrame, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { +- CConcealParams *pConcealCommonData = pConcealmentInfo->pConcealParams; +- +- switch (pConcealCommonData->method) { +- case ConcealMethodNoise: { +- if (pConcealmentInfo->concealState != ConcealState_Ok) { +- /* count the valid frames during concealment process */ +- if (frameOk) { +- pConcealmentInfo->cntValidFrames += 1; +- } else { +- pConcealmentInfo->cntValidFrames = 0; +- } +- } +- +- /* -- STATE MACHINE for Noise Substitution -- */ +- switch (pConcealmentInfo->concealState) { +- case ConcealState_Ok: +- if (!frameOk) { +- pConcealmentInfo->cntFadeFrames = 0; +- pConcealmentInfo->cntValidFrames = 0; +- pConcealmentInfo->attGrpOffset[0] = 0; +- pConcealmentInfo->attGrpOffset[1] = 0; +- pConcealmentInfo->winGrpOffset[0] = 0; +- pConcealmentInfo->winGrpOffset[1] = 0; +- if (pConcealCommonData->numFadeOutFrames > 0) { +- /* change to state SINGLE-FRAME-LOSS */ +- pConcealmentInfo->concealState = ConcealState_Single; +- /* mode 0 just updates the Fading counter */ +- CConcealment_ApplyFadeOut( +- /*mode =*/0, pConcealmentInfo, pAacDecoderStaticChannelInfo, +- samplesPerFrame, pAacDecoderChannelInfo); +- +- } else { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } +- } +- break; +- +- case ConcealState_Single: /* Just a pre-stage before fade-out begins. +- Stay here only one frame! */ +- if (frameOk) { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } else { +- if (pConcealmentInfo->cntFadeFrames >= +- pConcealCommonData->numFadeOutFrames) { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } else { +- /* change to state FADE-OUT */ +- pConcealmentInfo->concealState = ConcealState_FadeOut; +- /* mode 0 just updates the Fading counter */ +- CConcealment_ApplyFadeOut( +- /*mode =*/0, pConcealmentInfo, pAacDecoderStaticChannelInfo, +- samplesPerFrame, pAacDecoderChannelInfo); +- } +- } +- break; +- +- case ConcealState_FadeOut: +- if (pConcealmentInfo->cntValidFrames > +- pConcealCommonData->numMuteReleaseFrames) { +- if (pConcealCommonData->numFadeInFrames > 0) { +- /* change to state FADE-IN */ +- pConcealmentInfo->concealState = ConcealState_FadeIn; +- pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( +- pConcealCommonData, pConcealmentInfo->cntFadeFrames, +- 0 /* FadeOut -> FadeIn */); +- } else { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } else { +- if (frameOk) { +- /* we have good frame information but stay fully in concealment - +- * reset winGrpOffset/attGrpOffset */ +- pConcealmentInfo->winGrpOffset[0] = 0; +- pConcealmentInfo->winGrpOffset[1] = 0; +- pConcealmentInfo->attGrpOffset[0] = 0; +- pConcealmentInfo->attGrpOffset[1] = 0; +- } +- if (pConcealmentInfo->cntFadeFrames >= +- pConcealCommonData->numFadeOutFrames) { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } else /* Stay in FADE-OUT */ +- { +- /* mode 0 just updates the Fading counter */ +- CConcealment_ApplyFadeOut( +- /*mode =*/0, pConcealmentInfo, pAacDecoderStaticChannelInfo, +- samplesPerFrame, pAacDecoderChannelInfo); +- } +- } +- break; +- +- case ConcealState_Mute: +- if (pConcealmentInfo->cntValidFrames > +- pConcealCommonData->numMuteReleaseFrames) { +- if (pConcealCommonData->numFadeInFrames > 0) { +- /* change to state FADE-IN */ +- pConcealmentInfo->concealState = ConcealState_FadeIn; +- pConcealmentInfo->cntFadeFrames = +- pConcealCommonData->numFadeInFrames - 1; +- } else { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } else { +- if (frameOk) { +- /* we have good frame information but stay fully in concealment - +- * reset winGrpOffset/attGrpOffset */ +- pConcealmentInfo->winGrpOffset[0] = 0; +- pConcealmentInfo->winGrpOffset[1] = 0; +- pConcealmentInfo->attGrpOffset[0] = 0; +- pConcealmentInfo->attGrpOffset[1] = 0; +- } +- } +- break; +- +- case ConcealState_FadeIn: +- pConcealmentInfo->cntFadeFrames -= 1; +- if (frameOk) { +- if (pConcealmentInfo->cntFadeFrames < 0) { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } else { +- if (pConcealCommonData->numFadeOutFrames > 0) { +- /* change to state FADE-OUT */ +- pConcealmentInfo->concealState = ConcealState_FadeOut; +- pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( +- pConcealCommonData, pConcealmentInfo->cntFadeFrames + 1, +- 1 /* FadeIn -> FadeOut */); +- pConcealmentInfo->winGrpOffset[0] = 0; +- pConcealmentInfo->winGrpOffset[1] = 0; +- pConcealmentInfo->attGrpOffset[0] = 0; +- pConcealmentInfo->attGrpOffset[1] = 0; +- +- pConcealmentInfo +- ->cntFadeFrames--; /* decrease because +- CConcealment_ApplyFadeOut() will +- increase, accordingly */ +- /* mode 0 just updates the Fading counter */ +- CConcealment_ApplyFadeOut( +- /*mode =*/0, pConcealmentInfo, pAacDecoderStaticChannelInfo, +- samplesPerFrame, pAacDecoderChannelInfo); +- } else { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } +- } +- break; +- +- default: +- FDK_ASSERT(0); +- break; +- } +- } break; +- +- case ConcealMethodInter: +- case ConcealMethodTonal: { +- if (pConcealmentInfo->concealState != ConcealState_Ok) { +- /* count the valid frames during concealment process */ +- if (pConcealmentInfo->prevFrameOk[1] || +- (pConcealmentInfo->prevFrameOk[0] && +- !pConcealmentInfo->prevFrameOk[1] && frameOk)) { +- /* The frame is OK even if it can be estimated by the energy +- * interpolation algorithm */ +- pConcealmentInfo->cntValidFrames += 1; +- } else { +- pConcealmentInfo->cntValidFrames = 0; +- } +- } +- +- /* -- STATE MACHINE for energy interpolation -- */ +- switch (pConcealmentInfo->concealState) { +- case ConcealState_Ok: +- if (!(pConcealmentInfo->prevFrameOk[1] || +- (pConcealmentInfo->prevFrameOk[0] && +- !pConcealmentInfo->prevFrameOk[1] && frameOk))) { +- if (pConcealCommonData->numFadeOutFrames > 0) { +- /* Fade out only if the energy interpolation algorithm can not be +- * applied! */ +- pConcealmentInfo->concealState = ConcealState_FadeOut; +- } else { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } +- pConcealmentInfo->cntFadeFrames = 0; +- pConcealmentInfo->cntValidFrames = 0; +- } +- break; +- +- case ConcealState_Single: +- pConcealmentInfo->concealState = ConcealState_Ok; +- break; +- +- case ConcealState_FadeOut: +- pConcealmentInfo->cntFadeFrames += 1; +- +- if (pConcealmentInfo->cntValidFrames > +- pConcealCommonData->numMuteReleaseFrames) { +- if (pConcealCommonData->numFadeInFrames > 0) { +- /* change to state FADE-IN */ +- pConcealmentInfo->concealState = ConcealState_FadeIn; +- pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( +- pConcealCommonData, pConcealmentInfo->cntFadeFrames - 1, +- 0 /* FadeOut -> FadeIn */); +- } else { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } else { +- if (pConcealmentInfo->cntFadeFrames >= +- pConcealCommonData->numFadeOutFrames) { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } +- } +- break; +- +- case ConcealState_Mute: +- if (pConcealmentInfo->cntValidFrames > +- pConcealCommonData->numMuteReleaseFrames) { +- if (pConcealCommonData->numFadeInFrames > 0) { +- /* change to state FADE-IN */ +- pConcealmentInfo->concealState = ConcealState_FadeIn; +- pConcealmentInfo->cntFadeFrames = +- pConcealCommonData->numFadeInFrames - 1; +- } else { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } +- break; +- +- case ConcealState_FadeIn: +- pConcealmentInfo->cntFadeFrames -= +- 1; /* used to address the fade-in factors */ +- +- if (frameOk || pConcealmentInfo->prevFrameOk[1]) { +- if (pConcealmentInfo->cntFadeFrames < 0) { +- /* change to state OK */ +- pConcealmentInfo->concealState = ConcealState_Ok; +- } +- } else { +- if (pConcealCommonData->numFadeOutFrames > 0) { +- /* change to state FADE-OUT */ +- pConcealmentInfo->concealState = ConcealState_FadeOut; +- pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( +- pConcealCommonData, pConcealmentInfo->cntFadeFrames + 1, +- 1 /* FadeIn -> FadeOut */); +- } else { +- /* change to state MUTE */ +- pConcealmentInfo->concealState = ConcealState_Mute; +- } +- } +- break; +- } /* End switch(pConcealmentInfo->concealState) */ +- } break; +- +- default: +- /* Don't need a state machine for other concealment methods. */ +- break; +- } +-} +- +-/*! +-\brief Randomizes the sign of the spectral data +- +- The function toggles the sign of the spectral data randomly. This is +- useful to ensure the quality of the concealed frames. +- */ +-static void CConcealment_ApplyRandomSign(int randomPhase, FIXP_DBL *spec, +- int samplesPerFrame) { +- int i; +- USHORT packedSign = 0; +- +- /* random table 512x16bit has been reduced to 512 packed sign bits = 32x16 bit +- */ +- +- /* read current packed sign word */ +- packedSign = AacDec_randomSign[randomPhase >> 4]; +- packedSign >>= (randomPhase & 0xf); +- +- for (i = 0; i < samplesPerFrame; i++) { +- if ((randomPhase & 0xf) == 0) { +- packedSign = AacDec_randomSign[randomPhase >> 4]; +- } +- +- if (packedSign & 0x1) { +- spec[i] = -spec[i]; +- } +- packedSign >>= 1; +- +- randomPhase = (randomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); +- } +-} +- +-/*! +- \brief Get fadeing factor for current concealment state. +- +- The function returns the state (ok or not) of the previous frame. +- If called before the function CConcealment_Apply() set the fBeforeApply +- flag to get the correct value. +- +- \return Frame OK flag of previous frame. +- */ +-int CConcealment_GetLastFrameOk(CConcealmentInfo *hConcealmentInfo, +- const int fBeforeApply) { +- int prevFrameOk = 1; +- +- if (hConcealmentInfo != NULL) { +- prevFrameOk = hConcealmentInfo->prevFrameOk[fBeforeApply & 0x1]; +- } +- +- return prevFrameOk; +-} +- +-/*! +- \brief Get the number of delay frames introduced by concealment technique. +- +- \return Number of delay frames. +- */ +-UINT CConcealment_GetDelay(CConcealParams *pConcealCommonData) { +- UINT frameDelay = 0; +- +- if (pConcealCommonData != NULL) { +- switch (pConcealCommonData->method) { +- case ConcealMethodTonal: +- case ConcealMethodInter: +- frameDelay = 1; +- break; +- default: +- break; +- } +- } +- +- return frameDelay; +-} +- +-static int CConcealment_ApplyFadeOut( +- int mode, CConcealmentInfo *pConcealmentInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const int samplesPerFrame, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { +- /* mode 1 = apply RandomSign and mute spectral coefficients if necessary, * +- * mode 0 = Update cntFadeFrames */ +- +- /* restore frequency coefficients from buffer with a specific muting */ +- int srcWin, dstWin, numWindows = 1; +- int windowLen = samplesPerFrame; +- int srcGrpStart = 0; +- int winIdxStride = 1; +- int numWinGrpPerFac, attIdx, attIdxStride; +- int i; +- int appliedProcessing = 0; +- +- CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; +- FIXP_DBL *pSpectralCoefficient = +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); +- SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; +- +- /* set old window parameters */ +- if (pConcealmentInfo->lastRenderMode == AACDEC_RENDER_LPD) { +- switch (pAacDecoderStaticChannelInfo->last_lpd_mode) { +- case 1: +- numWindows = 4; +- srcGrpStart = 3; +- windowLen = samplesPerFrame >> 2; +- break; +- case 2: +- numWindows = 2; +- srcGrpStart = 1; +- windowLen = samplesPerFrame >> 1; +- winIdxStride = 2; +- break; +- case 3: +- numWindows = 1; +- srcGrpStart = 0; +- windowLen = samplesPerFrame; +- winIdxStride = 4; +- break; +- } +- pConcealmentInfo->lastWinGrpLen = 1; +- } else { +- pIcsInfo->WindowShape = pConcealmentInfo->windowShape; +- pIcsInfo->WindowSequence = pConcealmentInfo->windowSequence; +- +- if (pConcealmentInfo->windowSequence == BLOCK_SHORT) { +- /* short block handling */ +- numWindows = 8; +- windowLen = samplesPerFrame >> 3; +- srcGrpStart = numWindows - pConcealmentInfo->lastWinGrpLen; +- } +- } +- +- attIdxStride = +- fMax(1, (int)(numWindows / (pConcealmentInfo->lastWinGrpLen + 1))); +- +- /* load last state */ +- attIdx = pConcealmentInfo->cntFadeFrames; +- numWinGrpPerFac = pConcealmentInfo->attGrpOffset[mode]; +- srcWin = srcGrpStart + pConcealmentInfo->winGrpOffset[mode]; +- +- FDK_ASSERT((srcGrpStart * windowLen + windowLen) <= samplesPerFrame); +- FDK_ASSERT((srcWin * windowLen + windowLen) <= 1024); +- +- for (dstWin = 0; dstWin < numWindows; dstWin += 1) { +- FIXP_CNCL *pCncl = +- pConcealmentInfo->spectralCoefficient + (srcWin * windowLen); +- FIXP_DBL *pOut = pSpectralCoefficient + (dstWin * windowLen); +- +- if (mode == 1) { +- /* mute if attIdx gets large enaugh */ +- if (attIdx > pConcealmentInfo->pConcealParams->numFadeOutFrames) { +- FDKmemclear(pCncl, sizeof(FIXP_DBL) * windowLen); +- } +- +- /* restore frequency coefficients from buffer - attenuation is done later +- */ +- for (i = 0; i < windowLen; i++) { +- pOut[i] = pCncl[i]; +- } +- +- /* apply random change of sign for spectral coefficients */ +- CConcealment_ApplyRandomSign(pConcealmentInfo->iRandomPhase, pOut, +- windowLen); +- +- /* Increment random phase index to avoid repetition artifacts. */ +- pConcealmentInfo->iRandomPhase = +- (pConcealmentInfo->iRandomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); +- +- /* set old scale factors */ +- pSpecScale[dstWin * winIdxStride] = +- pConcealmentInfo->specScale[srcWin * winIdxStride]; +- } +- +- srcWin += 1; +- +- if (srcWin >= numWindows) { +- /* end of sequence -> rewind to first window of group */ +- srcWin = srcGrpStart; +- numWinGrpPerFac += 1; +- if (numWinGrpPerFac >= attIdxStride) { +- numWinGrpPerFac = 0; +- attIdx += 1; +- } +- } +- } +- +- /* store current state */ +- +- pConcealmentInfo->winGrpOffset[mode] = srcWin - srcGrpStart; +- FDK_ASSERT((pConcealmentInfo->winGrpOffset[mode] >= 0) && +- (pConcealmentInfo->winGrpOffset[mode] < 8)); +- pConcealmentInfo->attGrpOffset[mode] = numWinGrpPerFac; +- FDK_ASSERT((pConcealmentInfo->attGrpOffset[mode] >= 0) && +- (pConcealmentInfo->attGrpOffset[mode] < attIdxStride)); +- +- if (mode == 0) { +- pConcealmentInfo->cntFadeFrames = attIdx; +- } +- +- appliedProcessing = 1; +- +- return appliedProcessing; +-} +- +-/*! +- \brief Do Time domain fading (TDFading) in concealment case +- +- In case of concealment, this function takes care of the fading, after time +-domain signal has been rendered by the respective signal rendering functions. +- The fading out in case of ACELP decoding is not done by this function but by +-the ACELP decoder for the first concealed frame if CONCEAL_CORE_IGNORANT_FADE is +-not set. +- +- TimeDomain fading never creates jumps in energy / discontinuities, it always +-does a continuous fading. To achieve this, fading is always done from a starting +-point to a target point, while the starting point is always determined to be the +-last target point. By varying the target point of a fading, the fading slope can +-be controlled. +- +- This principle is applied to the fading within a frame and the fading from +-frame to frame. +- +- One frame is divided into 8 subframes to obtain 8 parts of fading slopes +-within a frame, each maybe with its own gradient. +- +- Workflow: +- 1.) Determine Fading behavior and end-of-frame target fading level, based on +-concealmentState (determined by CConcealment_UpdateState()) and the core mode. +- - By _DEFAULT_, +- The target fading level is determined by fadeOutFactor[cntFadeFrames] +-in case of fadeOut, or fadeInFactor[cntFadeFrames] in case of fadeIn. +- --> fading type is FADE_TIMEDOMAIN in this case. Target fading level +-is determined by fading index cntFadeFrames. +- +- - If concealmentState is signalling a _MUTED SIGNAL_, +- TDFading decays to 0 within 1/8th of a frame if numFadeOutFrames == 0. +- --> fading type is FADE_TIMEDOMAIN_TOSPECTRALMUTE in this case. +- +- - If concealmentState is signalling the _END OF MUTING_, +- TDFading fades to target fading level within 1/8th of a frame if +-numFadeInFrames == 0. +- --> fading type is FADE_TIMEDOMAIN_FROMSPECTRALMUTE in this case. +-Target fading level is determined by fading index cntFadeFrames. +- +-#ifndef CONCEAL_CORE_IGNORANT_FADE +- - In case of an _ACELP FADEOUT_, +- TDFading leaves fading control to ACELP decoder for 1/2 frame. +- --> fading type is FADE_ACELPDOMAIN in this case. +-#endif +- +- 2.) Render fading levels within current frame and do the final fading: +- Map Fading slopes to fading levels and apply to time domain signal. +- +- +-*/ +- +-INT CConcealment_TDFading( +- int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo, +- FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1) { +- /* +- Do the fading in Time domain based on concealment states and core mode +- */ +- FIXP_DBL fadeStop, attMute = (FIXP_DBL)0; +- int idx = 0, ii; +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo = +- *ppAacDecoderStaticChannelInfo; +- CConcealmentInfo *pConcealmentInfo = +- &pAacDecoderStaticChannelInfo->concealmentInfo; +- CConcealParams *pConcealParams = pConcealmentInfo->pConcealParams; +- const CConcealmentState concealState = pConcealmentInfo->concealState; +- TDfadingType fadingType; +- FIXP_DBL fadingStations[9] = {0}; +- int fadingSteps[8] = {0}; +- const FIXP_DBL fadeStart = +- pConcealmentInfo +- ->fade_old; /* start fading at last end-of-frame attenuation */ +- FIXP_SGL *fadeFactor = pConcealParams->fadeOutFactor; +- const INT cntFadeFrames = pConcealmentInfo->cntFadeFrames; +- int TDFadeOutStopBeforeMute = 1; +- int TDFadeInStopBeforeFullLevel = 1; +- +- /* +- determine Fading behaviour (end-of-frame attenuation and fading type) (1.) +- */ +- +- switch (concealState) { +- case ConcealState_Single: +- case ConcealState_Mute: +- case ConcealState_FadeOut: +- idx = (pConcealParams->method == ConcealMethodNoise) ? cntFadeFrames - 1 +- : cntFadeFrames; +- fadingType = FADE_TIMEDOMAIN; +- +- if (concealState == ConcealState_Mute || +- (cntFadeFrames + TDFadeOutStopBeforeMute) > +- pConcealmentInfo->pConcealParams->numFadeOutFrames) { +- fadingType = FADE_TIMEDOMAIN_TOSPECTRALMUTE; +- } +- +- break; +- case ConcealState_FadeIn: +- idx = cntFadeFrames; +- idx -= TDFadeInStopBeforeFullLevel; +- FDK_FALLTHROUGH; +- case ConcealState_Ok: +- fadeFactor = pConcealParams->fadeInFactor; +- idx = (concealState == ConcealState_Ok) ? -1 : idx; +- fadingType = (pConcealmentInfo->concealState_old == ConcealState_Mute) +- ? FADE_TIMEDOMAIN_FROMSPECTRALMUTE +- : FADE_TIMEDOMAIN; +- break; +- default: +- FDK_ASSERT(0); +- fadingType = FADE_TIMEDOMAIN_TOSPECTRALMUTE; +- break; +- } +- +- /* determine Target end-of-frame fading level and fading slope */ +- switch (fadingType) { +- case FADE_TIMEDOMAIN_FROMSPECTRALMUTE: +- fadeStop = +- (idx < 0) ? (FIXP_DBL)MAXVAL_DBL : FX_SGL2FX_DBL(fadeFactor[idx]); +- if (pConcealmentInfo->pConcealParams->numFadeInFrames == 0) { +- /* do step as fast as possible */ +- fadingSteps[0] = 1; +- break; +- } +- CConcealment_TDFading_doLinearFadingSteps(&fadingSteps[0]); +- break; +- case FADE_TIMEDOMAIN: +- fadeStop = +- (idx < 0) ? (FIXP_DBL)MAXVAL_DBL : FX_SGL2FX_DBL(fadeFactor[idx]); +- CConcealment_TDFading_doLinearFadingSteps(&fadingSteps[0]); +- break; +- case FADE_TIMEDOMAIN_TOSPECTRALMUTE: +- fadeStop = attMute; +- if (pConcealmentInfo->pConcealParams->numFadeOutFrames == 0) { +- /* do step as fast as possible */ +- fadingSteps[0] = 1; +- break; +- } +- CConcealment_TDFading_doLinearFadingSteps(&fadingSteps[0]); +- break; +- } +- +- /* +- Render fading levels within current frame and do the final fading (2.) +- */ +- +- len >>= 3; +- CConcealment_TDFadeFillFadingStations(fadingStations, fadingSteps, fadeStop, +- fadeStart, fadingType); +- +- if ((fadingStations[8] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[7] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[6] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[5] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[4] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[3] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[2] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[1] != (FIXP_DBL)MAXVAL_DBL) || +- (fadingStations[0] != +- (FIXP_DBL)MAXVAL_DBL)) /* if there's something to fade */ +- { +- int start = 0; +- for (ii = 0; ii < 8; ii++) { +- CConcealment_TDFadePcmAtt(start, len, fadingStations[ii], +- fadingStations[ii + 1], pcmdata); +- start += len; +- } +- } +- CConcealment_TDNoise_Apply(pConcealmentInfo, len, pcmdata); +- +- /* Save end-of-frame attenuation and fading type */ +- pConcealmentInfo->lastFadingType = fadingType; +- pConcealmentInfo->fade_old = fadeStop; +- pConcealmentInfo->concealState_old = concealState; +- +- return 1; +-} +- +-/* attenuate pcmdata in Time Domain Fading process */ +-static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart, +- FIXP_DBL fadeStop, FIXP_PCM *pcmdata) { +- int i; +- FIXP_DBL dStep; +- FIXP_DBL dGain; +- FIXP_DBL dGain_apply; +- int bitshift = (DFRACT_BITS - SAMPLE_BITS); +- +- /* set start energy */ +- dGain = fadeStart; +- /* determine energy steps from sample to sample */ +- dStep = (FIXP_DBL)((int)((fadeStart >> 1) - (fadeStop >> 1)) / len) << 1; +- +- for (i = start; i < (start + len); i++) { +- dGain -= dStep; +- /* prevent gain from getting negative due to possible fixpoint inaccuracies +- */ +- dGain_apply = fMax((FIXP_DBL)0, dGain); +- /* finally, attenuate samples */ +- pcmdata[i] = (FIXP_PCM)((fMult(pcmdata[i], (dGain_apply))) >> bitshift); +- } +-} +- +-/* +-\brief Fill FadingStations +- +-The fadingstations are the attenuation factors, being applied to its dedicated +-portions of pcm data. They are calculated using the fadingsteps. One fadingstep +-is the weighted contribution to the fading slope within its dedicated portion of +-pcm data. +- +-*Fadingsteps : 0 0 0 1 0 1 2 0 +- +- |<- 1 Frame pcm data ->| +- fadeStart-->|__________ | +- ^ ^ ^ ^ \____ | +- Attenuation : | | | | ^ ^\__ | +- | | | | | | ^\ | +- | | | | | | | \___|<-- fadeStop +- | | | | | | | ^ ^ +- | | | | | | | | | +-Fadingstations: [0][1][2][3][4][5][6][7][8] +- +-(Fadingstations "[0]" is "[8] from previous frame", therefore its not meaningful +-to be edited) +- +-*/ +-static void CConcealment_TDFadeFillFadingStations(FIXP_DBL *fadingStations, +- int *fadingSteps, +- FIXP_DBL fadeStop, +- FIXP_DBL fadeStart, +- TDfadingType fadingType) { +- int i; +- INT fadingSteps_sum = 0; +- INT fadeDiff; +- +- fadingSteps_sum = fadingSteps[0] + fadingSteps[1] + fadingSteps[2] + +- fadingSteps[3] + fadingSteps[4] + fadingSteps[5] + +- fadingSteps[6] + fadingSteps[7]; +- fadeDiff = ((INT)(fadeStop - fadeStart) / fMax(fadingSteps_sum, (INT)1)); +- fadingStations[0] = fadeStart; +- for (i = 1; i < 8; i++) { +- fadingStations[i] = +- fadingStations[i - 1] + (FIXP_DBL)(fadeDiff * fadingSteps[i - 1]); +- } +- fadingStations[8] = fadeStop; +-} +- +-static void CConcealment_TDFading_doLinearFadingSteps(int *fadingSteps) { +- fadingSteps[0] = fadingSteps[1] = fadingSteps[2] = fadingSteps[3] = +- fadingSteps[4] = fadingSteps[5] = fadingSteps[6] = fadingSteps[7] = 1; +-} +- +-/* end of TimeDomainFading functions */ +- +-/* derived from int UsacRandomSign() */ +-static int CConcealment_TDNoise_Random(ULONG *seed) { +- *seed = (ULONG)(((UINT64)(*seed) * 69069) + 5); +- return (int)(*seed); +-} +- +-static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo, +- const int len, FIXP_PCM *const pcmdata) { +- FIXP_PCM *states = pConcealmentInfo->TDNoiseStates; +- FIXP_PCM noiseVal; +- FIXP_DBL noiseValLong; +- FIXP_SGL *coef = pConcealmentInfo->TDNoiseCoef; +- FIXP_DBL TDNoiseAtt; +- ULONG seed = pConcealmentInfo->TDNoiseSeed = +- (ULONG)CConcealment_TDNoise_Random(&pConcealmentInfo->TDNoiseSeed) + 1; +- +- TDNoiseAtt = pConcealmentInfo->pConcealParams->comfortNoiseLevel; +- +- int ii; +- +- if ((pConcealmentInfo->concealState != ConcealState_Ok || +- pConcealmentInfo->concealState_old != ConcealState_Ok) && +- TDNoiseAtt != (FIXP_DBL)0) { +- for (ii = 0; ii < (len << 3); ii++) { +- /* create filtered noise */ +- states[2] = states[1]; +- states[1] = states[0]; +- states[0] = ((FIXP_PCM)CConcealment_TDNoise_Random(&seed)); +- noiseValLong = fMult(states[0], coef[0]) + fMult(states[1], coef[1]) + +- fMult(states[2], coef[2]); +- noiseVal = FX_DBL2FX_PCM(fMult(noiseValLong, TDNoiseAtt)); +- +- /* add filtered noise - check for clipping, before */ +- if (noiseVal > (FIXP_PCM)0 && +- pcmdata[ii] > (FIXP_PCM)MAXVAL_FIXP_PCM - noiseVal) { +- noiseVal = noiseVal * (FIXP_PCM)-1; +- } else if (noiseVal < (FIXP_PCM)0 && +- pcmdata[ii] < (FIXP_PCM)MINVAL_FIXP_PCM - noiseVal) { +- noiseVal = noiseVal * (FIXP_PCM)-1; +- } +- +- pcmdata[ii] += noiseVal; +- } +- } +-} +diff --git a/libAACdec/src/conceal.h b/libAACdec/src/conceal.h +deleted file mode 100644 +index e01a796..0000000 +--- a/libAACdec/src/conceal.h ++++ /dev/null +@@ -1,152 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Josef Hoepfl +- +- Description: independent channel concealment +- +-*******************************************************************************/ +- +-#ifndef CONCEAL_H +-#define CONCEAL_H +- +-#include "channelinfo.h" +- +-#define AACDEC_CONCEAL_PARAM_NOT_SPECIFIED (0xFFFE) +- +-void CConcealment_InitCommonData(CConcealParams *pConcealCommonData); +- +-void CConcealment_InitChannelData(CConcealmentInfo *hConcealmentInfo, +- CConcealParams *pConcealCommonData, +- AACDEC_RENDER_MODE initRenderMode, +- int samplesPerFrame); +- +-CConcealmentMethod CConcealment_GetMethod(CConcealParams *pConcealCommonData); +- +-UINT CConcealment_GetDelay(CConcealParams *pConcealCommonData); +- +-AAC_DECODER_ERROR +-CConcealment_SetParams(CConcealParams *concealParams, int method, +- int fadeOutSlope, int fadeInSlope, int muteRelease, +- FIXP_DBL comfNoiseLevel); +- +-CConcealmentState CConcealment_GetState(CConcealmentInfo *hConcealmentInfo); +- +-AAC_DECODER_ERROR +-CConcealment_SetAttenuation(CConcealParams *concealParams, +- const SHORT *fadeOutAttenuationVector, +- const SHORT *fadeInAttenuationVector); +- +-void CConcealment_Store( +- CConcealmentInfo *hConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo); +- +-int CConcealment_Apply( +- CConcealmentInfo *hConcealmentInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, +- const UCHAR lastLpdMode, const int FrameOk, const UINT flags); +- +-int CConcealment_GetLastFrameOk(CConcealmentInfo *hConcealmentInfo, +- const int fBeforeApply); +- +-INT CConcealment_TDFading( +- int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo, +- FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1); +- +-#endif /* #ifndef CONCEAL_H */ +diff --git a/libAACdec/src/conceal_types.h b/libAACdec/src/conceal_types.h +deleted file mode 100644 +index d90374e..0000000 +--- a/libAACdec/src/conceal_types.h ++++ /dev/null +@@ -1,203 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Christian Griebel +- +- Description: Error concealment structs and types +- +-*******************************************************************************/ +- +-#ifndef CONCEAL_TYPES_H +-#define CONCEAL_TYPES_H +- +-#include "machine_type.h" +-#include "common_fix.h" +- +-#include "rvlc_info.h" +- +-#include "usacdec_lpc.h" +- +-#define CONCEAL_MAX_NUM_FADE_FACTORS (32) +- +-#define FIXP_CNCL FIXP_DBL +-#define FL2FXCONST_CNCL FL2FXCONST_DBL +-#define FX_DBL2FX_CNCL +-#define FX_CNCL2FX_DBL +-#define CNCL_FRACT_BITS DFRACT_BITS +- +-/* Warning: Do not ever change these values. */ +-typedef enum { +- ConcealMethodNone = -1, +- ConcealMethodMute = 0, +- ConcealMethodNoise = 1, +- ConcealMethodInter = 2, +- ConcealMethodTonal = 3 +- +-} CConcealmentMethod; +- +-typedef enum { +- ConcealState_Ok, +- ConcealState_Single, +- ConcealState_FadeIn, +- ConcealState_Mute, +- ConcealState_FadeOut +- +-} CConcealmentState; +- +-typedef struct { +- FIXP_SGL fadeOutFactor[CONCEAL_MAX_NUM_FADE_FACTORS]; +- FIXP_SGL fadeInFactor[CONCEAL_MAX_NUM_FADE_FACTORS]; +- +- CConcealmentMethod method; +- +- int numFadeOutFrames; +- int numFadeInFrames; +- int numMuteReleaseFrames; +- FIXP_DBL comfortNoiseLevel; +- +-} CConcealParams; +- +-typedef enum { +- FADE_TIMEDOMAIN_TOSPECTRALMUTE = 1, +- FADE_TIMEDOMAIN_FROMSPECTRALMUTE, +- FADE_TIMEDOMAIN +-} TDfadingType; +- +-typedef struct { +- CConcealParams *pConcealParams; +- +- FIXP_CNCL spectralCoefficient[1024]; +- SHORT specScale[8]; +- +- INT iRandomPhase; +- INT prevFrameOk[2]; +- INT cntValidFrames; +- INT cntFadeFrames; /* State for signal fade-in/out */ +- /* States for signal fade-out of frames with more than one window/subframe - +- [0] used by Update CntFadeFrames mode of CConcealment_ApplyFadeOut, [1] used +- by FadeOut mode */ +- int winGrpOffset[2]; /* State for signal fade-out of frames with more than one +- window/subframe */ +- int attGrpOffset[2]; /* State for faster signal fade-out of frames with +- transient signal parts */ +- +- SCHAR lastRenderMode; +- +- UCHAR windowShape; +- BLOCK_TYPE windowSequence; +- UCHAR lastWinGrpLen; +- +- CConcealmentState concealState; +- CConcealmentState concealState_old; +- FIXP_DBL fade_old; /* last fading factor */ +- TDfadingType lastFadingType; /* last fading type */ +- +- SHORT aRvlcPreviousScaleFactor[RVLC_MAX_SFB]; /* needed once per channel */ +- UCHAR aRvlcPreviousCodebook[RVLC_MAX_SFB]; /* needed once per channel */ +- SCHAR rvlcPreviousScaleFactorOK; +- SCHAR rvlcPreviousBlockType; +- +- FIXP_LPC lsf4[M_LP_FILTER_ORDER]; +- FIXP_DBL last_tcx_gain; +- INT last_tcx_gain_e; +- ULONG TDNoiseSeed; +- FIXP_PCM TDNoiseStates[3]; +- FIXP_SGL TDNoiseCoef[3]; +- FIXP_SGL TDNoiseAtt; +- +-} CConcealmentInfo; +- +-#endif /* #ifndef CONCEAL_TYPES_H */ +diff --git a/libAACdec/src/rvlc.cpp b/libAACdec/src/rvlc.cpp +deleted file mode 100644 +index b7a9be1..0000000 +--- a/libAACdec/src/rvlc.cpp ++++ /dev/null +@@ -1,1217 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief RVLC Decoder +- \author Robert Weidner +-*/ +- +-#include "rvlc.h" +- +-#include "block.h" +- +-#include "aac_rom.h" +-#include "rvlcbit.h" +-#include "rvlcconceal.h" +-#include "aacdec_hcr.h" +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcInit +- +- description: init RVLC by data from channelinfo, which was decoded +-previously and set up pointers +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +- - pointer bitstream structure +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcInit(CErRvlcInfo *pRvlc, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- HANDLE_FDK_BITSTREAM bs) { +- /* RVLC common initialization part 2 of 2 */ +- SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; +- SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; +- SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; +- SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; +- int bnds; +- +- pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = 0; +- +- pRvlc->numDecodedEscapeWordsEsc = 0; +- pRvlc->numDecodedEscapeWordsFwd = 0; +- pRvlc->numDecodedEscapeWordsBwd = 0; +- +- pRvlc->intensity_used = 0; +- pRvlc->errorLogRvlc = 0; +- +- pRvlc->conceal_max = CONCEAL_MAX_INIT; +- pRvlc->conceal_min = CONCEAL_MIN_INIT; +- +- pRvlc->conceal_max_esc = CONCEAL_MAX_INIT; +- pRvlc->conceal_min_esc = CONCEAL_MIN_INIT; +- +- pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape; +- pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds; +- +- /* init scf arrays (for savety (in case of there are only zero codebooks)) */ +- for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) { +- pScfFwd[bnds] = 0; +- pScfBwd[bnds] = 0; +- pScfEsc[bnds] = 0; +- pScaleFactor[bnds] = 0; +- } +- +- /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2)) +- */ +- FDKsyncCache(bs); +- pRvlc->bsAnchor = (INT)FDKgetValidBits(bs); +- +- pRvlc->bitstreamIndexRvlFwd = +- 0; /* first bit within RVL coded block as start address for forward +- decoding */ +- pRvlc->bitstreamIndexRvlBwd = +- pRvlc->length_of_rvlc_sf - 1; /* last bit within RVL coded block as start +- address for backward decoding */ +- +- /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS +- * data (if present) */ +- FDKpushFor(bs, pRvlc->length_of_rvlc_sf); +- +- if (pRvlc->sf_escapes_present != 0) { +- /* locate internal bitstream ptr at escapes (which is the second part) */ +- FDKsyncCache(bs); +- pRvlc->bitstreamIndexEsc = pRvlc->bsAnchor - (INT)FDKgetValidBits(bs); +- +- /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present) to +- * make decoder continue */ +- /* decoding of RVLC should work despite this second pushFor during +- * initialization because */ +- /* bitstream initialization is valid for both ESC2 data parts (RVL-coded +- * values and ESC-coded values) */ +- FDKpushFor(bs, pRvlc->length_of_rvlc_escapes); +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcCheckIntensityCb +- +- description: Check if a intensity codebook is used in the current channel. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +------------------------------------------------------------------------------------------------ +- output: - intensity_used: 0 no intensity codebook is used +- 1 intensity codebook is used +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcCheckIntensityCb( +- CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { +- int group, band, bnds; +- +- pRvlc->intensity_used = 0; +- +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- if ((pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == +- INTENSITY_HCB) || +- (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == +- INTENSITY_HCB2)) { +- pRvlc->intensity_used = 1; +- break; +- } +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcDecodeEscapeWord +- +- description: Decode a huffman coded RVLC Escape-word. This value is part +-of a DPCM coded scalefactor. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +------------------------------------------------------------------------------------------------ +- return: - a single RVLC-Escape value which had to be applied to a +-DPCM value (which has a absolute value of 7) +--------------------------------------------------------------------------------------------- +-*/ +- +-static SCHAR rvlcDecodeEscapeWord(CErRvlcInfo *pRvlc, HANDLE_FDK_BITSTREAM bs) { +- int i; +- SCHAR value; +- UCHAR carryBit; +- UINT treeNode; +- UINT branchValue; +- UINT branchNode; +- +- INT *pBitstreamIndexEsc; +- const UINT *pEscTree; +- +- pEscTree = pRvlc->pHuffTreeRvlcEscape; +- pBitstreamIndexEsc = &(pRvlc->bitstreamIndexEsc); +- treeNode = *pEscTree; /* init at starting node */ +- +- for (i = MAX_LEN_RVLC_ESCAPE_WORD - 1; i >= 0; i--) { +- carryBit = +- rvlcReadBitFromBitstream(bs, /* get next bit */ +- pRvlc->bsAnchor, pBitstreamIndexEsc, FWD); +- +- CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in +- huffman decoding tree */ +- treeNode, &branchValue, &branchNode); +- +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is +- completely decoded */ +- value = (SCHAR)branchNode & CLR_BIT_10; +- pRvlc->length_of_rvlc_escapes -= (MAX_LEN_RVLC_ESCAPE_WORD - i); +- +- if (pRvlc->length_of_rvlc_escapes < 0) { +- pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; +- value = -1; +- } +- +- return value; +- } else { +- treeNode = *( +- pEscTree + +- branchValue); /* update treeNode for further step in decoding tree */ +- } +- } +- +- pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; +- +- return -1; /* should not be reached */ +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcDecodeEscapes +- +- description: Decodes all huffman coded RVLC Escape Words. +- Here a difference to the pseudo-code-implementation from +-standard can be found. A while loop (and not two nested for loops) is used for +-two reasons: +- +- 1. The plain huffman encoded escapes are decoded before the +-RVL-coded scalefactors. Therefore the escapes are present in the second step +- when decoding the RVL-coded-scalefactor values in forward +-and backward direction. +- +- When the RVL-coded scalefactors are decoded and there a +-escape is needed, then it is just taken out of the array in ascending order. +- +- 2. It's faster. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - handle to FDK bitstream +------------------------------------------------------------------------------------------------ +- return: - 0 ok the decoded escapes seem to be valid +- - 1 error there was a error detected during decoding escapes +- --> all escapes are invalid +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcDecodeEscapes(CErRvlcInfo *pRvlc, SHORT *pEsc, +- HANDLE_FDK_BITSTREAM bs) { +- SCHAR escWord; +- SCHAR escCnt = 0; +- SHORT *pEscBitCntSum; +- +- pEscBitCntSum = &(pRvlc->length_of_rvlc_escapes); +- +- /* Decode all RVLC-Escape words with a plain Huffman-Decoder */ +- while (*pEscBitCntSum > 0) { +- escWord = rvlcDecodeEscapeWord(pRvlc, bs); +- +- if (escWord >= 0) { +- pEsc[escCnt] = escWord; +- escCnt++; +- } else { +- pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; +- pRvlc->numDecodedEscapeWordsEsc = escCnt; +- +- return; +- } +- } /* all RVLC escapes decoded */ +- +- pRvlc->numDecodedEscapeWordsEsc = escCnt; +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: decodeRVLCodeword +- +- description: Decodes a RVL-coded dpcm-word (-part). +------------------------------------------------------------------------------------------------ +- input: - FDK bitstream handle +- - pointer rvlc structure +------------------------------------------------------------------------------------------------ +- return: - a dpcm value which is within range [0,1,..,14] in case of +-no errors. The offset of 7 must be subtracted to get a valid dpcm scalefactor +-value. In case of errors a forbidden codeword is detected --> returning -1 +--------------------------------------------------------------------------------------------- +-*/ +- +-SCHAR decodeRVLCodeword(HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) { +- int i; +- SCHAR value; +- UCHAR carryBit; +- UINT branchValue; +- UINT branchNode; +- +- const UINT *pRvlCodeTree = pRvlc->pHuffTreeRvlCodewds; +- UCHAR direction = pRvlc->direction; +- INT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL; +- UINT treeNode = *pRvlCodeTree; +- +- for (i = MAX_LEN_RVLC_CODE_WORD - 1; i >= 0; i--) { +- carryBit = +- rvlcReadBitFromBitstream(bs, /* get next bit */ +- pRvlc->bsAnchor, pBitstrIndxRvl, direction); +- +- CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in +- huffman decoding tree */ +- treeNode, &branchValue, &branchNode); +- +- if ((branchNode & TEST_BIT_10) == +- TEST_BIT_10) { /* test bit 10 ; if set --> a +- RVLC-codeword is completely decoded +- */ +- value = (SCHAR)(branchNode & CLR_BIT_10); +- *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i); +- +- /* check available bits for decoding */ +- if (*pRvlc->pRvlBitCnt_RVL < 0) { +- if (direction == FWD) { +- pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD; +- } else { +- pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD; +- } +- value = -1; /* signalize an error in return value, because too many bits +- was decoded */ +- } +- +- /* check max value of dpcm value */ +- if (value > MAX_ALLOWED_DPCM_INDEX) { +- if (direction == FWD) { +- pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD; +- } else { +- pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD; +- } +- value = -1; /* signalize an error in return value, because a forbidden +- cw was detected*/ +- } +- +- return value; /* return a dpcm value with offset +7 or an error status */ +- } else { +- treeNode = *( +- pRvlCodeTree + +- branchValue); /* update treeNode for further step in decoding tree */ +- } +- } +- +- return -1; +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcDecodeForward +- +- description: Decode RVL-coded codewords in forward direction. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +- - handle to FDK bitstream +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcDecodeForward(CErRvlcInfo *pRvlc, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- HANDLE_FDK_BITSTREAM bs) { +- int band = 0; +- int group = 0; +- int bnds = 0; +- +- SHORT dpcm; +- +- SHORT factor = +- pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; +- SHORT position = -SF_OFFSET; +- SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - +- SF_OFFSET - 90 - 256; +- +- SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; +- SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; +- UCHAR *pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd); +- +- pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_fwd); +- pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlFwd); +- +- *pEscFwdCnt = 0; +- pRvlc->direction = FWD; +- pRvlc->noise_used = 0; +- pRvlc->sf_used = 0; +- pRvlc->lastScf = 0; +- pRvlc->lastNrg = 0; +- pRvlc->lastIs = 0; +- +- rvlcCheckIntensityCb(pRvlc, pAacDecoderChannelInfo); +- +- /* main loop fwd long */ +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- pScfFwd[bnds] = 0; +- break; +- +- case INTENSITY_HCB2: +- case INTENSITY_HCB: +- /* store dpcm_is_position */ +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pRvlc->conceal_max = bnds; +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pRvlc->conceal_max = bnds; +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc++; +- } else { +- dpcm += *pScfEsc++; +- } +- (*pEscFwdCnt)++; +- if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { +- pRvlc->conceal_max_esc = bnds; +- } +- } +- } +- position += dpcm; +- pScfFwd[bnds] = position; +- pRvlc->lastIs = position; +- break; +- +- case NOISE_HCB: +- if (pRvlc->noise_used == 0) { +- pRvlc->noise_used = 1; +- pRvlc->first_noise_band = bnds; +- noisenrg += pRvlc->dpcm_noise_nrg; +- pScfFwd[bnds] = 100 + noisenrg; +- pRvlc->lastNrg = noisenrg; +- } else { +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pRvlc->conceal_max = bnds; +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pRvlc->conceal_max = bnds; +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc++; +- } else { +- dpcm += *pScfEsc++; +- } +- (*pEscFwdCnt)++; +- if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { +- pRvlc->conceal_max_esc = bnds; +- } +- } +- } +- noisenrg += dpcm; +- pScfFwd[bnds] = 100 + noisenrg; +- pRvlc->lastNrg = noisenrg; +- } +- pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1; +- break; +- +- default: +- pRvlc->sf_used = 1; +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pRvlc->conceal_max = bnds; +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pRvlc->conceal_max = bnds; +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc++; +- } else { +- dpcm += *pScfEsc++; +- } +- (*pEscFwdCnt)++; +- if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { +- pRvlc->conceal_max_esc = bnds; +- } +- } +- } +- factor += dpcm; +- pScfFwd[bnds] = factor; +- pRvlc->lastScf = factor; +- break; +- } +- } +- } +- +- /* postfetch fwd long */ +- if (pRvlc->intensity_used) { +- dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ +- if (dpcm < 0) { +- pRvlc->conceal_max = bnds; +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pRvlc->conceal_max = bnds; +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc++; +- } else { +- dpcm += *pScfEsc++; +- } +- (*pEscFwdCnt)++; +- if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { +- pRvlc->conceal_max_esc = bnds; +- } +- } +- } +- pRvlc->dpcm_is_last_position = dpcm; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcDecodeBackward +- +- description: Decode RVL-coded codewords in backward direction. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +- - handle FDK bitstream +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcDecodeBackward(CErRvlcInfo *pRvlc, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- HANDLE_FDK_BITSTREAM bs) { +- SHORT band, group, dpcm, offset; +- SHORT bnds = pRvlc->maxSfbTransmitted - 1; +- +- SHORT factor = pRvlc->rev_global_gain - SF_OFFSET; +- SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET; +- SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - +- SF_OFFSET - 90 - 256; +- +- SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; +- SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; +- UCHAR *pEscEscCnt = &(pRvlc->numDecodedEscapeWordsEsc); +- UCHAR *pEscBwdCnt = &(pRvlc->numDecodedEscapeWordsBwd); +- +- pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_bwd); +- pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlBwd); +- +- *pEscBwdCnt = 0; +- pRvlc->direction = BWD; +- pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */ +- pRvlc->firstScf = 0; +- pRvlc->firstNrg = 0; +- pRvlc->firstIs = 0; +- +- /* prefetch long BWD */ +- if (pRvlc->intensity_used) { +- dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ +- if (dpcm < 0) { +- pRvlc->dpcm_is_last_position = 0; +- pRvlc->conceal_min = bnds; +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pRvlc->conceal_min = bnds; +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc--; +- } else { +- dpcm += *pScfEsc--; +- } +- (*pEscBwdCnt)++; +- if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { +- pRvlc->conceal_min_esc = bnds; +- } +- } +- } +- pRvlc->dpcm_is_last_position = dpcm; +- } +- +- /* main loop long BWD */ +- for (group = pRvlc->numWindowGroups - 1; group >= 0; group--) { +- for (band = pRvlc->maxSfbTransmitted - 1; band >= 0; band--) { +- bnds = 16 * group + band; +- if ((band == 0) && (pRvlc->numWindowGroups != 1)) +- offset = 16 - pRvlc->maxSfbTransmitted + 1; +- else +- offset = 1; +- +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- pScfBwd[bnds] = 0; +- break; +- +- case INTENSITY_HCB2: +- case INTENSITY_HCB: +- /* store dpcm_is_position */ +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pScfBwd[bnds] = position; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pScfBwd[bnds] = position; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc--; +- } else { +- dpcm += *pScfEsc--; +- } +- (*pEscBwdCnt)++; +- if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { +- pRvlc->conceal_min_esc = fMax(0, bnds - offset); +- } +- } +- } +- pScfBwd[bnds] = position; +- position -= dpcm; +- pRvlc->firstIs = position; +- break; +- +- case NOISE_HCB: +- if (bnds == pRvlc->first_noise_band) { +- pScfBwd[bnds] = +- pRvlc->dpcm_noise_nrg + +- pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - +- SF_OFFSET - 90 - 256; +- pRvlc->firstNrg = pScfBwd[bnds]; +- } else { +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pScfBwd[bnds] = noisenrg; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pScfBwd[bnds] = noisenrg; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc--; +- } else { +- dpcm += *pScfEsc--; +- } +- (*pEscBwdCnt)++; +- if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { +- pRvlc->conceal_min_esc = fMax(0, bnds - offset); +- } +- } +- } +- pScfBwd[bnds] = noisenrg; +- noisenrg -= dpcm; +- pRvlc->firstNrg = noisenrg; +- } +- break; +- +- default: +- dpcm = decodeRVLCodeword(bs, pRvlc); +- if (dpcm < 0) { +- pScfBwd[bnds] = factor; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } +- dpcm -= TABLE_OFFSET; +- if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { +- if (pRvlc->length_of_rvlc_escapes) { +- pScfBwd[bnds] = factor; +- pRvlc->conceal_min = fMax(0, bnds - offset); +- return; +- } else { +- if (dpcm == MIN_RVL) { +- dpcm -= *pScfEsc--; +- } else { +- dpcm += *pScfEsc--; +- } +- (*pEscBwdCnt)++; +- if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { +- pRvlc->conceal_min_esc = fMax(0, bnds - offset); +- } +- } +- } +- pScfBwd[bnds] = factor; +- factor -= dpcm; +- pRvlc->firstScf = factor; +- break; +- } +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcFinalErrorDetection +- +- description: Call RVLC concealment if error was detected in decoding +-process +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void rvlcFinalErrorDetection( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- UCHAR ErrorStatusComplete = 0; +- UCHAR ErrorStatusLengthFwd = 0; +- UCHAR ErrorStatusLengthBwd = 0; +- UCHAR ErrorStatusLengthEscapes = 0; +- UCHAR ErrorStatusFirstScf = 0; +- UCHAR ErrorStatusLastScf = 0; +- UCHAR ErrorStatusFirstNrg = 0; +- UCHAR ErrorStatusLastNrg = 0; +- UCHAR ErrorStatusFirstIs = 0; +- UCHAR ErrorStatusLastIs = 0; +- UCHAR ErrorStatusForbiddenCwFwd = 0; +- UCHAR ErrorStatusForbiddenCwBwd = 0; +- UCHAR ErrorStatusNumEscapesFwd = 0; +- UCHAR ErrorStatusNumEscapesBwd = 0; +- UCHAR ConcealStatus = 1; +- UCHAR currentBlockType; /* short: 0, not short: 1*/ +- +- pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 1; +- +- /* invalid escape words, bit counter unequal zero, forbidden codeword detected +- */ +- if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD) +- ErrorStatusForbiddenCwFwd = 1; +- +- if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD) +- ErrorStatusForbiddenCwBwd = 1; +- +- /* bit counter forward unequal zero */ +- if (pRvlc->length_of_rvlc_sf_fwd) ErrorStatusLengthFwd = 1; +- +- /* bit counter backward unequal zero */ +- if (pRvlc->length_of_rvlc_sf_bwd) ErrorStatusLengthBwd = 1; +- +- /* bit counter escape sequences unequal zero */ +- if (pRvlc->sf_escapes_present) +- if (pRvlc->length_of_rvlc_escapes) ErrorStatusLengthEscapes = 1; +- +- if (pRvlc->sf_used) { +- /* first decoded scf does not match to global gain in backward direction */ +- if (pRvlc->firstScf != +- (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET)) +- ErrorStatusFirstScf = 1; +- +- /* last decoded scf does not match to rev global gain in forward direction +- */ +- if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET)) +- ErrorStatusLastScf = 1; +- } +- +- if (pRvlc->noise_used) { +- /* first decoded nrg does not match to dpcm_noise_nrg in backward direction +- */ +- if (pRvlc->firstNrg != +- (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain + +- pRvlc->dpcm_noise_nrg - SF_OFFSET - 90 - 256)) +- ErrorStatusFirstNrg = 1; +- +- /* last decoded nrg does not match to dpcm_noise_last_position in forward +- * direction */ +- if (pRvlc->lastNrg != +- (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - +- 90 - 256)) +- ErrorStatusLastNrg = 1; +- } +- +- if (pRvlc->intensity_used) { +- /* first decoded is position does not match in backward direction */ +- if (pRvlc->firstIs != (-SF_OFFSET)) ErrorStatusFirstIs = 1; +- +- /* last decoded is position does not match in forward direction */ +- if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET)) +- ErrorStatusLastIs = 1; +- } +- +- /* decoded escapes and used escapes in forward direction do not fit */ +- if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && +- (pRvlc->conceal_max == CONCEAL_MAX_INIT)) { +- ErrorStatusNumEscapesFwd = 1; +- } +- +- /* decoded escapes and used escapes in backward direction do not fit */ +- if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && +- (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { +- ErrorStatusNumEscapesBwd = 1; +- } +- +- if (ErrorStatusLengthEscapes || +- (((pRvlc->conceal_max == CONCEAL_MAX_INIT) && +- (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && +- (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs)) +- +- && +- +- ((pRvlc->conceal_min == CONCEAL_MIN_INIT) && +- (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && +- (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs))) || +- ((pRvlc->conceal_max == CONCEAL_MAX_INIT) && +- ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15)) || +- ((pRvlc->conceal_min == CONCEAL_MIN_INIT) && +- ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - +- pRvlc->firstScf) < -15))) { +- if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) || +- (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { +- pRvlc->conceal_max = 0; +- pRvlc->conceal_min = fMax( +- 0, (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1); +- } else { +- pRvlc->conceal_max = fMin(pRvlc->conceal_max, pRvlc->conceal_max_esc); +- pRvlc->conceal_min = fMax(pRvlc->conceal_min, pRvlc->conceal_min_esc); +- } +- } +- +- ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf || +- ErrorStatusLastNrg || ErrorStatusFirstNrg || +- ErrorStatusLastIs || ErrorStatusFirstIs || +- ErrorStatusForbiddenCwFwd || +- ErrorStatusForbiddenCwBwd || ErrorStatusLengthFwd || +- ErrorStatusLengthBwd || ErrorStatusLengthEscapes || +- ErrorStatusNumEscapesFwd || ErrorStatusNumEscapesBwd; +- +- currentBlockType = +- (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) ? 0 +- : 1; +- +- if (!ErrorStatusComplete) { +- int band; +- int group; +- int bnds; +- int lastSfbIndex; +- +- lastSfbIndex = (pRvlc->numWindowGroups > 1) ? 16 : 64; +- +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- } +- } +- +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] = +- pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]; +- } +- for (; band < lastSfbIndex; band++) { +- bnds = 16 * group + band; +- FDK_ASSERT(bnds >= 0 && bnds < RVLC_MAX_SFB); +- pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] = ZERO_HCB; +- } +- } +- } else { +- int band; +- int group; +- +- /* A single bit error was detected in decoding of dpcm values. It also could +- be an error with more bits in decoding of escapes and dpcm values whereby +- an illegal codeword followed not directly after the corrupted bits but +- just after decoding some more (wrong) scalefactors. Use the smaller +- scalefactor from forward decoding, backward decoding and previous frame. +- */ +- if (((pRvlc->conceal_min != CONCEAL_MIN_INIT) || +- (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && +- (pRvlc->conceal_min <= pRvlc->conceal_max) && +- (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == +- currentBlockType) && +- pAacDecoderStaticChannelInfo->concealmentInfo +- .rvlcPreviousScaleFactorOK && +- pRvlc->sf_concealment && ConcealStatus) { +- BidirectionalEstimation_UseScfOfPrevFrameAsReference( +- pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); +- ConcealStatus = 0; +- } +- +- /* A single bit error was detected in decoding of dpcm values. It also could +- be an error with more bits in decoding of escapes and dpcm values whereby +- an illegal codeword followed not directly after the corrupted bits but +- just after decoding some more (wrong) scalefactors. Use the smaller +- scalefactor from forward and backward decoding. */ +- if ((pRvlc->conceal_min <= pRvlc->conceal_max) && +- ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || +- (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && +- !(pAacDecoderStaticChannelInfo->concealmentInfo +- .rvlcPreviousScaleFactorOK && +- pRvlc->sf_concealment && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .rvlcPreviousBlockType == currentBlockType)) && +- ConcealStatus) { +- BidirectionalEstimation_UseLowerScfOfCurrentFrame(pAacDecoderChannelInfo); +- ConcealStatus = 0; +- } +- +- /* No errors were detected in decoding of escapes and dpcm values however +- the first and last value of a group (is,nrg,sf) is incorrect */ +- if ((pRvlc->conceal_min <= pRvlc->conceal_max) && +- ((ErrorStatusLastScf && ErrorStatusFirstScf) || +- (ErrorStatusLastNrg && ErrorStatusFirstNrg) || +- (ErrorStatusLastIs && ErrorStatusFirstIs)) && +- !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || +- ErrorStatusLengthEscapes) && +- ConcealStatus) { +- StatisticalEstimation(pAacDecoderChannelInfo); +- ConcealStatus = 0; +- } +- +- /* A error with more bits in decoding of escapes and dpcm values was +- detected. Use the smaller scalefactor from forward decoding, backward +- decoding and previous frame. */ +- if ((pRvlc->conceal_min <= pRvlc->conceal_max) && +- pAacDecoderStaticChannelInfo->concealmentInfo +- .rvlcPreviousScaleFactorOK && +- pRvlc->sf_concealment && +- (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == +- currentBlockType) && +- ConcealStatus) { +- PredictiveInterpolation(pAacDecoderChannelInfo, +- pAacDecoderStaticChannelInfo); +- ConcealStatus = 0; +- } +- +- /* Call frame concealment, because no better strategy was found. Setting the +- scalefactors to zero is done for debugging purposes */ +- if (ConcealStatus) { +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[16 * group + band] = 0; +- } +- } +- pAacDecoderChannelInfo->pDynData->specificTo.aac +- .rvlcCurrentScaleFactorOK = 0; +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: CRvlc_Read +- +- description: Read RVLC ESC1 data (side info) from bitstream. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +- - pointer bitstream structure +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-void CRvlc_Read(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- HANDLE_FDK_BITSTREAM bs) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- +- int group, band; +- +- /* RVLC long specific initialization Init part 1 of 2 */ +- pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); +- pRvlc->maxSfbTransmitted = +- GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); +- pRvlc->noise_used = 0; /* noise detection */ +- pRvlc->dpcm_noise_nrg = 0; /* only for debugging */ +- pRvlc->dpcm_noise_last_position = 0; /* only for debugging */ +- pRvlc->length_of_rvlc_escapes = +- -1; /* default value is used for error detection and concealment */ +- +- /* read only error sensitivity class 1 data (ESC 1 - data) */ +- pRvlc->sf_concealment = FDKreadBits(bs, 1); /* #1 */ +- pRvlc->rev_global_gain = FDKreadBits(bs, 8); /* #2 */ +- +- if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) { +- pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 11); /* #3 */ +- } else { +- pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 9); /* #3 */ +- } +- +- /* check if noise codebook is used */ +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- if (pAacDecoderChannelInfo->pDynData->aCodeBook[16 * group + band] == +- NOISE_HCB) { +- pRvlc->noise_used = 1; +- break; +- } +- } +- } +- +- if (pRvlc->noise_used) +- pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4 PNS */ +- +- pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5 */ +- +- if (pRvlc->sf_escapes_present) { +- pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6 */ +- } +- +- if (pRvlc->noise_used) { +- pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7 PNS */ +- pRvlc->length_of_rvlc_sf -= 9; +- } +- +- pRvlc->length_of_rvlc_sf_fwd = pRvlc->length_of_rvlc_sf; +- pRvlc->length_of_rvlc_sf_bwd = pRvlc->length_of_rvlc_sf; +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: CRvlc_Decode +- +- description: Decode rvlc data +- The function reads both the escape sequences and the +-scalefactors in forward and backward direction. If an error occured during +-decoding process which can not be concealed with the rvlc concealment frame +-concealment will be initiated. Then the element "rvlcCurrentScaleFactorOK" in +-the decoder channel info is set to 0 otherwise it is set to 1. +------------------------------------------------------------------------------------------------ +- input: - pointer rvlc structure +- - pointer channel info structure +- - pointer to persistent channel info structure +- - pointer bitstream structure +------------------------------------------------------------------------------------------------ +- return: ErrorStatus = AAC_DEC_OK +--------------------------------------------------------------------------------------------- +-*/ +- +-void CRvlc_Decode(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- HANDLE_FDK_BITSTREAM bs) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- INT bitCntOffst; +- INT saveBitCnt; +- +- rvlcInit(pRvlc, pAacDecoderChannelInfo, bs); +- +- /* save bitstream position */ +- saveBitCnt = (INT)FDKgetValidBits(bs); +- +- if (pRvlc->sf_escapes_present) +- rvlcDecodeEscapes( +- pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs); +- +- rvlcDecodeForward(pRvlc, pAacDecoderChannelInfo, bs); +- rvlcDecodeBackward(pRvlc, pAacDecoderChannelInfo, bs); +- rvlcFinalErrorDetection(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); +- +- pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = +- pRvlc->intensity_used; +- pAacDecoderChannelInfo->data.aac.PnsData.PnsActive = pRvlc->noise_used; +- +- /* restore bitstream position */ +- bitCntOffst = (INT)FDKgetValidBits(bs) - saveBitCnt; +- if (bitCntOffst) { +- FDKpushBiDirectional(bs, bitCntOffst); +- } +-} +- +-void CRvlc_ElementCheck( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo[], +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], +- const UINT flags, const INT elChannels) { +- int ch; +- +- /* Required for MPS residuals. */ +- if (pAacDecoderStaticChannelInfo == NULL) { +- return; +- } +- +- /* RVLC specific sanity checks */ +- if ((flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */ +- if (((pAacDecoderChannelInfo[0] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) || +- (pAacDecoderChannelInfo[1] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0)) && +- pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent) { +- pAacDecoderChannelInfo[0] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; +- pAacDecoderChannelInfo[1] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; +- } +- +- if ((pAacDecoderChannelInfo[0] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) && +- (pAacDecoderChannelInfo[1] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1) && +- (pAacDecoderChannelInfo[1] +- ->pDynData->specificTo.aac.rvlcIntensityUsed == 1)) { +- pAacDecoderChannelInfo[1] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; +- } +- } +- +- for (ch = 0; ch < elChannels; ch++) { +- pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType = +- (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == BLOCK_SHORT) +- ? 0 +- : 1; +- if (flags & AC_ER_RVLC) { +- pAacDecoderStaticChannelInfo[ch] +- ->concealmentInfo.rvlcPreviousScaleFactorOK = +- pAacDecoderChannelInfo[ch] +- ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK; +- } else { +- pAacDecoderStaticChannelInfo[ch] +- ->concealmentInfo.rvlcPreviousScaleFactorOK = 0; +- } +- } +-} +diff --git a/libAACdec/src/rvlc.h b/libAACdec/src/rvlc.h +deleted file mode 100644 +index 9c60d51..0000000 +--- a/libAACdec/src/rvlc.h ++++ /dev/null +@@ -1,153 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Defines structures and prototypes for RVLC +- \author Robert Weidner +-*/ +- +-#ifndef RVLC_H +-#define RVLC_H +- +-#include "aacdecoder.h" +-#include "channel.h" +-#include "rvlc_info.h" +- +-/* ------------------------------------------------------------------- */ +-/* errorLogRvlc: A word of 32 bits used for logging possible errors */ +-/* within RVLC in case of distorted bitstreams. */ +-/* ------------------------------------------------------------------- */ +-#define RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID \ +- 0x80000000 /* ESC-Dec During RVLC-Escape-decoding there have been more \ +- bits decoded as there are available */ +-#define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD \ +- 0x40000000 /* RVL-Dec negative sum-bitcounter during RVL-fwd-decoding \ +- (long+shrt) */ +-#define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD \ +- 0x20000000 /* RVL-Dec negative sum-bitcounter during RVL-fwd-decoding \ +- (long+shrt) */ +-#define RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD \ +- 0x08000000 /* RVL-Dec forbidden codeword detected fwd (long+shrt) */ +-#define RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD \ +- 0x04000000 /* RVL-Dec forbidden codeword detected bwd (long+shrt) */ +- +-void CRvlc_Read(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- HANDLE_FDK_BITSTREAM bs); +- +-void CRvlc_Decode(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- HANDLE_FDK_BITSTREAM bs); +- +-/** +- * \brief performe sanity checks to the channel data corresponding to one +- * channel element. +- * \param pAacDecoderChannelInfo +- * \param pAacDecoderStaticChannelInfo +- * \param elChannels amount of channels of the channel element. +- */ +-void CRvlc_ElementCheck( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo[], +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], +- const UINT flags, const INT elChannels); +- +-#endif /* RVLC_H */ +diff --git a/libAACdec/src/rvlc_info.h b/libAACdec/src/rvlc_info.h +deleted file mode 100644 +index e7b3b99..0000000 +--- a/libAACdec/src/rvlc_info.h ++++ /dev/null +@@ -1,204 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Defines structures for RVLC +- \author Robert Weidner +-*/ +-#ifndef RVLC_INFO_H +-#define RVLC_INFO_H +- +-#define FWD 0 /* bitstream decoding direction forward (RVL coded part) */ +-#define BWD 1 /* bitstream decoding direction backward (RVL coded part) */ +- +-#define MAX_RVL 7 /* positive RVLC escape */ +-#define MIN_RVL -7 /* negative RVLC escape */ +-#define MAX_ALLOWED_DPCM_INDEX \ +- 14 /* the maximum allowed index of a decoded dpcm value (offset \ +- 'TABLE_OFFSET' incl --> must be subtracted) */ +-#define TABLE_OFFSET \ +- 7 /* dpcm offset of valid output values of rvl table decoding, the rvl table \ +- ouly returns positive values, therefore the offset */ +-#define MAX_LEN_RVLC_CODE_WORD 9 /* max length of a RVL codeword in bits */ +-#define MAX_LEN_RVLC_ESCAPE_WORD \ +- 20 /* max length of huffman coded RVLC escape word in bits */ +- +-#define DPCM_NOISE_NRG_BITS 9 +-#define SF_OFFSET 100 /* offset for correcting scf value */ +- +-#define CONCEAL_MAX_INIT 1311 /* arbitrary value */ +-#define CONCEAL_MIN_INIT -1311 /* arbitrary value */ +- +-#define RVLC_MAX_SFB ((8) * (16)) +- +-/* sideinfo of RVLC */ +-typedef struct { +- /* ------- ESC 1 Data: --------- */ /* order of RVLC-bitstream components in +- bitstream (RVLC-initialization), every +- component appears only once in +- bitstream */ +- INT sf_concealment; /* 1 */ +- INT rev_global_gain; /* 2 */ +- SHORT length_of_rvlc_sf; /* 3 */ /* original value, gets modified +- (subtract 9) in case of noise +- (PNS); is kept for later use */ +- INT dpcm_noise_nrg; /* 4 optional */ +- INT sf_escapes_present; /* 5 */ +- SHORT length_of_rvlc_escapes; /* 6 optional */ +- INT dpcm_noise_last_position; /* 7 optional */ +- +- INT dpcm_is_last_position; +- +- SHORT length_of_rvlc_sf_fwd; /* length_of_rvlc_sf used for forward decoding */ +- SHORT +- length_of_rvlc_sf_bwd; /* length_of_rvlc_sf used for backward decoding */ +- +- /* for RVL-Codeword decoder to distinguish between fwd and bwd decoding */ +- SHORT *pRvlBitCnt_RVL; +- INT *pBitstrIndxRvl_RVL; +- +- UCHAR numWindowGroups; +- UCHAR maxSfbTransmitted; +- UCHAR first_noise_group; +- UCHAR first_noise_band; +- UCHAR direction; +- +- /* bitstream indices */ +- INT bsAnchor; /* hcr bit buffer reference index */ +- INT bitstreamIndexRvlFwd; /* base address of RVL-coded-scalefactor data (ESC +- 2) for forward decoding */ +- INT bitstreamIndexRvlBwd; /* base address of RVL-coded-scalefactor data (ESC +- 2) for backward decoding */ +- INT bitstreamIndexEsc; /* base address where RVLC-escapes start (ESC 2) */ +- +- /* decoding trees */ +- const UINT *pHuffTreeRvlCodewds; +- const UINT *pHuffTreeRvlcEscape; +- +- /* escape counters */ +- UCHAR numDecodedEscapeWordsFwd; /* when decoding RVL-codes forward */ +- UCHAR numDecodedEscapeWordsBwd; /* when decoding RVL-codes backward */ +- UCHAR numDecodedEscapeWordsEsc; /* when decoding the escape-Words */ +- +- SCHAR noise_used; +- SCHAR intensity_used; +- SCHAR sf_used; +- +- SHORT firstScf; +- SHORT lastScf; +- SHORT firstNrg; +- SHORT lastNrg; +- SHORT firstIs; +- SHORT lastIs; +- +- /* ------ RVLC error detection ------ */ +- UINT errorLogRvlc; /* store RVLC errors */ +- SHORT conceal_min; /* is set at backward decoding */ +- SHORT conceal_max; /* is set at forward decoding */ +- SHORT conceal_min_esc; /* is set at backward decoding */ +- SHORT conceal_max_esc; /* is set at forward decoding */ +-} CErRvlcInfo; +- +-typedef CErRvlcInfo RVLC_INFO; /* temp */ +- +-#endif /* RVLC_INFO_H */ +diff --git a/libAACdec/src/rvlcbit.cpp b/libAACdec/src/rvlcbit.cpp +deleted file mode 100644 +index b0c4596..0000000 +--- a/libAACdec/src/rvlcbit.cpp ++++ /dev/null +@@ -1,148 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief RVLC bitstream reading +- \author Robert Weidner +-*/ +- +-#include "rvlcbit.h" +- +-/*--------------------------------------------------------------------------------------------- +- function: rvlcReadBitFromBitstream +- +- description: This function returns a bit from the bitstream according to +-read direction. It is called very often, therefore it makes sense to inline it +-(runtime). +------------------------------------------------------------------------------------------------ +- input: - bitstream +- - pPosition +- - readDirection +------------------------------------------------------------------------------------------------ +- return: - bit from bitstream +--------------------------------------------------------------------------------------------- +-*/ +- +-UCHAR rvlcReadBitFromBitstream(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT *pPosition, UCHAR readDirection) { +- UINT bit; +- INT readBitOffset = (INT)FDKgetValidBits(bs) - bsAnchor + *pPosition; +- +- if (readBitOffset) { +- FDKpushBiDirectional(bs, readBitOffset); +- } +- +- if (readDirection == FWD) { +- bit = FDKreadBits(bs, 1); +- +- *pPosition += 1; +- } else { +- /* to be replaced with a brother function of FDKreadBits() */ +- bit = FDKreadBits(bs, 1); +- FDKpushBack(bs, 2); +- +- *pPosition -= 1; +- } +- +- return (bit); +-} +diff --git a/libAACdec/src/rvlcbit.h b/libAACdec/src/rvlcbit.h +deleted file mode 100644 +index 2578453..0000000 +--- a/libAACdec/src/rvlcbit.h ++++ /dev/null +@@ -1,111 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Robert Weidner (DSP Solutions) +- +- Description: RVLC Decoder: Bitstream reading +- +-*******************************************************************************/ +- +-#ifndef RVLCBIT_H +-#define RVLCBIT_H +- +-#include "rvlc.h" +- +-UCHAR rvlcReadBitFromBitstream(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, +- INT *pPosition, UCHAR readDirection); +- +-#endif /* RVLCBIT_H */ +diff --git a/libAACdec/src/rvlcconceal.cpp b/libAACdec/src/rvlcconceal.cpp +deleted file mode 100644 +index 77fda68..0000000 +--- a/libAACdec/src/rvlcconceal.cpp ++++ /dev/null +@@ -1,787 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief rvlc concealment +- \author Josef Hoepfl +-*/ +- +-#include "rvlcconceal.h" +- +-#include "block.h" +-#include "rvlc.h" +- +-/*--------------------------------------------------------------------------------------------- +- function: calcRefValFwd +- +- description: The function determines the scalefactor which is closed to the +-scalefactorband conceal_min. The same is done for intensity data and noise +-energies. +------------------------------------------------------------------------------------------------ +- output: - reference value scf +- - reference value internsity data +- - reference value noise energy +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void calcRefValFwd(CErRvlcInfo *pRvlc, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- int *refIsFwd, int *refNrgFwd, int *refScfFwd) { +- int band, bnds, group, startBand; +- int idIs, idNrg, idScf; +- int conceal_min, conceal_group_min; +- int MaximumScaleFactorBands; +- +- if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) +- MaximumScaleFactorBands = 16; +- else +- MaximumScaleFactorBands = 64; +- +- conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; +- conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; +- +- /* calculate first reference value for approach in forward direction */ +- idIs = idNrg = idScf = 1; +- +- /* set reference values */ +- *refIsFwd = -SF_OFFSET; +- *refNrgFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - +- SF_OFFSET - 90 - 256; +- *refScfFwd = +- pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; +- +- startBand = conceal_min - 1; +- for (group = conceal_group_min; group >= 0; group--) { +- for (band = startBand; band >= 0; band--) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- break; +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if (idIs) { +- *refIsFwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- idIs = 0; /* reference value has been set */ +- } +- break; +- case NOISE_HCB: +- if (idNrg) { +- *refNrgFwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- idNrg = 0; /* reference value has been set */ +- } +- break; +- default: +- if (idScf) { +- *refScfFwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- idScf = 0; /* reference value has been set */ +- } +- break; +- } +- } +- startBand = pRvlc->maxSfbTransmitted - 1; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: calcRefValBwd +- +- description: The function determines the scalefactor which is closed to the +-scalefactorband conceal_max. The same is done for intensity data and noise +-energies. +------------------------------------------------------------------------------------------------ +- output: - reference value scf +- - reference value internsity data +- - reference value noise energy +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-static void calcRefValBwd(CErRvlcInfo *pRvlc, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- int *refIsBwd, int *refNrgBwd, int *refScfBwd) { +- int band, bnds, group, startBand; +- int idIs, idNrg, idScf; +- int conceal_max, conceal_group_max; +- int MaximumScaleFactorBands; +- +- if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) +- MaximumScaleFactorBands = 16; +- else +- MaximumScaleFactorBands = 64; +- +- conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; +- conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; +- +- /* calculate first reference value for approach in backward direction */ +- idIs = idNrg = idScf = 1; +- +- /* set reference values */ +- *refIsBwd = pRvlc->dpcm_is_last_position - SF_OFFSET; +- *refNrgBwd = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - +- SF_OFFSET - 90 - 256 + pRvlc->dpcm_noise_nrg; +- *refScfBwd = pRvlc->rev_global_gain - SF_OFFSET; +- +- startBand = conceal_max + 1; +- +- /* if needed, re-set reference values */ +- for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) { +- for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- break; +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if (idIs) { +- *refIsBwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- idIs = 0; /* reference value has been set */ +- } +- break; +- case NOISE_HCB: +- if (idNrg) { +- *refNrgBwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- idNrg = 0; /* reference value has been set */ +- } +- break; +- default: +- if (idScf) { +- *refScfBwd = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- idScf = 0; /* reference value has been set */ +- } +- break; +- } +- } +- startBand = 0; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: BidirectionalEstimation_UseLowerScfOfCurrentFrame +- +- description: This approach by means of bidirectional estimation is generally +-performed when a single bit error has been detected, the bit error can be +-isolated between 'conceal_min' and 'conceal_max' and the 'sf_concealment' flag +-is not set. The sets of scalefactors decoded in forward and backward direction +-are compared with each other. The smaller scalefactor will be considered as the +-correct one respectively. The reconstruction of the scalefactors with this +-approach archieve good results in audio quality. The strategy must be applied to +-scalefactors, intensity data and noise energy seperately. +------------------------------------------------------------------------------------------------ +- output: Concealed scalefactor, noise energy and intensity data between +-conceal_min and conceal_max +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-void BidirectionalEstimation_UseLowerScfOfCurrentFrame( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- int band, bnds, startBand, endBand, group; +- int conceal_min, conceal_max; +- int conceal_group_min, conceal_group_max; +- int MaximumScaleFactorBands; +- +- if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) { +- MaximumScaleFactorBands = 16; +- } else { +- MaximumScaleFactorBands = 64; +- } +- +- /* If an error was detected just in forward or backward direction, set the +- corresponding border for concealment to a appropriate scalefactor band. The +- border is set to first or last sfb respectively, because the error will +- possibly not follow directly after the corrupt bit but just after decoding +- some more (wrong) scalefactors. */ +- if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0; +- +- if (pRvlc->conceal_max == CONCEAL_MAX_INIT) +- pRvlc->conceal_max = +- (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1; +- +- conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; +- conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; +- conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; +- conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; +- +- if (pRvlc->conceal_min == pRvlc->conceal_max) { +- int refIsFwd, refNrgFwd, refScfFwd; +- int refIsBwd, refNrgBwd, refScfBwd; +- +- bnds = pRvlc->conceal_min; +- calcRefValFwd(pRvlc, pAacDecoderChannelInfo, &refIsFwd, &refNrgFwd, +- &refScfFwd); +- calcRefValBwd(pRvlc, pAacDecoderChannelInfo, &refIsBwd, &refNrgBwd, +- &refScfBwd); +- +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- break; +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if (refIsFwd < refIsBwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsFwd; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsBwd; +- break; +- case NOISE_HCB: +- if (refNrgFwd < refNrgBwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgFwd; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgBwd; +- break; +- default: +- if (refScfFwd < refScfBwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfFwd; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfBwd; +- break; +- } +- } else { +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfFwd[pRvlc->conceal_max] = +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[pRvlc->conceal_max]; +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[pRvlc->conceal_min] = +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfFwd[pRvlc->conceal_min]; +- +- /* consider the smaller of the forward and backward decoded value as the +- * correct one */ +- startBand = conceal_min; +- if (conceal_group_min == conceal_group_max) +- endBand = conceal_max; +- else +- endBand = pRvlc->maxSfbTransmitted - 1; +- +- for (group = conceal_group_min; group <= conceal_group_max; group++) { +- for (band = startBand; band <= endBand; band++) { +- bnds = 16 * group + band; +- if (pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds] < +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- } +- startBand = 0; +- if ((group + 1) == conceal_group_max) endBand = conceal_max; +- } +- } +- +- /* now copy all data to the output buffer which needs not to be concealed */ +- if (conceal_group_min == 0) +- endBand = conceal_min; +- else +- endBand = pRvlc->maxSfbTransmitted; +- for (group = 0; group <= conceal_group_min; group++) { +- for (band = 0; band < endBand; band++) { +- bnds = 16 * group + band; +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- } +- if ((group + 1) == conceal_group_min) endBand = conceal_min; +- } +- +- startBand = conceal_max + 1; +- for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) { +- for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- } +- startBand = 0; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: BidirectionalEstimation_UseScfOfPrevFrameAsReference +- +- description: This approach by means of bidirectional estimation is generally +-performed when a single bit error has been detected, the bit error can be +-isolated between 'conceal_min' and 'conceal_max', the 'sf_concealment' flag is +-set and the previous frame has the same block type as the current frame. The +-scalefactor decoded in forward and backward direction and the scalefactor of the +-previous frame are compared with each other. The smaller scalefactor will be +-considered as the correct one. At this the codebook of the previous and current +-frame must be of the same set (scf, nrg, is) in each scalefactorband. Otherwise +-the scalefactor of the previous frame is not considered in the minimum +-calculation. The reconstruction of the scalefactors with this approach archieve +-good results in audio quality. The strategy must be applied to scalefactors, +-intensity data and noise energy seperately. +------------------------------------------------------------------------------------------------ +- output: Concealed scalefactor, noise energy and intensity data between +-conceal_min and conceal_max +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-void BidirectionalEstimation_UseScfOfPrevFrameAsReference( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- int band, bnds, startBand, endBand, group; +- int conceal_min, conceal_max; +- int conceal_group_min, conceal_group_max; +- int MaximumScaleFactorBands; +- SHORT commonMin; +- +- if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) { +- MaximumScaleFactorBands = 16; +- } else { +- MaximumScaleFactorBands = 64; +- } +- +- /* If an error was detected just in forward or backward direction, set the +- corresponding border for concealment to a appropriate scalefactor band. The +- border is set to first or last sfb respectively, because the error will +- possibly not follow directly after the corrupt bit but just after decoding +- some more (wrong) scalefactors. */ +- if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0; +- +- if (pRvlc->conceal_max == CONCEAL_MAX_INIT) +- pRvlc->conceal_max = +- (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1; +- +- conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; +- conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; +- conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; +- conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; +- +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfFwd[pRvlc->conceal_max] = +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[pRvlc->conceal_max]; +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[pRvlc->conceal_min] = +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfFwd[pRvlc->conceal_min]; +- +- /* consider the smaller of the forward and backward decoded value as the +- * correct one */ +- startBand = conceal_min; +- if (conceal_group_min == conceal_group_max) +- endBand = conceal_max; +- else +- endBand = pRvlc->maxSfbTransmitted - 1; +- +- for (group = conceal_group_min; group <= conceal_group_max; group++) { +- for (band = startBand; band <= endBand; band++) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; +- break; +- +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if ((pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB) || +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB2)) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- } +- break; +- +- case NOISE_HCB: +- if (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == NOISE_HCB) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- } +- break; +- +- default: +- if ((pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != ZERO_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != NOISE_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB2)) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- } +- break; +- } +- } +- startBand = 0; +- if ((group + 1) == conceal_group_max) endBand = conceal_max; +- } +- +- /* now copy all data to the output buffer which needs not to be concealed */ +- if (conceal_group_min == 0) +- endBand = conceal_min; +- else +- endBand = pRvlc->maxSfbTransmitted; +- for (group = 0; group <= conceal_group_min; group++) { +- for (band = 0; band < endBand; band++) { +- bnds = 16 * group + band; +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- } +- if ((group + 1) == conceal_group_min) endBand = conceal_min; +- } +- +- startBand = conceal_max + 1; +- for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) { +- for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- } +- startBand = 0; +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- function: StatisticalEstimation +- +- description: This approach by means of statistical estimation is generally +-performed when both the start value and the end value are different and no +-further errors have been detected. Considering the forward and backward decoded +-scalefactors, the set with the lower scalefactors in sum will be considered as +-the correct one. The scalefactors are differentially encoded. Normally it would +-reach to compare one pair of the forward and backward decoded scalefactors to +-specify the lower set. But having detected no further errors does not +-necessarily mean the absence of errors. Therefore all scalefactors decoded in +-forward and backward direction are summed up seperately. The set with the lower +-sum will be used. The strategy must be applied to scalefactors, intensity data +-and noise energy seperately. +------------------------------------------------------------------------------------------------ +- output: Concealed scalefactor, noise energy and intensity data +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-void StatisticalEstimation(CAacDecoderChannelInfo *pAacDecoderChannelInfo) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- int band, bnds, group; +- int sumIsFwd, sumIsBwd; /* sum of intensity data forward/backward */ +- int sumNrgFwd, sumNrgBwd; /* sum of noise energy data forward/backward */ +- int sumScfFwd, sumScfBwd; /* sum of scalefactor data forward/backward */ +- int useIsFwd, useNrgFwd, useScfFwd; /* the flags signals the elements which +- are used for the final result */ +- +- sumIsFwd = sumIsBwd = sumNrgFwd = sumNrgBwd = sumScfFwd = sumScfBwd = 0; +- useIsFwd = useNrgFwd = useScfFwd = 0; +- +- /* calculate sum of each group (scf,nrg,is) of forward and backward direction +- */ +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- break; +- +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- sumIsFwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- sumIsBwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- +- case NOISE_HCB: +- sumNrgFwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- sumNrgBwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- +- default: +- sumScfFwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- sumScfBwd += +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- } +- } +- } +- +- /* find for each group (scf,nrg,is) the correct direction */ +- if (sumIsFwd < sumIsBwd) useIsFwd = 1; +- +- if (sumNrgFwd < sumNrgBwd) useNrgFwd = 1; +- +- if (sumScfFwd < sumScfBwd) useScfFwd = 1; +- +- /* conceal each group (scf,nrg,is) */ +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- break; +- +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if (useIsFwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- +- case NOISE_HCB: +- if (useNrgFwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- +- default: +- if (useScfFwd) +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; +- else +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; +- break; +- } +- } +- } +-} +- +-/*--------------------------------------------------------------------------------------------- +- description: Approach by means of predictive interpolation +- This approach by means of predictive estimation is generally +-performed when the error cannot be isolated between 'conceal_min' and +-'conceal_max', the 'sf_concealment' flag is set and the previous frame has the +-same block type as the current frame. Check for each scalefactorband if the same +-type of data (scalefactor, internsity data, noise energies) is transmitted. If +-so use the scalefactor (intensity data, noise energy) in the current frame. +-Otherwise set the scalefactor (intensity data, noise energy) for this +-scalefactorband to zero. +------------------------------------------------------------------------------------------------ +- output: Concealed scalefactor, noise energy and intensity data +------------------------------------------------------------------------------------------------ +- return: - +--------------------------------------------------------------------------------------------- +-*/ +- +-void PredictiveInterpolation( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { +- CErRvlcInfo *pRvlc = +- &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +- int band, bnds, group; +- SHORT commonMin; +- +- for (group = 0; group < pRvlc->numWindowGroups; group++) { +- for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { +- bnds = 16 * group + band; +- switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { +- case ZERO_HCB: +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; +- break; +- +- case INTENSITY_HCB: +- case INTENSITY_HCB2: +- if ((pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB) || +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB2)) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; +- } +- break; +- +- case NOISE_HCB: +- if (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] == NOISE_HCB) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; +- } +- break; +- +- default: +- if ((pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != ZERO_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != NOISE_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB) && +- (pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB2)) { +- commonMin = fMin( +- pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], +- pAacDecoderChannelInfo->pComData->overlay.aac +- .aRvlcScfBwd[bnds]); +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = +- fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo +- .aRvlcPreviousScaleFactor[bnds]); +- } else { +- pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; +- } +- break; +- } +- } +- } +-} +diff --git a/libAACdec/src/rvlcconceal.h b/libAACdec/src/rvlcconceal.h +deleted file mode 100644 +index 8e2062e..0000000 +--- a/libAACdec/src/rvlcconceal.h ++++ /dev/null +@@ -1,127 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief rvlc concealment +- \author Josef Hoepfl +-*/ +- +-#ifndef RVLCCONCEAL_H +-#define RVLCCONCEAL_H +- +-#include "rvlc.h" +- +-void BidirectionalEstimation_UseLowerScfOfCurrentFrame( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo); +- +-void BidirectionalEstimation_UseScfOfPrevFrameAsReference( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo); +- +-void StatisticalEstimation(CAacDecoderChannelInfo *pAacDecoderChannelInfo); +- +-void PredictiveInterpolation( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo); +- +-#endif /* RVLCCONCEAL_H */ +diff --git a/libAACdec/src/usacdec_lpd.cpp b/libAACdec/src/usacdec_lpd.cpp +index 2110172..fcf7a76 100644 +--- a/libAACdec/src/usacdec_lpd.cpp ++++ b/libAACdec/src/usacdec_lpd.cpp +@@ -111,8 +111,6 @@ amm-info@iis.fraunhofer.de + #include "usacdec_acelp.h" + #include "overlapadd.h" + +-#include "conceal.h" +- + #include "block.h" + + #define SF_PITCH_TRACK 6 +@@ -1210,8 +1208,7 @@ AAC_DECODER_ERROR CLpdChannelStream_Read( + : &lg_table_ccfl[1][lg_table_offset]; + int last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost; + +- int last_frame_ok = CConcealment_GetLastFrameOk( +- &pAacDecoderStaticChannelInfo->concealmentInfo, 1); ++ int last_frame_ok = 1; + + INT i_offset; + UINT samplingRate; +@@ -1392,13 +1389,7 @@ AAC_DECODER_ERROR CLpdChannelStream_Read( + } + } + +- if (!CConcealment_GetLastFrameOk( +- &pAacDecoderStaticChannelInfo->concealmentInfo, 1)) { +- E_LPC_f_lsp_a_conversion( +- pAacDecoderChannelInfo->data.usac.lsp_coeff[0], +- pAacDecoderChannelInfo->data.usac.lp_coeff[0], +- &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]); +- } else if (pAacDecoderStaticChannelInfo->last_lpd_mode != 0) { ++ if (pAacDecoderStaticChannelInfo->last_lpd_mode != 0) { + if (pAacDecoderStaticChannelInfo->last_lpd_mode == 255) { + /* We need it for TCX decoding or ACELP excitation update */ + E_LPC_f_lsp_a_conversion( +@@ -1426,9 +1417,7 @@ AAC_DECODER_ERROR CLpdChannelStream_Read( + FD_SHORT; + pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255; + +- if ((pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) && +- CConcealment_GetLastFrameOk( +- &pAacDecoderStaticChannelInfo->concealmentInfo, 1)) { ++ if ((pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT)) { + /* USAC Conformance document: + short_fac_flag shall be encoded with a value of 1 if the + window_sequence of the previous frame was 2 (EIGHT_SHORT_SEQUENCE). +@@ -1604,8 +1593,7 @@ AAC_DECODER_ERROR CLpd_RenderTimeSignal( + return AAC_DEC_UNKNOWN; + } + +- last_frame_lost = !CConcealment_GetLastFrameOk( +- &pAacDecoderStaticChannelInfo->concealmentInfo, 0); ++ last_frame_lost = 0; + + /* Maintain LPD mode from previous frame */ + if ((pAacDecoderStaticChannelInfo->last_core_mode == FD_LONG) || +-- +cgit v1.1 + diff --git a/sound/fdk-aac/patches-free/030-remove-mp3-surround.patch b/sound/fdk-aac/patches-free/030-remove-mp3-surround.patch new file mode 100644 index 0000000000..643ef7f555 --- /dev/null +++ b/sound/fdk-aac/patches-free/030-remove-mp3-surround.patch @@ -0,0 +1,29035 @@ +From b13485d2c310d339e4f55359741ae6b0d6912bbd Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Tue, 25 Jun 2019 12:31:47 +0200 +Subject: Remove MPS surround sound encoder + +--- + Makefile.am | 37 - + Makefile.vc | 35 - + libAACdec/src/aacdecoder.cpp | 160 +-- + libAACdec/src/aacdecoder.h | 11 - + libAACdec/src/aacdecoder_lib.cpp | 206 +-- + libAACenc/src/aacenc_lib.cpp | 95 +- + libAACenc/src/mps_main.cpp | 529 -------- + libAACenc/src/mps_main.h | 270 ---- + libSACdec/include/sac_dec_errorcodes.h | 157 --- + libSACdec/include/sac_dec_lib.h | 477 ------- + libSACdec/src/sac_bitdec.cpp | 2167 ------------------------------ + libSACdec/src/sac_bitdec.h | 161 --- + libSACdec/src/sac_calcM1andM2.cpp | 848 ------------ + libSACdec/src/sac_calcM1andM2.h | 129 -- + libSACdec/src/sac_dec.cpp | 1509 --------------------- + libSACdec/src/sac_dec.h | 539 -------- + libSACdec/src/sac_dec_conceal.cpp | 392 ------ + libSACdec/src/sac_dec_conceal.h | 187 --- + libSACdec/src/sac_dec_interface.h | 335 ----- + libSACdec/src/sac_dec_lib.cpp | 1995 --------------------------- + libSACdec/src/sac_dec_ssc_struct.h | 283 ---- + libSACdec/src/sac_process.cpp | 1066 --------------- + libSACdec/src/sac_process.h | 297 ---- + libSACdec/src/sac_qmf.cpp | 156 --- + libSACdec/src/sac_qmf.h | 143 -- + libSACdec/src/sac_reshapeBBEnv.cpp | 680 ---------- + libSACdec/src/sac_reshapeBBEnv.h | 114 -- + libSACdec/src/sac_rom.cpp | 709 ---------- + libSACdec/src/sac_rom.h | 230 ---- + libSACdec/src/sac_smoothing.cpp | 295 ---- + libSACdec/src/sac_smoothing.h | 114 -- + libSACdec/src/sac_stp.cpp | 548 -------- + libSACdec/src/sac_stp.h | 115 -- + libSACdec/src/sac_tsd.cpp | 353 ----- + libSACdec/src/sac_tsd.h | 167 --- + libSACenc/include/sacenc_lib.h | 405 ------ + libSACenc/src/sacenc_bitstream.cpp | 826 ------------ + libSACenc/src/sacenc_bitstream.h | 296 ---- + libSACenc/src/sacenc_const.h | 126 -- + libSACenc/src/sacenc_delay.cpp | 472 ------- + libSACenc/src/sacenc_delay.h | 175 --- + libSACenc/src/sacenc_dmx_tdom_enh.cpp | 639 --------- + libSACenc/src/sacenc_dmx_tdom_enh.h | 134 -- + libSACenc/src/sacenc_filter.cpp | 207 --- + libSACenc/src/sacenc_filter.h | 133 -- + libSACenc/src/sacenc_framewindowing.cpp | 568 -------- + libSACenc/src/sacenc_framewindowing.h | 181 --- + libSACenc/src/sacenc_huff_tab.cpp | 997 -------------- + libSACenc/src/sacenc_huff_tab.h | 222 --- + libSACenc/src/sacenc_lib.cpp | 2042 ---------------------------- + libSACenc/src/sacenc_nlc_enc.cpp | 1442 -------------------- + libSACenc/src/sacenc_nlc_enc.h | 141 -- + libSACenc/src/sacenc_onsetdetect.cpp | 381 ------ + libSACenc/src/sacenc_onsetdetect.h | 154 --- + libSACenc/src/sacenc_paramextract.cpp | 725 ---------- + libSACenc/src/sacenc_paramextract.h | 214 --- + libSACenc/src/sacenc_staticgain.cpp | 446 ------ + libSACenc/src/sacenc_staticgain.h | 177 --- + libSACenc/src/sacenc_tree.cpp | 488 ------- + libSACenc/src/sacenc_tree.h | 168 --- + libSACenc/src/sacenc_vectorfunctions.cpp | 450 ------- + libSACenc/src/sacenc_vectorfunctions.h | 488 ------- + 62 files changed, 9 insertions(+), 28197 deletions(-) + delete mode 100644 libAACenc/src/mps_main.cpp + delete mode 100644 libAACenc/src/mps_main.h + delete mode 100644 libSACdec/include/sac_dec_errorcodes.h + delete mode 100644 libSACdec/include/sac_dec_lib.h + delete mode 100644 libSACdec/src/sac_bitdec.cpp + delete mode 100644 libSACdec/src/sac_bitdec.h + delete mode 100644 libSACdec/src/sac_calcM1andM2.cpp + delete mode 100644 libSACdec/src/sac_calcM1andM2.h + delete mode 100644 libSACdec/src/sac_dec.cpp + delete mode 100644 libSACdec/src/sac_dec.h + delete mode 100644 libSACdec/src/sac_dec_conceal.cpp + delete mode 100644 libSACdec/src/sac_dec_conceal.h + delete mode 100644 libSACdec/src/sac_dec_interface.h + delete mode 100644 libSACdec/src/sac_dec_lib.cpp + delete mode 100644 libSACdec/src/sac_dec_ssc_struct.h + delete mode 100644 libSACdec/src/sac_process.cpp + delete mode 100644 libSACdec/src/sac_process.h + delete mode 100644 libSACdec/src/sac_qmf.cpp + delete mode 100644 libSACdec/src/sac_qmf.h + delete mode 100644 libSACdec/src/sac_reshapeBBEnv.cpp + delete mode 100644 libSACdec/src/sac_reshapeBBEnv.h + delete mode 100644 libSACdec/src/sac_rom.cpp + delete mode 100644 libSACdec/src/sac_rom.h + delete mode 100644 libSACdec/src/sac_smoothing.cpp + delete mode 100644 libSACdec/src/sac_smoothing.h + delete mode 100644 libSACdec/src/sac_stp.cpp + delete mode 100644 libSACdec/src/sac_stp.h + delete mode 100644 libSACdec/src/sac_tsd.cpp + delete mode 100644 libSACdec/src/sac_tsd.h + delete mode 100644 libSACenc/include/sacenc_lib.h + delete mode 100644 libSACenc/src/sacenc_bitstream.cpp + delete mode 100644 libSACenc/src/sacenc_bitstream.h + delete mode 100644 libSACenc/src/sacenc_const.h + delete mode 100644 libSACenc/src/sacenc_delay.cpp + delete mode 100644 libSACenc/src/sacenc_delay.h + delete mode 100644 libSACenc/src/sacenc_dmx_tdom_enh.cpp + delete mode 100644 libSACenc/src/sacenc_dmx_tdom_enh.h + delete mode 100644 libSACenc/src/sacenc_filter.cpp + delete mode 100644 libSACenc/src/sacenc_filter.h + delete mode 100644 libSACenc/src/sacenc_framewindowing.cpp + delete mode 100644 libSACenc/src/sacenc_framewindowing.h + delete mode 100644 libSACenc/src/sacenc_huff_tab.cpp + delete mode 100644 libSACenc/src/sacenc_huff_tab.h + delete mode 100644 libSACenc/src/sacenc_lib.cpp + delete mode 100644 libSACenc/src/sacenc_nlc_enc.cpp + delete mode 100644 libSACenc/src/sacenc_nlc_enc.h + delete mode 100644 libSACenc/src/sacenc_onsetdetect.cpp + delete mode 100644 libSACenc/src/sacenc_onsetdetect.h + delete mode 100644 libSACenc/src/sacenc_paramextract.cpp + delete mode 100644 libSACenc/src/sacenc_paramextract.h + delete mode 100644 libSACenc/src/sacenc_staticgain.cpp + delete mode 100644 libSACenc/src/sacenc_staticgain.h + delete mode 100644 libSACenc/src/sacenc_tree.cpp + delete mode 100644 libSACenc/src/sacenc_tree.h + delete mode 100644 libSACenc/src/sacenc_vectorfunctions.cpp + delete mode 100644 libSACenc/src/sacenc_vectorfunctions.h + +diff --git a/Makefile.am b/Makefile.am +index 16b21e1..1550d95 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -6,8 +6,6 @@ AM_CPPFLAGS = \ + -I$(top_srcdir)/libAACenc/include \ + -I$(top_srcdir)/libArithCoding/include \ + -I$(top_srcdir)/libDRCdec/include \ +- -I$(top_srcdir)/libSACdec/include \ +- -I$(top_srcdir)/libSACenc/include \ + -I$(top_srcdir)/libMpegTPDec/include \ + -I$(top_srcdir)/libMpegTPEnc/include \ + -I$(top_srcdir)/libSYS/include \ +@@ -89,7 +87,6 @@ AACENC_SRC = \ + libAACenc/src/line_pe.cpp \ + libAACenc/src/metadata_compressor.cpp \ + libAACenc/src/metadata_main.cpp \ +- libAACenc/src/mps_main.cpp \ + libAACenc/src/ms_stereo.cpp \ + libAACenc/src/noisedet.cpp \ + libAACenc/src/pnsparam.cpp \ +@@ -159,35 +156,6 @@ PCMUTILS_SRC = \ + libPCMutils/src/pcm_utils.cpp \ + libPCMutils/src/pcmdmx_lib.cpp + +-SACDEC_SRC = \ +- libSACdec/src/sac_bitdec.cpp \ +- libSACdec/src/sac_calcM1andM2.cpp \ +- libSACdec/src/sac_dec.cpp \ +- libSACdec/src/sac_dec_conceal.cpp \ +- libSACdec/src/sac_dec_lib.cpp \ +- libSACdec/src/sac_process.cpp \ +- libSACdec/src/sac_qmf.cpp \ +- libSACdec/src/sac_reshapeBBEnv.cpp \ +- libSACdec/src/sac_rom.cpp \ +- libSACdec/src/sac_smoothing.cpp \ +- libSACdec/src/sac_stp.cpp \ +- libSACdec/src/sac_tsd.cpp +- +-SACENC_SRC = \ +- libSACenc/src/sacenc_bitstream.cpp \ +- libSACenc/src/sacenc_delay.cpp \ +- libSACenc/src/sacenc_dmx_tdom_enh.cpp \ +- libSACenc/src/sacenc_filter.cpp \ +- libSACenc/src/sacenc_framewindowing.cpp \ +- libSACenc/src/sacenc_huff_tab.cpp \ +- libSACenc/src/sacenc_lib.cpp \ +- libSACenc/src/sacenc_nlc_enc.cpp \ +- libSACenc/src/sacenc_onsetdetect.cpp \ +- libSACenc/src/sacenc_paramextract.cpp \ +- libSACenc/src/sacenc_staticgain.cpp \ +- libSACenc/src/sacenc_tree.cpp \ +- libSACenc/src/sacenc_vectorfunctions.cpp +- + SYS_SRC = \ + libSYS/src/genericStds.cpp \ + libSYS/src/syslib_channelMapDescr.cpp +@@ -197,7 +165,6 @@ libfdk_aac_la_SOURCES = \ + $(ARITHCODING_SRC) \ + $(DRCDEC_SRC) \ + $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ +- $(SACDEC_SRC) $(SACENC_SRC) \ + $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) + + EXTRA_DIST = \ +@@ -217,10 +184,6 @@ EXTRA_DIST = \ + $(top_srcdir)/libArithCoding/include/*.h \ + $(top_srcdir)/libDRCdec/include/*.h \ + $(top_srcdir)/libDRCdec/src/*.h \ +- $(top_srcdir)/libSACdec/include/*.h \ +- $(top_srcdir)/libSACdec/src/*.h \ +- $(top_srcdir)/libSACenc/include/*.h \ +- $(top_srcdir)/libSACenc/src/*.h \ + $(top_srcdir)/libSYS/include/*.h \ + $(top_srcdir)/libPCMutils/include/*.h \ + $(top_srcdir)/libPCMutils/src/*.h \ +diff --git a/Makefile.vc b/Makefile.vc +index 97a0615..54f3744 100644 +--- a/Makefile.vc ++++ b/Makefile.vc +@@ -21,8 +21,6 @@ AM_CPPFLAGS = \ + -IlibAACenc/include \ + -IlibArithCoding/include \ + -IlibDRCdec/include \ +- -IlibSACdec/include \ +- -IlibSACenc/include \ + -IlibMpegTPDec/include \ + -IlibMpegTPEnc/include \ + -IlibSYS/include \ +@@ -73,7 +71,6 @@ AACENC_SRC = \ + libAACenc/src/line_pe.cpp \ + libAACenc/src/metadata_compressor.cpp \ + libAACenc/src/metadata_main.cpp \ +- libAACenc/src/mps_main.cpp \ + libAACenc/src/ms_stereo.cpp \ + libAACenc/src/noisedet.cpp \ + libAACenc/src/pnsparam.cpp \ +@@ -143,35 +140,6 @@ PCMUTILS_SRC = \ + libPCMutils/src/pcm_utils.cpp \ + libPCMutils/src/pcmdmx_lib.cpp + +-SACDEC_SRC = \ +- libSACdec/src/sac_bitdec.cpp \ +- libSACdec/src/sac_calcM1andM2.cpp \ +- libSACdec/src/sac_dec.cpp \ +- libSACdec/src/sac_dec_conceal.cpp \ +- libSACdec/src/sac_dec_lib.cpp \ +- libSACdec/src/sac_process.cpp \ +- libSACdec/src/sac_qmf.cpp \ +- libSACdec/src/sac_reshapeBBEnv.cpp \ +- libSACdec/src/sac_rom.cpp \ +- libSACdec/src/sac_smoothing.cpp \ +- libSACdec/src/sac_stp.cpp \ +- libSACdec/src/sac_tsd.cpp +- +-SACENC_SRC = \ +- libSACenc/src/sacenc_bitstream.cpp \ +- libSACenc/src/sacenc_delay.cpp \ +- libSACenc/src/sacenc_dmx_tdom_enh.cpp \ +- libSACenc/src/sacenc_filter.cpp \ +- libSACenc/src/sacenc_framewindowing.cpp \ +- libSACenc/src/sacenc_huff_tab.cpp \ +- libSACenc/src/sacenc_lib.cpp \ +- libSACenc/src/sacenc_nlc_enc.cpp \ +- libSACenc/src/sacenc_onsetdetect.cpp \ +- libSACenc/src/sacenc_paramextract.cpp \ +- libSACenc/src/sacenc_staticgain.cpp \ +- libSACenc/src/sacenc_tree.cpp \ +- libSACenc/src/sacenc_vectorfunctions.cpp +- + SYS_SRC = \ + libSYS/src/genericStds.cpp \ + libSYS/src/syslib_channelMapDescr.cpp +@@ -181,7 +149,6 @@ libfdk_aac_SOURCES = \ + $(ARITHCODING_SRC) \ + $(DRCDEC_SRC) \ + $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ +- $(SACDEC_SRC) $(SACENC_SRC) \ + $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) + + +@@ -227,8 +194,6 @@ clean: + del /f libMpegTPDec\src\*.obj 2>NUL + del /f libMpegTPEnc\src\*.obj 2>NUL + del /f libPCMutils\src\*.obj 2>NUL +- del /f libSACdec\src\*.obj 2>NUL +- del /f libSACenc\src\*.obj 2>NUL + del /f libSYS\src\*.obj 2>NUL + + install: $(INST_DIRS) +diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp +index 6c03567..cc3e245 100644 +--- a/libAACdec/src/aacdecoder.cpp ++++ b/libAACdec/src/aacdecoder.cpp +@@ -161,8 +161,6 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_pns.h" + +-#include "sac_dec_lib.h" +- + #include "usacdec_lpd.h" + + #include "ac_arith_coder.h" +@@ -201,47 +199,6 @@ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) { + } + } + +- if (self->mpsEnableCurr) { +- if (IS_LOWDELAY(self->streamInfo.aot) && +- (self->qmfModeCurr == MODE_LP)) { /* Overrule user requested QMF mode */ +- self->qmfModeCurr = MODE_HQ; +- } +- /* Set and check if MPS decoder allows the current mode */ +- switch (mpegSurroundDecoder_SetParam( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +- SACDEC_PARTIALLY_COMPLEX, self->qmfModeCurr == MODE_LP)) { +- case MPS_OK: +- break; +- case MPS_INVALID_PARAMETER: { /* Only one mode supported. Find out which +- one: */ +- LIB_INFO libInfo[FDK_MODULE_LAST]; +- UINT mpsCaps; +- +- FDKinitLibInfo(libInfo); +- mpegSurroundDecoder_GetLibInfo(libInfo); +- mpsCaps = FDKlibInfo_getCapabilities(libInfo, FDK_MPSDEC); +- +- if (((mpsCaps & CAPF_MPS_LP) && (self->qmfModeCurr == MODE_LP)) || +- ((mpsCaps & CAPF_MPS_HQ) && +- (self->qmfModeCurr == +- MODE_HQ))) { /* MPS decoder does support the requested mode. */ +- break; +- } +- } +- FDK_FALLTHROUGH; +- default: +- if (self->qmfModeUser == NOT_DEFINED) { +- /* Revert in case mpegSurroundDecoder_SetParam() fails. */ +- self->qmfModeCurr = +- (self->qmfModeCurr == MODE_LP) ? MODE_HQ : MODE_LP; +- } else { +- /* in case specific mode was requested we disable MPS and playout the +- * downmix */ +- self->mpsEnableCurr = 0; +- } +- } +- } +- + self->psPossible = + ((CAN_DO_PS(self->streamInfo.aot) && + !PS_IS_EXPLICITLY_DISABLED(self->streamInfo.aot, self->flags[0]) && +@@ -876,45 +833,6 @@ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse( + goto bail; + } + +- /* Handle SBR dual rate case */ +- if (self->streamInfo.extSamplingRate != 0) { +- mpsSampleRate = self->streamInfo.extSamplingRate; +- mpsFrameSize = self->streamInfo.aacSamplesPerFrame * +- (self->streamInfo.extSamplingRate / +- self->streamInfo.aacSampleRate); +- } else { +- mpsSampleRate = self->streamInfo.aacSampleRate; +- mpsFrameSize = self->streamInfo.aacSamplesPerFrame; +- } +- /* Setting of internal MPS state; may be reset in +- CAacDecoder_SyncQmfMode if decoder is unable to decode with user +- defined qmfMode */ +- if (!(self->flags[0] & (AC_USAC | AC_RSVD50 | AC_ELD))) { +- self->mpsEnableCurr = self->mpsEnableUser; +- } +- if (self->mpsEnableCurr) { +- if (!self->qmfDomain.globalConf.qmfDomainExplicitConfig) { +- /* if not done yet, allocate full MPEG Surround decoder instance */ +- if (mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder) == +- SAC_INSTANCE_NOT_FULL_AVAILABLE) { +- if (mpegSurroundDecoder_Open( +- (CMpegSurroundDecoder **)&self->pMpegSurroundDecoder, -1, +- &self->qmfDomain)) { +- return AAC_DEC_OUT_OF_MEMORY; +- } +- } +- } +- err = mpegSurroundDecoder_Parse( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, hBs, count, +- self->streamInfo.aot, mpsSampleRate, mpsFrameSize, +- self->flags[0] & AC_INDEP); +- if (err == MPS_OK) { +- self->flags[0] |= AC_MPS_PRESENT; +- } else { +- error = AAC_DEC_PARSE_ERROR; +- } +- } + /* Skip any trailing bytes */ + FDKpushFor(hBs, *count); + *count = 0; +@@ -1080,15 +998,8 @@ static AAC_DECODER_ERROR aacDecoder_ParseExplicitMpsAndSbr( + if ((bitCnt > 0) && (self->flags[0] & (AC_USAC | AC_RSVD50))) { + if ((self->flags[0] & AC_MPS_PRESENT) || + (self->elFlags[element_index] & AC_EL_USAC_MPS212)) { +- int err; +- +- err = mpegSurroundDecoder_ParseNoHeader( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, bs, &bitCnt, +- self->flags[0] & AC_INDEP); +- if (err != MPS_OK) { +- self->frameOK = 0; +- ErrorStatus = AAC_DEC_PARSE_ERROR; +- } ++ self->frameOK = 0; ++ ErrorStatus = AAC_DEC_PARSE_ERROR; + } + } + +@@ -1581,58 +1492,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + asc->m_sc.m_usacConfig.m_usacNumElements; + } + +- self->mpsEnableCurr = 0; +- for (int _el = 0; +- _el < (int)self->pUsacConfig[streamIndex]->m_usacNumElements; +- _el++) { +- int el = _el + elementOffset; +- if (self->elements[el] != +- self->pUsacConfig[streamIndex]->element[_el].usacElementType) { +- ascChanged = 1; +- } +- if (self->usacStereoConfigIndex[el] != +- asc->m_sc.m_usacConfig.element[_el].m_stereoConfigIndex) { +- ascChanged = 1; +- } +- if (configMode & AC_CM_ALLOC_MEM) { +- self->elements[el] = +- self->pUsacConfig[streamIndex]->element[_el].usacElementType; +- /* for Unified Stereo Coding */ +- self->usacStereoConfigIndex[el] = +- asc->m_sc.m_usacConfig.element[_el].m_stereoConfigIndex; +- if (self->elements[el] == ID_USAC_CPE) { +- self->mpsEnableCurr |= self->usacStereoConfigIndex[el] ? 1 : 0; +- } +- } +- +- self->elFlags[el] |= +- (asc->m_sc.m_usacConfig.element[_el].m_noiseFilling) +- ? AC_EL_USAC_NOISE +- : 0; +- self->elFlags[el] |= +- (asc->m_sc.m_usacConfig.element[_el].m_stereoConfigIndex > 0) +- ? AC_EL_USAC_MPS212 +- : 0; +- self->elFlags[el] |= (asc->m_sc.m_usacConfig.element[_el].m_interTes) +- ? AC_EL_USAC_ITES +- : 0; +- self->elFlags[el] |= +- (asc->m_sc.m_usacConfig.element[_el].m_pvc) ? AC_EL_USAC_PVC : 0; +- self->elFlags[el] |= +- (asc->m_sc.m_usacConfig.element[_el].usacElementType == ID_USAC_LFE) +- ? AC_EL_USAC_LFE +- : 0; +- self->elFlags[el] |= +- (asc->m_sc.m_usacConfig.element[_el].usacElementType == ID_USAC_LFE) +- ? AC_EL_LFE +- : 0; +- if ((asc->m_sc.m_usacConfig.element[_el].usacElementType == +- ID_USAC_CPE) && +- ((self->usacStereoConfigIndex[el] == 0))) { +- self->elFlags[el] |= AC_EL_USAC_CP_POSSIBLE; +- } +- } +- + self->hasAudioPreRoll = 0; + if (self->pUsacConfig[streamIndex]->m_usacNumElements) { + self->hasAudioPreRoll = asc->m_sc.m_usacConfig.element[0] +@@ -1764,7 +1623,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + self->flags[streamIndex] |= (asc->m_hcrFlag) ? AC_ER_HCR : 0; + + if (asc->m_aot == AOT_ER_AAC_ELD) { +- self->mpsEnableCurr = 0; + self->flags[streamIndex] |= AC_ELD; + self->flags[streamIndex] |= + (asc->m_sbrPresentFlag) +@@ -1776,9 +1634,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + self->flags[streamIndex] |= + (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_MPS_PRESENT + : 0; +- if (self->mpsApplicable) { +- self->mpsEnableCurr = asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign; +- } ++ + } + self->flags[streamIndex] |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0; + self->flags[streamIndex] |= (asc->m_epConfig >= 0) ? AC_ER : 0; +@@ -1867,14 +1723,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + case AOT_USAC: + break; + case AOT_ER_AAC_ELD: +- if (self->mpsEnableCurr && +- asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) { +- SAC_INPUT_CONFIG sac_interface = SAC_INTERFACE_TIME; +- mpegSurroundDecoder_ConfigureQmfDomain( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, sac_interface, +- (UINT)self->streamInfo.aacSampleRate, asc->m_aot); +- self->qmfDomain.globalConf.qmfDomainExplicitConfig = 1; +- } + break; + default: + self->qmfDomain.globalConf.qmfDomainExplicitConfig = +@@ -3128,8 +2976,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + + if (self->flags[streamIndex] & AC_USAC) { + int bsPseudoLr = 0; +- mpegSurroundDecoder_IsPseudoLR( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, &bsPseudoLr); + /* ISO/IEC 23003-3, 7.11.2.6 Modification of core decoder output (pseudo + * LR) */ + if ((aacChannels == 2) && bsPseudoLr) { +diff --git a/libAACdec/src/aacdecoder.h b/libAACdec/src/aacdecoder.h +index 3750389..a57b0bb 100644 +--- a/libAACdec/src/aacdecoder.h ++++ b/libAACdec/src/aacdecoder.h +@@ -276,17 +276,6 @@ This structure is allocated once for each CPE. */ + HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure */ + INT metadataExpiry; /*!< Metadata expiry time in milli-seconds. */ + +- void *pMpegSurroundDecoder; /*!< pointer to mpeg surround decoder structure */ +- UCHAR mpsEnableUser; /*!< MPS enable user flag */ +- UCHAR mpsEnableCurr; /*!< MPS enable decoder state */ +- UCHAR mpsApplicable; /*!< MPS applicable */ +- SCHAR mpsOutputMode; /*!< setting: normal = 0, binaural = 1, stereo = 2, 5.1ch +- = 3 */ +- INT mpsOutChannelsLast; /*!< The amount of channels returned by the last +- successful MPS decoder call. */ +- INT mpsFrameSizeLast; /*!< The frame length returned by the last successful +- MPS decoder call. */ +- + CAncData ancData; /*!< structure to handle ancillary data */ + + HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */ +diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp +index 1fc6ea0..e49d502 100644 +--- a/libAACdec/src/aacdecoder_lib.cpp ++++ b/libAACdec/src/aacdecoder_lib.cpp +@@ -109,8 +109,6 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_drc.h" + +-#include "sac_dec_lib.h" +- + #include "pcm_utils.h" + + /* Decoder library info */ +@@ -306,14 +304,6 @@ static INT aacDecoder_FreeMemCallback(void *handle, + errTp = TRANSPORTDEC_UNKOWN_ERROR; + } + +- /* free pSpatialDec and mpsData */ +- if (self->pMpegSurroundDecoder != NULL) { +- if (mpegSurroundDecoder_FreeMem( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder) != MPS_OK) { +- errTp = TRANSPORTDEC_UNKOWN_ERROR; +- } +- } +- + /* free persistent qmf domain buffer, QmfWorkBufferCore3, QmfWorkBufferCore4, + * QmfWorkBufferCore5 and configuration variables */ + FDK_QmfDomain_FreeMem(&self->qmfDomain); +@@ -344,44 +334,9 @@ static INT aacDecoder_SscCallback(void *handle, HANDLE_FDK_BITSTREAM hBs, + const INT coreSbrFrameLengthIndex, + const INT configBytes, const UCHAR configMode, + UCHAR *configChanged) { +- SACDEC_ERROR err; + TRANSPORTDEC_ERROR errTp; + HANDLE_AACDECODER hAacDecoder = (HANDLE_AACDECODER)handle; +- +- err = mpegSurroundDecoder_Config( +- (CMpegSurroundDecoder *)hAacDecoder->pMpegSurroundDecoder, hBs, coreCodec, +- samplingRate, frameSize, stereoConfigIndex, coreSbrFrameLengthIndex, +- configBytes, configMode, configChanged); +- +- switch (err) { +- case MPS_UNSUPPORTED_CONFIG: +- /* MPS found but invalid or not decodable by this instance */ +- /* We switch off MPS and keep going */ +- hAacDecoder->mpsEnableCurr = 0; +- hAacDecoder->mpsApplicable = 0; +- errTp = TRANSPORTDEC_OK; +- break; +- case MPS_PARSE_ERROR: +- /* MPS found but invalid or not decodable by this instance */ +- hAacDecoder->mpsEnableCurr = 0; +- hAacDecoder->mpsApplicable = 0; +- if ((coreCodec == AOT_USAC) || (coreCodec == AOT_DRM_USAC) || +- IS_LOWDELAY(coreCodec)) { +- errTp = TRANSPORTDEC_PARSE_ERROR; +- } else { +- errTp = TRANSPORTDEC_OK; +- } +- break; +- case MPS_OK: +- hAacDecoder->mpsApplicable = 1; +- errTp = TRANSPORTDEC_OK; +- break; +- default: +- /* especially Parsing error is critical for transport layer */ +- hAacDecoder->mpsApplicable = 0; +- errTp = TRANSPORTDEC_UNKOWN_ERROR; +- } +- ++ errTp = TRANSPORTDEC_UNKOWN_ERROR; + return (INT)errTp; + } + +@@ -451,8 +406,6 @@ static int isSupportedMpsConfig(AUDIO_OBJECT_TYPE aot, + + FDKinitLibInfo(libInfo); + +- mpegSurroundDecoder_GetLibInfo(libInfo); +- + mpsCaps = FDKlibInfo_getCapabilities(libInfo, FDK_MPSDEC); + + if (!(mpsCaps & CAPF_MPS_LD) && IS_LOWDELAY(aot)) { +@@ -869,19 +822,6 @@ LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, + FDKmemclear(&aacDec->qmfDomain, sizeof(FDK_QMF_DOMAIN)); + aacDec->qmfModeUser = NOT_DEFINED; + +- if (mpegSurroundDecoder_Open( +- (CMpegSurroundDecoder **)&aacDec->pMpegSurroundDecoder, +- stereoConfigIndex, &aacDec->qmfDomain)) { +- err = -1; +- goto bail; +- } +- /* Set MPEG Surround defaults */ +- aacDec->mpsEnableUser = 0; +- aacDec->mpsEnableCurr = 0; +- aacDec->mpsApplicable = 0; +- aacDec->mpsOutputMode = (SCHAR)SACDEC_OUT_MODE_NORMAL; +- transportDec_RegisterSscCallback(pIn, aacDecoder_SscCallback, (void *)aacDec); +- + { + if (FDK_drcDec_Open(&(aacDec->hUniDrcDecoder), DRC_DEC_ALL) != 0) { + err = -1; +@@ -952,12 +892,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill(HANDLE_AACDECODER self, + + static void aacDecoder_SignalInterruption(HANDLE_AACDECODER self) { + CAacDecoder_SignalInterruption(self); +- +- if (self->mpsEnableUser) { +- mpegSurroundDecoder_SetParam( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +- SACDEC_BS_INTERRUPTION, 1); +- } + } + + static void aacDecoder_UpdateBitStreamCounters(CStreamInfo *pSi, +@@ -1157,9 +1091,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + Tell other modules to clear states if required. */ + if (flags & AACDEC_CLRHIST) { + if (!(self->flags[0] & AC_USAC)) { +- mpegSurroundDecoder_SetParam( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +- SACDEC_CLEAR_HISTORY, 1); + if (FDK_QmfDomain_ClearPersistentMemory(&self->qmfDomain) != 0) { + ErrorStatus = AAC_DEC_UNKNOWN; + goto bail; +@@ -1247,48 +1178,8 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + self->streamInfo.frameSize, 0); + } + +- /* Setting of internal MPS state; may be reset in CAacDecoder_SyncQmfMode +- if decoder is unable to decode with user defined qmfMode */ +- if (!(self->flags[0] & (AC_USAC | AC_RSVD50 | AC_RSV603DA | AC_ELD))) { +- self->mpsEnableCurr = +- (self->mpsEnableUser && +- isSupportedMpsConfig(self->streamInfo.aot, +- self->streamInfo.numChannels, +- (self->flags[0] & AC_MPS_PRESENT) ? 1 : 0)); +- } +- +- if (!self->qmfDomain.globalConf.qmfDomainExplicitConfig && +- self->mpsEnableCurr) { +- /* if not done yet, allocate full MPEG Surround decoder instance */ +- if (mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder) == +- SAC_INSTANCE_NOT_FULL_AVAILABLE) { +- if (mpegSurroundDecoder_Open( +- (CMpegSurroundDecoder **)&self->pMpegSurroundDecoder, -1, +- &self->qmfDomain)) { +- return AAC_DEC_OUT_OF_MEMORY; +- } +- } +- } +- + CAacDecoder_SyncQmfMode(self); + +- if (!self->qmfDomain.globalConf.qmfDomainExplicitConfig && +- self->mpsEnableCurr) { +- SAC_INPUT_CONFIG sac_interface = SAC_INTERFACE_TIME; +- /* needs to be done before first SBR apply. */ +- mpegSurroundDecoder_ConfigureQmfDomain( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, sac_interface, +- (UINT)self->streamInfo.aacSampleRate, self->streamInfo.aot); +- if (self->qmfDomain.globalConf.nBandsAnalysis_requested > 0) { +- self->qmfDomain.globalConf.nQmfTimeSlots_requested = +- self->streamInfo.aacSamplesPerFrame / +- self->qmfDomain.globalConf.nBandsAnalysis_requested; +- } else { +- self->qmfDomain.globalConf.nQmfTimeSlots_requested = 0; +- } +- } +- + self->qmfDomain.globalConf.TDinput = pTimeData; + + switch (FDK_QmfDomain_Configure(&self->qmfDomain)) { +@@ -1308,61 +1199,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + decoder too */ + } + +- if (self->mpsEnableCurr) { +- int err, sac_interface, nChannels, frameSize; +- +- nChannels = self->streamInfo.numChannels; +- frameSize = self->streamInfo.frameSize; +- sac_interface = SAC_INTERFACE_TIME; +- +- if (self->streamInfo.aot == AOT_USAC) { +- if (self->flags[0] & AC_USAC_SCFGI3) { +- sac_interface = SAC_INTERFACE_TIME; +- } +- } +- err = mpegSurroundDecoder_SetParam( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +- SACDEC_INTERFACE, sac_interface); +- +- if (err == 0) { +- err = mpegSurroundDecoder_Apply( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, +- (INT_PCM *)self->workBufferCore2, pTimeData, timeDataSize, +- self->streamInfo.aacSamplesPerFrame, &nChannels, &frameSize, +- self->streamInfo.sampleRate, self->streamInfo.aot, +- self->channelType, self->channelIndices, &self->mapDescr); +- } +- +- if (err == MPS_OUTPUT_BUFFER_TOO_SMALL) { +- ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; +- goto bail; +- } +- if (err == 0) { +- /* Update output parameter */ +- self->streamInfo.numChannels = nChannels; +- self->streamInfo.frameSize = frameSize; +- self->streamInfo.outputDelay += mpegSurroundDecoder_GetDelay( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder); +- /* Save current parameter for possible concealment of next frame */ +- self->mpsOutChannelsLast = nChannels; +- self->mpsFrameSizeLast = frameSize; +- } else if ((self->mpsOutChannelsLast > 0) && +- (self->mpsFrameSizeLast > 0)) { +- /* Restore parameters of last frame ... */ +- self->streamInfo.numChannels = self->mpsOutChannelsLast; +- self->streamInfo.frameSize = self->mpsFrameSizeLast; +- /* ... and clear output buffer so that potentially corrupted data does +- * not reach the framework. */ +- FDKmemclear(pTimeData, self->mpsOutChannelsLast * +- self->mpsFrameSizeLast * sizeof(INT_PCM)); +- /* Additionally proclaim that this frame had errors during decoding. +- */ +- ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; +- } else { +- ErrorStatus = AAC_DEC_UNKNOWN; /* no output */ +- } +- } +- + /* Use dedicated memory for PCM postprocessing */ + pTimeDataPcmPost = self->pTimeData2; + timeDataPcmPostSize = self->timeData2Size; +@@ -1395,11 +1231,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + reverseOutChannelMap[ch] = ch; + } + +- /* If SBR and/or MPS is active, the DRC gains are aligned to the QMF +- domain signal before the QMF synthesis. Therefore the DRC gains +- need to be delayed by the QMF synthesis delay. */ +- if (self->mpsEnableCurr) drcDelay = 257; +- + for (ch = 0; ch < self->streamInfo.numChannels; ch++) { + UCHAR mapValue = FDK_chMapDescr_getMapValue( + &self->mapDescr, (UCHAR)ch, self->chMapIndex); +@@ -1411,27 +1242,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + if (mapValue < (8)) reverseOutChannelMap[mapValue] = ch; + } + +- /* The output of SBR and MPS is interleaved. Deinterleaving may be +- * necessary for FDK_drcDec_ProcessTime, which accepts deinterleaved +- * audio only. */ +- if ((self->streamInfo.numChannels > 1) && +- (0 || (self->mpsEnableCurr))) { +- /* interleaving/deinterleaving is performed on upper part of +- * pTimeDataPcmPost. Check if this buffer is large enough. */ +- if (timeDataPcmPostSize < +- (INT)(2 * self->streamInfo.numChannels * +- self->streamInfo.frameSize * sizeof(PCM_DEC))) { +- ErrorStatus = AAC_DEC_UNKNOWN; +- goto bail; +- } +- needsDeinterleaving = 1; +- drcWorkBuffer = +- (FIXP_DBL *)pTimeDataPcmPost + +- self->streamInfo.numChannels * self->streamInfo.frameSize; +- FDK_deinterleave( +- pTimeDataPcmPost, drcWorkBuffer, self->streamInfo.numChannels, +- self->streamInfo.frameSize, self->streamInfo.frameSize); +- } else { ++ { + drcWorkBuffer = (FIXP_DBL *)pTimeDataPcmPost; + } + +@@ -1488,7 +1299,6 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + } + + INT interleaved = 0; +- interleaved |= (self->mpsEnableCurr) ? 1 : 0; + + /* do PCM post processing */ + dmxErr = pcmDmx_ApplyFrame( +@@ -1525,8 +1335,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + pcmLimiter_SetSampleRate(self->hLimiter, self->streamInfo.sampleRate); + pcmLimiterScale += PCM_OUT_HEADROOM; + +- if ((self->streamInfo.numChannels == 1) || +- (self->mpsEnableCurr)) { ++ if ((self->streamInfo.numChannels == 1)) { + pInterleaveBuffer = (PCM_LIM *)pTimeDataPcmPost; + } else { + pInterleaveBuffer = (PCM_LIM *)pTimeData; +@@ -1549,8 +1358,7 @@ aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, + /* If numChannels = 1 we do not need interleaving. The same applies if + SBR or MPS are used, since their output is interleaved already + (resampled or not) */ +- if ((self->streamInfo.numChannels == 1) || +- (self->mpsEnableCurr)) { ++ if ((self->streamInfo.numChannels == 1)) { + scaleValuesSaturate( + pTimeData, pTimeDataPcmPost, + self->streamInfo.frameSize * self->streamInfo.numChannels, +@@ -1688,11 +1496,6 @@ LINKSPEC_CPP void aacDecoder_Close(HANDLE_AACDECODER self) { + + FDK_drcDec_Close(&self->hUniDrcDecoder); + +- if (self->pMpegSurroundDecoder != NULL) { +- mpegSurroundDecoder_Close( +- (CMpegSurroundDecoder *)self->pMpegSurroundDecoder); +- } +- + if (self->hInput != NULL) { + transportDec_Close(&self->hInput); + } +@@ -1711,7 +1514,6 @@ LINKSPEC_CPP INT aacDecoder_GetLibInfo(LIB_INFO *info) { + return -1; + } + +- mpegSurroundDecoder_GetLibInfo(info); + transportDec_GetLibInfo(info); + FDK_toolsGetLibInfo(info); + pcmDmx_GetLibInfo(info); +diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp +index 51f3f49..7382106 100644 +--- a/libAACenc/src/aacenc_lib.cpp ++++ b/libAACenc/src/aacenc_lib.cpp +@@ -130,8 +130,6 @@ amm-info@iis.fraunhofer.de + #include "tpenc_lib.h" + + #include "metadata_main.h" +-#include "mps_main.h" +-#include "sacenc_lib.h" + + #define SBL(fl) \ + (fl / \ +@@ -223,8 +221,6 @@ struct AACENCODER { + Necessary for delay compensation. Metadata mode is a + separate parameter. */ + +- HANDLE_MPS_ENCODER hMpsEnc; +- + /* Transport */ + HANDLE_TRANSPORTENC hTpEnc; + +@@ -541,14 +537,6 @@ static INT aacEncoder_LimitBitrate(const HANDLE_TRANSPORTENC hTpEnc, + nChannels, cm.nChannelsEff, bitRate, -1, + NULL, AACENC_BR_MODE_INVALID, nSubFrames); + +- /* Limit bit rate in respect to available MPS modes if active */ +- if ((aot == AOT_ER_AAC_ELD) && (syntaxFlags & AC_LD_MPS) && +- (channelMode == MODE_1)) { +- bitRate = FDK_MpegsEnc_GetClosestBitRate( +- aot, MODE_212, samplingRate, 0, +- bitRate); +- } +- + return bitRate; + } + +@@ -863,17 +851,6 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, + return err; + } + +-INT aacenc_SscCallback(void *self, HANDLE_FDK_BITSTREAM hBs, +- const AUDIO_OBJECT_TYPE coreCodec, +- const INT samplingRate, const INT frameSize, +- const INT stereoConfigIndex, +- const INT coreSbrFrameLengthIndex, const INT configBytes, +- const UCHAR configMode, UCHAR *configChanged) { +- HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; +- +- return (FDK_MpegsEnc_WriteSpatialSpecificConfig(hAacEncoder->hMpsEnc, hBs)); +-} +- + static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + USER_PARAM *config) { + AACENC_ERROR err = AACENC_OK; +@@ -918,23 +895,6 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + hAacConfig->ancDataBitRate = 0; + } + +- if ((hAacEncoder->hMpsEnc != NULL) && (hAacConfig->syntaxFlags & AC_LD_MPS)) { +- int coreCoderDelay = DELAY_AACELD(hAacConfig->framelength); +- +- if (MPS_ENCODER_OK != +- FDK_MpegsEnc_Init(hAacEncoder->hMpsEnc, hAacConfig->audioObjectType, +- config->userSamplerate, hAacConfig->bitRate, +- 0, +- frameLength, /* for dual rate sbr this value is +- already multiplied by 2 */ +- hAacEncoder->inputBufferSizePerChannel, +- coreCoderDelay)) { +- return AACENC_INIT_MPS_ERROR; +- } +- } +- hAacEncoder->nDelay = +- fMax(FDK_MpegsEnc_GetDelay(hAacEncoder->hMpsEnc), hAacEncoder->nDelay); +- + /* + * Initialize Transport - Module. + */ +@@ -994,13 +954,7 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, + hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc); + } + +- /* Get custom delay, i.e. the codec delay w/o the decoder's SBR- or MPS delay +- */ +- if ((hAacEncoder->hMpsEnc != NULL) && (hAacConfig->syntaxFlags & AC_LD_MPS)) { +- hAacEncoder->nDelayCore = +- hAacEncoder->nDelay - +- fMax(0, FDK_MpegsEnc_GetDecDelay(hAacEncoder->hMpsEnc)); +- } else { ++ { + hAacEncoder->nDelayCore = hAacEncoder->nDelay; + } + +@@ -1120,14 +1074,6 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + } + } /* (encoder_modis&ENC_MODE_FLAG_META) */ + +- /* Open MPEG Surround Encoder */ +- if (hAacEncoder->encoder_modis & ENC_MODE_FLAG_SAC) { +- if (MPS_ENCODER_OK != FDK_MpegsEnc_Open(&hAacEncoder->hMpsEnc)) { +- err = AACENC_MEMORY_ERROR; +- goto bail; +- } +- } /* (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SAC) */ +- + /* Open Transport Encoder */ + if (transportEnc_Open(&hAacEncoder->hTpEnc) != 0) { + err = AACENC_MEMORY_ERROR; +@@ -1146,11 +1092,6 @@ AACENC_ERROR aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, + + C_ALLOC_SCRATCH_END(_pLibInfo, LIB_INFO, FDK_MODULE_LAST) + } +- if (transportEnc_RegisterSscCallback(hAacEncoder->hTpEnc, aacenc_SscCallback, +- hAacEncoder) != 0) { +- err = AACENC_INIT_TP_ERROR; +- goto bail; +- } + + /* Initialize encoder instance with default parameters. */ + aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam); +@@ -1202,9 +1143,6 @@ AACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder) { + if (hAacEncoder->hMetadataEnc) { + FDK_MetadataEnc_Close(&hAacEncoder->hMetadataEnc); + } +- if (hAacEncoder->hMpsEnc) { +- FDK_MpegsEnc_Close(&hAacEncoder->hMpsEnc); +- } + + Free_AacEncoder(phAacEncoder); + } +@@ -1399,30 +1337,6 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder, + } + } + +- /* +- * Encode MPS data. +- */ +- if ((hAacEncoder->hMpsEnc != NULL) && +- (hAacEncoder->aacConfig.syntaxFlags & AC_LD_MPS)) { +- AACENC_EXT_PAYLOAD mpsExtensionPayload; +- FDKmemclear(&mpsExtensionPayload, sizeof(AACENC_EXT_PAYLOAD)); +- +- if (MPS_ENCODER_OK != +- FDK_MpegsEnc_Process( +- hAacEncoder->hMpsEnc, +- hAacEncoder->inputBuffer + hAacEncoder->inputBufferOffset / +- hAacEncoder->coderConfig.noChannels, +- hAacEncoder->nSamplesRead, &mpsExtensionPayload)) { +- err = AACENC_ENCODE_ERROR; +- goto bail; +- } +- +- if ((mpsExtensionPayload.pData != NULL) && +- ((mpsExtensionPayload.dataSize != 0))) { +- hAacEncoder->extPayload[nExtensions++] = mpsExtensionPayload; +- } +- } +- + if ((inargs->numAncBytes > 0) && + (getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA) != -1)) { + INT idx = getBufDescIdx(inBufDesc, IN_ANCILLRY_DATA); +@@ -1528,7 +1442,6 @@ AACENC_ERROR aacEncGetLibInfo(LIB_INFO *info) { + + FDK_toolsGetLibInfo(info); + transportEnc_GetLibInfo(info); +- FDK_MpegsEnc_GetLibInfo(info); + + /* search for next free tab */ + for (i = 0; i < FDK_MODULE_LAST; i++) { +@@ -1645,11 +1558,7 @@ AACENC_ERROR aacEncoder_SetParam(const HANDLE_AACENCODER hAacEncoder, + break; + case AACENC_CHANNELMODE: + if (settings->userChannelMode != (CHANNEL_MODE)value) { +- if (((CHANNEL_MODE)value == MODE_212) && +- (NULL != hAacEncoder->hMpsEnc)) { +- settings->userChannelMode = (CHANNEL_MODE)value; +- settings->nChannels = 2; +- } else { ++ { + const CHANNEL_MODE_CONFIG_TAB *pConfig = + FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value); + if (pConfig == NULL) { +diff --git a/libAACenc/src/mps_main.cpp b/libAACenc/src/mps_main.cpp +deleted file mode 100644 +index 1048228..0000000 +--- a/libAACenc/src/mps_main.cpp ++++ /dev/null +@@ -1,529 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC encoder library ****************************** +- +- Author(s): Markus Lohwasser +- +- Description: Mpeg Surround library interface functions +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "mps_main.h" +-#include "sacenc_lib.h" +- +-/* Data Types ****************************************************************/ +-struct MPS_ENCODER { +- HANDLE_MP4SPACE_ENCODER hSacEncoder; +- +- AUDIO_OBJECT_TYPE audioObjectType; +- +- FDK_bufDescr inBufDesc; +- FDK_bufDescr outBufDesc; +- SACENC_InArgs inargs; +- SACENC_OutArgs outargs; +- +- void *pInBuffer[1]; +- UINT pInBufferSize[1]; +- UINT pInBufferElSize[1]; +- UINT pInBufferType[1]; +- +- void *pOutBuffer[2]; +- UINT pOutBufferSize[2]; +- UINT pOutBufferElSize[2]; +- UINT pOutBufferType[2]; +- +- UCHAR sacOutBuffer[1024]; /* Worst case memory consumption for ELDv2: 768 +- bytes => 6144 bits (Core + SBR + MPS) */ +-}; +- +-struct MPS_CONFIG_TAB { +- AUDIO_OBJECT_TYPE audio_object_type; +- CHANNEL_MODE channel_mode; +- ULONG sbr_ratio; +- ULONG sampling_rate; +- ULONG bitrate_min; +- ULONG bitrate_max; +-}; +- +-/* Constants *****************************************************************/ +-static const MPS_CONFIG_TAB mpsConfigTab[] = { +- {AOT_ER_AAC_ELD, MODE_212, 0, 16000, 16000, 39999}, +- {AOT_ER_AAC_ELD, MODE_212, 0, 22050, 16000, 49999}, +- {AOT_ER_AAC_ELD, MODE_212, 0, 24000, 16000, 61999}, +- {AOT_ER_AAC_ELD, MODE_212, 0, 32000, 20000, 84999}, +- {AOT_ER_AAC_ELD, MODE_212, 0, 44100, 50000, 192000}, +- {AOT_ER_AAC_ELD, MODE_212, 0, 48000, 62000, 192000}, +- +- {AOT_ER_AAC_ELD, MODE_212, 1, 16000, 18000, 31999}, +- {AOT_ER_AAC_ELD, MODE_212, 1, 22050, 18000, 31999}, +- {AOT_ER_AAC_ELD, MODE_212, 1, 24000, 20000, 64000}, +- +- {AOT_ER_AAC_ELD, MODE_212, 2, 32000, 18000, 64000}, +- {AOT_ER_AAC_ELD, MODE_212, 2, 44100, 21000, 64000}, +- {AOT_ER_AAC_ELD, MODE_212, 2, 48000, 26000, 64000} +- +-}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static INT FDK_MpegsEnc_WriteFrameHeader(HANDLE_MPS_ENCODER hMpsEnc, +- UCHAR *const pOutputBuffer, +- const int outputBufferSize); +- +-MPS_ENCODER_ERROR FDK_MpegsEnc_Open(HANDLE_MPS_ENCODER *phMpsEnc) { +- MPS_ENCODER_ERROR error = MPS_ENCODER_OK; +- HANDLE_MPS_ENCODER hMpsEnc = NULL; +- +- if (phMpsEnc == NULL) { +- error = MPS_ENCODER_INVALID_HANDLE; +- goto bail; +- } +- +- if (NULL == +- (hMpsEnc = (HANDLE_MPS_ENCODER)FDKcalloc(1, sizeof(MPS_ENCODER)))) { +- error = MPS_ENCODER_MEMORY_ERROR; +- goto bail; +- } +- FDKmemclear(hMpsEnc, sizeof(MPS_ENCODER)); +- +- if (SACENC_OK != FDK_sacenc_open(&hMpsEnc->hSacEncoder)) { +- error = MPS_ENCODER_MEMORY_ERROR; +- goto bail; +- } +- +- /* Return mps encoder instance */ +- *phMpsEnc = hMpsEnc; +- +-bail: +- if (error != MPS_ENCODER_OK) { +- FDK_MpegsEnc_Close(&hMpsEnc); +- } +- return error; +-} +- +-MPS_ENCODER_ERROR FDK_MpegsEnc_Close(HANDLE_MPS_ENCODER *phMpsEnc) { +- MPS_ENCODER_ERROR error = MPS_ENCODER_OK; +- +- if (phMpsEnc == NULL) { +- error = MPS_ENCODER_INVALID_HANDLE; +- goto bail; +- } +- +- if (*phMpsEnc != NULL) { +- FDK_sacenc_close(&(*phMpsEnc)->hSacEncoder); +- FDKfree(*phMpsEnc); +- *phMpsEnc = NULL; +- } +-bail: +- return error; +-} +- +-MPS_ENCODER_ERROR FDK_MpegsEnc_Init(HANDLE_MPS_ENCODER hMpsEnc, +- const AUDIO_OBJECT_TYPE audioObjectType, +- const UINT samplingrate, const UINT bitrate, +- const UINT sbrRatio, const UINT framelength, +- const UINT inputBufferSizePerChannel, +- const UINT coreCoderDelay) { +- MPS_ENCODER_ERROR error = MPS_ENCODER_OK; +- const UINT fs_low = 27713; /* low MPS sampling frequencies */ +- const UINT fs_high = 55426; /* high MPS sampling frequencies */ +- UINT nTimeSlots = 0, nQmfBandsLd = 0; +- +- if (hMpsEnc == NULL) { +- error = MPS_ENCODER_INVALID_HANDLE; +- goto bail; +- } +- +- /* Combine MPS with SBR only if the number of QMF band fits together.*/ +- switch (sbrRatio) { +- case 1: /* downsampled sbr - 32 QMF bands required */ +- if (!(samplingrate < fs_low)) { +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- break; +- case 2: /* dualrate - 64 QMF bands required */ +- if (!((samplingrate >= fs_low) && (samplingrate < fs_high))) { +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- break; +- case 0: +- default:; /* time interface - no samplingrate restriction */ +- } +- +- /* 32 QMF-Bands ( fs < 27713 ) +- * 64 QMF-Bands ( 27713 >= fs <= 55426 ) +- * 128 QMF-Bands ( fs > 55426 ) +- */ +- nQmfBandsLd = +- (samplingrate < fs_low) ? 5 : ((samplingrate > fs_high) ? 7 : 6); +- nTimeSlots = framelength >> nQmfBandsLd; +- +- /* check if number of qmf bands is usable for given framelength */ +- if (framelength != (nTimeSlots << nQmfBandsLd)) { +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- +- /* is given bitrate intended to be supported */ +- if ((INT)bitrate != FDK_MpegsEnc_GetClosestBitRate(audioObjectType, MODE_212, +- samplingrate, sbrRatio, +- bitrate)) { +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- +- /* init SAC library */ +- switch (audioObjectType) { +- case AOT_ER_AAC_ELD: { +- const UINT noInterFrameCoding = 0; +- +- if ((SACENC_OK != +- FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_LOWDELAY, +- (noInterFrameCoding == 1) ? 1 : 2)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_ENC_MODE, SACENC_212)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_SAMPLERATE, samplingrate)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_FRAME_TIME_SLOTS, +- nTimeSlots)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_PARAM_BANDS, +- SACENC_BANDS_15)) || +- (SACENC_OK != +- FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_TIME_DOM_DMX, 2)) || +- (SACENC_OK != +- FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_COARSE_QUANT, 0)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_QUANT_MODE, +- SACENC_QUANTMODE_FINE)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_TIME_ALIGNMENT, 0)) || +- (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder, +- SACENC_INDEPENDENCY_FACTOR, 20))) { +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- break; +- } +- default: +- error = MPS_ENCODER_INIT_ERROR; +- goto bail; +- } +- +- if (SACENC_OK != FDK_sacenc_init(hMpsEnc->hSacEncoder, coreCoderDelay)) { +- error = MPS_ENCODER_INIT_ERROR; +- } +- +- hMpsEnc->audioObjectType = audioObjectType; +- +- hMpsEnc->inBufDesc.ppBase = (void **)&hMpsEnc->pInBuffer; +- hMpsEnc->inBufDesc.pBufSize = hMpsEnc->pInBufferSize; +- hMpsEnc->inBufDesc.pEleSize = hMpsEnc->pInBufferElSize; +- hMpsEnc->inBufDesc.pBufType = hMpsEnc->pInBufferType; +- hMpsEnc->inBufDesc.numBufs = 1; +- +- hMpsEnc->outBufDesc.ppBase = (void **)&hMpsEnc->pOutBuffer; +- hMpsEnc->outBufDesc.pBufSize = hMpsEnc->pOutBufferSize; +- hMpsEnc->outBufDesc.pEleSize = hMpsEnc->pOutBufferElSize; +- hMpsEnc->outBufDesc.pBufType = hMpsEnc->pOutBufferType; +- hMpsEnc->outBufDesc.numBufs = 2; +- +- hMpsEnc->pInBuffer[0] = NULL; +- hMpsEnc->pInBufferSize[0] = 0; +- hMpsEnc->pInBufferElSize[0] = sizeof(INT_PCM); +- hMpsEnc->pInBufferType[0] = (FDK_BUF_TYPE_INPUT | FDK_BUF_TYPE_PCM_DATA); +- +- hMpsEnc->pOutBuffer[0] = NULL; +- hMpsEnc->pOutBufferSize[0] = 0; +- hMpsEnc->pOutBufferElSize[0] = sizeof(INT_PCM); +- hMpsEnc->pOutBufferType[0] = (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_PCM_DATA); +- +- hMpsEnc->pOutBuffer[1] = NULL; +- hMpsEnc->pOutBufferSize[1] = 0; +- hMpsEnc->pOutBufferElSize[1] = sizeof(UCHAR); +- hMpsEnc->pOutBufferType[1] = (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_BS_DATA); +- +- hMpsEnc->inargs.isInputInterleaved = 0; +- hMpsEnc->inargs.inputBufferSizePerChannel = inputBufferSizePerChannel; +- +-bail: +- return error; +-} +- +-MPS_ENCODER_ERROR FDK_MpegsEnc_Process(HANDLE_MPS_ENCODER hMpsEnc, +- INT_PCM *const pAudioSamples, +- const INT nAudioSamples, +- AACENC_EXT_PAYLOAD *pMpsExtPayload) { +- MPS_ENCODER_ERROR error = MPS_ENCODER_OK; +- +- if (hMpsEnc == NULL) { +- error = MPS_ENCODER_INVALID_HANDLE; +- } else { +- int sacHeaderFlag = 1; +- int sacOutBufferOffset = 0; +- +- /* In case of eld the ssc is explicit and doesn't need to be inband */ +- if (hMpsEnc->audioObjectType == AOT_ER_AAC_ELD) { +- sacHeaderFlag = 0; +- } +- +- /* 4 bits nibble after extension type */ +- hMpsEnc->sacOutBuffer[0] = (sacHeaderFlag == 0) ? 0x3 : 0x7; +- sacOutBufferOffset += 1; +- +- if (sacHeaderFlag) { +- sacOutBufferOffset += FDK_MpegsEnc_WriteFrameHeader( +- hMpsEnc, &hMpsEnc->sacOutBuffer[sacOutBufferOffset], +- sizeof(hMpsEnc->sacOutBuffer) - sacOutBufferOffset); +- } +- +- /* Register input and output buffer. */ +- hMpsEnc->pInBuffer[0] = (void *)pAudioSamples; +- hMpsEnc->inargs.nInputSamples = nAudioSamples; +- +- hMpsEnc->pOutBuffer[0] = (void *)pAudioSamples; +- hMpsEnc->pOutBufferSize[0] = sizeof(INT_PCM) * nAudioSamples / 2; +- +- hMpsEnc->pOutBuffer[1] = (void *)&hMpsEnc->sacOutBuffer[sacOutBufferOffset]; +- hMpsEnc->pOutBufferSize[1] = +- sizeof(hMpsEnc->sacOutBuffer) - sacOutBufferOffset; +- +- /* encode SAC frame */ +- if (SACENC_OK != FDK_sacenc_encode(hMpsEnc->hSacEncoder, +- &hMpsEnc->inBufDesc, +- &hMpsEnc->outBufDesc, &hMpsEnc->inargs, +- &hMpsEnc->outargs)) { +- error = MPS_ENCODER_ENCODE_ERROR; +- goto bail; +- } +- +- /* export MPS payload */ +- pMpsExtPayload->pData = (UCHAR *)hMpsEnc->sacOutBuffer; +- pMpsExtPayload->dataSize = +- hMpsEnc->outargs.nOutputBits + 8 * (sacOutBufferOffset - 1); +- pMpsExtPayload->dataType = EXT_LDSAC_DATA; +- pMpsExtPayload->associatedChElement = -1; +- } +- +-bail: +- return error; +-} +- +-INT FDK_MpegsEnc_WriteSpatialSpecificConfig(HANDLE_MPS_ENCODER hMpsEnc, +- HANDLE_FDK_BITSTREAM hBs) { +- INT sscBits = 0; +- +- if (NULL != hMpsEnc) { +- MP4SPACEENC_INFO mp4SpaceEncoderInfo; +- FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo); +- +- if (hBs != NULL) { +- int i; +- int writtenBits = 0; +- for (i = 0; inSscSizeBits>> 3; i++) { +- FDKwriteBits(hBs, mp4SpaceEncoderInfo.pSscBuf->pSsc[i], 8); +- writtenBits += 8; +- } +- FDKwriteBits(hBs, mp4SpaceEncoderInfo.pSscBuf->pSsc[i], +- mp4SpaceEncoderInfo.pSscBuf->nSscSizeBits - writtenBits); +- } /* hBS */ +- +- sscBits = mp4SpaceEncoderInfo.pSscBuf->nSscSizeBits; +- +- } /* valid hMpsEnc */ +- +- return sscBits; +-} +- +-static INT FDK_MpegsEnc_WriteFrameHeader(HANDLE_MPS_ENCODER hMpsEnc, +- UCHAR *const pOutputBuffer, +- const int outputBufferSize) { +- const int sacTimeAlignFlag = 0; +- +- /* Initialize variables */ +- int numBits = 0; +- +- if ((NULL != hMpsEnc) && (NULL != pOutputBuffer)) { +- UINT alignAnchor, cnt; +- FDK_BITSTREAM Bs; +- FDKinitBitStream(&Bs, pOutputBuffer, outputBufferSize, 0, BS_WRITER); +- +- /* Calculate SSC length information */ +- cnt = (FDK_MpegsEnc_WriteSpatialSpecificConfig(hMpsEnc, NULL) + 7) >> 3; +- +- /* Write SSC */ +- FDKwriteBits(&Bs, sacTimeAlignFlag, 1); +- +- if (cnt < 127) { +- FDKwriteBits(&Bs, cnt, 7); +- } else { +- FDKwriteBits(&Bs, 127, 7); +- FDKwriteBits(&Bs, cnt - 127, 16); +- } +- +- alignAnchor = FDKgetValidBits(&Bs); +- FDK_MpegsEnc_WriteSpatialSpecificConfig(hMpsEnc, &Bs); +- FDKbyteAlign(&Bs, alignAnchor); /* bsFillBits */ +- +- if (sacTimeAlignFlag) { +- FDK_ASSERT(1); /* time alignment not supported */ +- } +- +- numBits = FDKgetValidBits(&Bs); +- } /* valid handle */ +- +- return ((numBits + 7) >> 3); +-} +- +-INT FDK_MpegsEnc_GetClosestBitRate(const AUDIO_OBJECT_TYPE audioObjectType, +- const CHANNEL_MODE channelMode, +- const UINT samplingrate, const UINT sbrRatio, +- const UINT bitrate) { +- unsigned int i; +- int targetBitrate = -1; +- +- for (i = 0; i < sizeof(mpsConfigTab) / sizeof(MPS_CONFIG_TAB); i++) { +- if ((mpsConfigTab[i].audio_object_type == audioObjectType) && +- (mpsConfigTab[i].channel_mode == channelMode) && +- (mpsConfigTab[i].sbr_ratio == sbrRatio) && +- (mpsConfigTab[i].sampling_rate == samplingrate)) { +- targetBitrate = fMin(fMax(bitrate, mpsConfigTab[i].bitrate_min), +- mpsConfigTab[i].bitrate_max); +- } +- } +- +- return targetBitrate; +-} +- +-INT FDK_MpegsEnc_GetDelay(HANDLE_MPS_ENCODER hMpsEnc) { +- INT delay = 0; +- +- if (NULL != hMpsEnc) { +- MP4SPACEENC_INFO mp4SpaceEncoderInfo; +- FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo); +- delay = mp4SpaceEncoderInfo.nCodecDelay; +- } +- +- return delay; +-} +- +-INT FDK_MpegsEnc_GetDecDelay(HANDLE_MPS_ENCODER hMpsEnc) { +- INT delay = 0; +- +- if (NULL != hMpsEnc) { +- MP4SPACEENC_INFO mp4SpaceEncoderInfo; +- FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo); +- delay = mp4SpaceEncoderInfo.nDecoderDelay; +- } +- +- return delay; +-} +- +-MPS_ENCODER_ERROR FDK_MpegsEnc_GetLibInfo(LIB_INFO *info) { +- MPS_ENCODER_ERROR error = MPS_ENCODER_OK; +- +- if (NULL == info) { +- error = MPS_ENCODER_INVALID_HANDLE; +- } else if (SACENC_OK != FDK_sacenc_getLibInfo(info)) { +- error = MPS_ENCODER_INIT_ERROR; +- } +- +- return error; +-} +diff --git a/libAACenc/src/mps_main.h b/libAACenc/src/mps_main.h +deleted file mode 100644 +index f56678a..0000000 +--- a/libAACenc/src/mps_main.h ++++ /dev/null +@@ -1,270 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC encoder library ****************************** +- +- Author(s): Markus Lohwasser +- +- Description: Mpeg Surround library interface functions +- +-*******************************************************************************/ +- +-#ifndef MPS_MAIN_H +-#define MPS_MAIN_H +- +-/* Includes ******************************************************************/ +-#include "aacenc.h" +-#include "FDK_audio.h" +-#include "machine_type.h" +- +-/* Defines *******************************************************************/ +-typedef enum { +- MPS_ENCODER_OK = 0x0000, /*!< No error happened. All fine. */ +- MPS_ENCODER_INVALID_HANDLE = +- 0x0020, /*!< Handle passed to function call was invalid. */ +- MPS_ENCODER_MEMORY_ERROR = 0x0021, /*!< Memory allocation failed. */ +- MPS_ENCODER_INIT_ERROR = 0x0040, /*!< General initialization error. */ +- MPS_ENCODER_ENCODE_ERROR = +- 0x0060 /*!< The encoding process was interrupted by an unexpected error. +- */ +- +-} MPS_ENCODER_ERROR; +- +-/* Data Types ****************************************************************/ +- +-/** +- * MPEG Surround Encoder interface handle. +- */ +-typedef struct MPS_ENCODER MPS_ENCODER, *HANDLE_MPS_ENCODER; +- +-/* Function / Class Declarations *********************************************/ +- +-/** +- * \brief Open a Mpeg Surround Encoder instance. +- * +- * \phMpsEnc A pointer to a MPS handle to be allocated. +- * Initialized on return. +- * +- * \return +- * - MPS_ENCODER_OK, on succes. +- * - MPS_ENCODER_INVALID_HANDLE, MPS_ENCODER_MEMORY_ERROR, on failure. +- */ +-MPS_ENCODER_ERROR FDK_MpegsEnc_Open(HANDLE_MPS_ENCODER *phMpsEnc); +- +-/** +- * \brief Close the Mpeg Surround Encoder instance. +- * +- * Deallocate instance and free whole memory. +- * +- * \param phMpsEnc Pointer to the MPS handle to be deallocated. +- * +- * \return +- * - MPS_ENCODER_OK, on succes. +- * - MPS_ENCODER_INVALID_HANDLE, on failure. +- */ +-MPS_ENCODER_ERROR FDK_MpegsEnc_Close(HANDLE_MPS_ENCODER *phMpsEnc); +- +-/** +- * \brief Initialize a Mpeg Surround Encoder instance. +- * +- * \param hMpsEnc MPS Encoder handle. +- * \param audioObjectType Audio object type. +- * \param samplingrate Sampling rate in Hz of audio input signal. +- * \param bitrate Encder target bitrate. +- * \param sbrRatio SBR sampling rate ratio. +- * \param framelength Number of samples to be processes within one +- * frame. +- * \param inputBufferSizePerChannel Size of input buffer per channel. +- * \param coreCoderDelay Core coder delay. +- * +- * \return +- * - MPS_ENCODER_OK, on succes. +- * - MPS_ENCODER_INVALID_HANDLE, MPS_ENCODER_ENCODE_ERROR, on failure. +- */ +-MPS_ENCODER_ERROR FDK_MpegsEnc_Init(HANDLE_MPS_ENCODER hMpsEnc, +- const AUDIO_OBJECT_TYPE audioObjectType, +- const UINT samplingrate, const UINT bitrate, +- const UINT sbrRatio, const UINT framelength, +- const UINT inputBufferSizePerChannel, +- const UINT coreCoderDelay); +- +-/** +- * \brief Calculate Mpeg Surround processing. +- * +- * This fuction applies the MPS processing. The MPS side info will be written to +- * extension payload. The input audio data will be overwritten by the calculated +- * downmix. +- * +- * \param hMpsEnc MPS Encoder handle. +- * \param pAudioSamples Pointer to audio input/output data. +- * \param nAudioSamples Number of input audio samples to be prcessed. +- * \param pMpsExtPayload Pointer to extension payload to be filled on +- * return. +- * +- * \return +- * - MPS_ENCODER_OK, on succes. +- * - MPS_ENCODER_INVALID_HANDLE, MPS_ENCODER_ENCODE_ERROR, on failure. +- */ +-MPS_ENCODER_ERROR FDK_MpegsEnc_Process(HANDLE_MPS_ENCODER hMpsEnc, +- INT_PCM *const pAudioSamples, +- const INT nAudioSamples, +- AACENC_EXT_PAYLOAD *pMpsExtPayload); +- +-/** +- * \brief Write Spatial Specific Config. +- * +- * This function can be called via call back from the transport library to write +- * the Spatial Specific Config to given bitstream buffer. +- * +- * \param hMpsEnc MPS Encoder handle. +- * \param hBs Bitstream buffer handle. +- * +- * \return Number of written bits. +- */ +-INT FDK_MpegsEnc_WriteSpatialSpecificConfig(HANDLE_MPS_ENCODER hMpsEnc, +- HANDLE_FDK_BITSTREAM hBs); +- +-/** +- * \brief Get closest valid bitrate supported by given config. +- * +- * \param audioObjectType Audio object type. +- * \param channelMode Encoder channel mode. +- * \param samplingrate Sampling rate in Hz of audio input signal. +- * \param sbrRatio SBR sampling rate ratio. +- * \param bitrate The desired target bitrate. +- * +- * \return Closest valid bitrate to given bitrate.. +- */ +-INT FDK_MpegsEnc_GetClosestBitRate(const AUDIO_OBJECT_TYPE audioObjectType, +- const CHANNEL_MODE channelMode, +- const UINT samplingrate, const UINT sbrRatio, +- const UINT bitrate); +- +-/** +- * \brief Get codec delay. +- * +- * This function returns delay of the whole en-/decoded signal, including +- * corecoder delay. +- * +- * \param hMpsEnc MPS Encoder handle. +- * +- * \return Codec delay in samples. +- */ +-INT FDK_MpegsEnc_GetDelay(HANDLE_MPS_ENCODER hMpsEnc); +- +-/** +- * \brief Get Mpeg Surround Decoder delay. +- * +- * This function returns delay of the Mpeg Surround decoder. +- * +- * \param hMpsEnc MPS Encoder handle. +- * +- * \return Mpeg Surround Decoder delay in samples. +- */ +-INT FDK_MpegsEnc_GetDecDelay(HANDLE_MPS_ENCODER hMpsEnc); +- +-/** +- * \brief Get information about encoder library build. +- * +- * Fill a given LIB_INFO structure with library version information. +- * +- * \param info Pointer to an allocated LIB_INFO struct. +- * +- * \return +- * - MPS_ENCODER_OK, on succes. +- * - MPS_ENCODER_INVALID_HANDLE, MPS_ENCODER_INIT_ERROR, on failure. +- */ +-MPS_ENCODER_ERROR FDK_MpegsEnc_GetLibInfo(LIB_INFO *info); +- +-#endif /* MPS_MAIN_H */ +diff --git a/libSACdec/include/sac_dec_errorcodes.h b/libSACdec/include/sac_dec_errorcodes.h +deleted file mode 100644 +index ee8b9f8..0000000 +--- a/libSACdec/include/sac_dec_errorcodes.h ++++ /dev/null +@@ -1,157 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: error codes for mpeg surround decoder +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_ERRORCODES_H +-#define SAC_DEC_ERRORCODES_H +- +-typedef enum { +- +- __mps_error_start = -1000, +- +- MPS_OK = 0, +- +- /* generic/init errors */ +- MPS_NOTOK = __mps_error_start, +- +- MPS_OUTOFMEMORY, +- MPS_INVALID_HANDLE, +- MPS_INVALID_PARAMETER, /* SetParam not successfull */ +- MPS_UNSUPPORTED_HRTFMODEL, /* SetHRTFModel() not successfull */ +- MPS_UNSUPPORTED_HRTFFREQ, /* SetHRTFModel() not successfull */ +- +- MPS_UNSUPPORTED_UPMIX_TYPE, /* CheckLevelTreeUpmixType() */ +- MPS_UNSUPPORTED_FORMAT, /* various functions; unknown aot or no_channels in +- filterbank */ +- MPS_OUTPUT_BUFFER_TOO_SMALL, /* Size of provided output time buffer is too +- small */ +- +- /* ssc errors */ +- MPS_INVALID_PARAMETERBANDS, /* unsupported numParameterBands in +- SpatialDecDecodeHeader() */ +- MPS_INVALID_TREECONFIG, +- MPS_INVALID_HRTFSET, /* SpatialDecDecodeHeader() */ +- MPS_INVALID_TTT, /* SpatialDecDecodeHeader() */ +- MPS_INVALID_BOXIDX, /* ecDataDec() */ +- MPS_INVALID_SETIDX, /* ecDataDec() */ +- MPS_INVALID_QUANTMODE, /* SpatialDecParseSpecificConfig() */ +- MPS_UNEQUAL_SSC, /* FDK_SpatialDecCompareSpatialSpecificConfigHeader() */ +- MPS_UNSUPPORTED_CONFIG, /* number of core channels; 3DStereoInversion; */ +- +- /* parse errors */ +- MPS_PARSE_ERROR, +- MPS_INVALID_TEMPSHAPE, /* SpatialDecParseFrameData() */ +- +- /* render errors */ +- MPS_WRONG_PARAMETERSETS, +- MPS_WRONG_PARAMETERBANDS, /* decodeAndMapFrameSmg() */ +- MPS_WRONG_TREECONFIG, +- MPS_WRONG_BLINDCONFIG, +- MPS_WRONG_OTT, +- MPS_WRONG_QUANTMODE, +- MPS_RESDEC_ERROR, +- MPS_APPLY_M2_ERROR, /* error in applyM2x()selection */ +- +- __mps_error_end +- +-} SACDEC_ERROR; +- +-#endif +diff --git a/libSACdec/include/sac_dec_lib.h b/libSACdec/include/sac_dec_lib.h +deleted file mode 100644 +index 9913279..0000000 +--- a/libSACdec/include/sac_dec_lib.h ++++ /dev/null +@@ -1,477 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: Space Decoder +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_LIB_H +-#define SAC_DEC_LIB_H +- +-#include "common_fix.h" +-#include "FDK_audio.h" +-#include "sac_dec_errorcodes.h" +-#include "FDK_bitstream.h" +-#include "FDK_qmf_domain.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif /* __cplusplus */ +- +-/** +- * \brief MPEG Surround input data interface mode. +- **/ +-typedef enum { +- SAC_INTERFACE_QMF = +- 0, /*!< Use QMF domain interface for the input downmix audio. */ +- SAC_INTERFACE_TIME, /*!< Use time domain interface for the input downmix +- audio. */ +- SAC_INTERFACE_AUTO /*!< */ +-} SAC_INPUT_CONFIG; +- +-/** +- * \brief MPEG Surround output mode. +- **/ +-typedef enum { +- SACDEC_OUT_MODE_NORMAL = +- 0, /*!< Normal multi channel processing without output restrictions. */ +- SACDEC_OUT_MODE_BINAURAL, /*!< Two channel output with binaural processsing. +- */ +- SACDEC_OUT_MODE_STEREO, /*!< Always two channel output mode. */ +- SACDEC_OUT_MODE_6CHANNEL /*!< Always process with 5.1 channel output. */ +-} SAC_DEC_OUTPUT_MODE; +- +-/** +- * \brief MPEG Surround binaural HRTF model. +- * HRTF will be applied only in combination with upmixtype +- *SAC_UPMIX_TYPE_BINAURAL. +- **/ +-typedef enum { +- SAC_BINAURAL_HRTF_KEMAR = 0, +- SAC_BINAURAL_HRTF_VAST, +- SAC_BINAURAL_HRTF_MPSVT, +- SAC_BINAURAL_SINGLE_HRTFS +-} SAC_BINAURAL_HRTF_MODEL; +- +-/** +- * \brief MPEG Surround decoder instance available. +- **/ +-typedef enum { +- SAC_INSTANCE_NOT_FULL_AVAILABLE = +- 0, /*!< MPEG Surround decoder instance not full available. */ +- SAC_INSTANCE_FULL_AVAILABLE /*!< MPEG Surround decoder instance full +- available. */ +-} SAC_INSTANCE_AVAIL; +- +-/** +- * \brief MPEG Surround decoder dynamic parameters. +- * +- * Use mpegSurroundDecoder_SetParam() function to configure internal status of +- * following parameters. +- */ +-typedef enum { +- SACDEC_OUTPUT_MODE = 0x0001, /*!< Set MPEG Surround decoder output mode. See +- SAC_DEC_OUTPUT_MODE. */ +- SACDEC_BLIND_ENABLE = +- 0x0002, /*!< Multi channel output without MPEG Surround side info. */ +- SACDEC_PARTIALLY_COMPLEX = +- 0x0003, /*!< Set partially complex flag for MPEG Surround. +- 0: Use complex valued QMF data. +- 1: Use real valued QMF data (low power mode) */ +- SACDEC_INTERFACE = +- 0x0004, /*!< Select signal input interface for MPEG Surround. +- Switch time interface off: 0 +- Switch time interface on: 1 */ +- SACDEC_BS_DELAY = 0x0005, /*!< Select bit stream delay for MPEG Surround. +- Switch bit stream delay off: 0 +- Switch bit stream delay on: 1 */ +- SACDEC_BINAURAL_QUALITY = +- 0x0102, /*!< Set binaural quality for MPEG Surround binaural mode. +- 0: Low Complexity, +- 1: High Quality */ +- SACDEC_BINAURAL_DISTANCE = 0x0103, /*!< Set perceived distance for binaural +- playback (binaural mode only). The valid +- values range from 0 to 100. Where 100 +- corresponds to the farthest perceived +- distance. */ +- SACDEC_BINAURAL_DIALOG_CLARITY = +- 0x0104, /*!< Set dialog clarity (for binaural playback). +- The valid values range from 0 to 100. */ +- SACDEC_BINAURAL_FRONT_ANGLE = 0x0105, /*!< Set angle between the virtual front +- speaker pair (binaural mode only). +- The valid range is from 0 to 180 +- angular degrees. */ +- SACDEC_BINAURAL_BACK_ANGLE = 0x0106, /*!< Set angle between the virtual back +- speaker pair (binaural mode only). The +- valid range is from 0 to 180 angular +- degrees. */ +- SACDEC_BINAURAL_PRESET = 0x0107, /*!< Set a virtual speaker setup preset for +- binaural playback (binaural mode only). +- This meta-parameter implicitly modifies +- the following parameters: +- SACDEC_BINAURAL_DISTANCE, +- SACDEC_BINAURAL_DIALOG_CLARITY, +- SACDEC_BINAURAL_FRONT_ANGLE and +- SACDEC_BINAURAL_BACK_ANGLE. +- The following presets are available: +- 1: Dry room +- 2: Living room (default) +- 3: Cinema */ +- +- SACDEC_BS_INTERRUPTION = +- 0x0200, /*!< If the given value is unequal to 0 hint the MPEG Surround +- decoder that the next input data is discontinuous, because of +- frame loss, seeking, etc. Announce the decoder that the +- bitstream data was interrupted (fSync = 0). This will cause the +- surround decoder not to parse any new bitstream data until a +- new header with a valid Spatial Specific Config and a +- independently decodable frame is found. Specially important +- when the MPEG Surround data is split accross several frames +- (for example in the case of AAC-LC downmix with 1024 +- framelength and 2048 surround frame length) and a discontinuity +- in the bitstream data occurs. If fSync is 1, assume that MPEG +- Surround data is in sync (out of band config for example). */ +- SACDEC_CLEAR_HISTORY = 0x0201, /*!< If the given value is unequal to 0 clear +- all internal states (delay lines, QMF +- states, ...) of the MPEG Surround decoder. +- This will cause a discontinuity in the audio +- output signal. */ +- +- SACDEC_CONCEAL_NUM_KEEP_FRAMES = +- 0x0301, /*!< Error concealment: The Number of frames the module keeps the +- last spatial image before fading to the particular spatial +- scenario starts. The default is 10 frames. */ +- SACDEC_CONCEAL_FADE_OUT_SLOPE_LENGTH = +- 0x0302, /*!< Error concealment: Length of the slope (in frames) the module +- creates to fade from the last spatial scenario to the +- particular default scenario (downmix) in case of consecutive +- errors. Default is 5. */ +- SACDEC_CONCEAL_FADE_IN_SLOPE_LENGTH = +- 0x0303, /*!< Error concealment: Length of the slope (in frames) the module +- creates to fade from the default spatial scenario (downmix) to +- the current scenario after fade-out. Default parameter value +- is 5. */ +- SACDEC_CONCEAL_NUM_RELEASE_FRAMES = +- 0x0304 /*!< Error concealment: The number of error free frames before the +- module starts fading from default to the current spatial +- scenario. Default parameter value is 3 frames. */ +-} SACDEC_PARAM; +- +-#define PCM_MPS INT_PCM +- +-/** +- * \brief MPEG Surround decoder handle. +- */ +-typedef struct MpegSurroundDecoder CMpegSurroundDecoder; +- +-/** +- * \brief Check if the full MPEG Surround decoder instance is allocated. +- * +- * Check if the full MPEG Surround decoder instance is allocated. +- * +- * \param pMpegSurroundDecoder A pointer to a decoder stucture. +- * +- * \return SACDEC_ERROR error code +- */ +-SAC_INSTANCE_AVAIL +-mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( +- CMpegSurroundDecoder *pMpegSurroundDecoder); +- +-/** +- * \brief Open one instance of the MPEG Surround decoder. +- * +- * Allocate one instance of decoder and input buffers. +- * - Allocate decoder structure +- * - Allocate input buffers (QMF/time/MPS data) +- * +- * \param pMpegSurroundDecoder A pointer to a decoder handle; filled on +- * return. +- * \param splitMemoryAllocation Allocate only outer layer of MPS decoder. Core +- * part is reallocated later if needed. +- * \param stereoConfigIndex USAC: Save memory by opening the MPS decoder +- * for a specific stereoConfigIndex. (Needs optimization macros enabled.) +- * \param pQmfDomain Pointer to QMF domain data structure. +- * +- * \return SACDEC_ERROR error code +- */ +-SACDEC_ERROR mpegSurroundDecoder_Open( +- CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain); +- +-/** +- * \brief Init one instance of the MPEG Surround decoder. +- * +- * Init one instance of the MPEG Surround decoder +- * +- * \param pMpegSurroundDecoder A pointer to a decoder handle; +- * +- * \return SACDEC_ERROR error code +- */ +-SACDEC_ERROR mpegSurroundDecoder_Init( +- CMpegSurroundDecoder *pMpegSurroundDecoder); +- +-/** +- * \brief Read and parse SpatialSpecificConfig. +- * +- * \param pMpegSurroundDecoder A pointer to a decoder handle. +- * \param hBs bitstream handle config parsing data source. +- * +- * \return SACDEC_ERROR error code +- */ +-SACDEC_ERROR mpegSurroundDecoder_Config( +- CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, +- AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, +- INT stereoConfigIndex, INT coreSbrFrameLengthIndex, INT configBytes, +- const UCHAR configMode, UCHAR *configChanged); +- +-SACDEC_ERROR +-mpegSurroundDecoder_ConfigureQmfDomain( +- CMpegSurroundDecoder *pMpegSurroundDecoder, +- SAC_INPUT_CONFIG sac_dec_interface, UINT coreSamplingRate, +- AUDIO_OBJECT_TYPE coreCodec); +- +-/** +- * \brief Parse MPEG Surround data without header +- * +- * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. +- * \param hBs Bit stream handle data input source +- * \param pMpsDataBits Pointer to number of valid bits in extension +- * payload. Function updates mpsDataBits while parsing bitstream. +- * \param fGlobalIndependencyFlag Global independency flag of current frame. +- * +- * \return Error code. +- */ +-int mpegSurroundDecoder_ParseNoHeader( +- CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, +- int *pMpsDataBits, int fGlobalIndependencyFlag); +- +-/* #ifdef SACDEC_MPS_ENABLE */ +-/** +- * \brief Parse MPEG Surround data with header. Header is ancType, ancStart, +- ancStop (4 bits total). Body is ancDataSegmentByte[i]. +- * +- * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. +- * \param hBs Bit stream handle data input source +- * \param pMpsDataBits Pointer to number of valid bits in extension +- payload. Function updates mpsDataBits while parsing bitstream. Needs to be a +- multiple of 8 + 4 (4 bits header). +- * \param coreCodec The audio object type of the core codec handling +- the downmix input signal. +- * \param sampleRate Samplerate of input downmix data. +- * \param nChannels Amount of input channels. +- * \param frameSize Amount of input samples. +- * \param fGlobalIndependencyFlag Global independency flag of current frame. +- * +- * \return Error code. +- */ +-int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, +- HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, +- AUDIO_OBJECT_TYPE coreCodec, int sampleRate, +- int frameSize, int fGlobalIndependencyFlag); +-/* #endif */ +- +-/** +- * \brief Apply MPEG Surround upmix. +- * +- * Process one downmix audio frame and decode one surround frame if it applies. +- * Downmix framing can be different from surround framing, so depending on the +- * frame size of the downmix audio data and the framing being used by the MPEG +- * Surround decoder, it could be that only every second call, for example, of +- * this function actually surround data was decoded. The returned value of +- * frameSize will be zero, if no surround data was decoded. +- * +- * Decoding one MPEG Surround frame. Depending on interface configuration +- * mpegSurroundDecoder_SetParam(self, SACDEC_INTERFACE, value), the QMF or time +- * interface will be applied. External access to QMF buffer interface can be +- * achieved by mpegSurroundDecoder_GetQmfBuffer() call before decode frame. +- * While using time interface, pTimeData buffer will be shared as input and +- * output buffer. +- * +- * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. +- * \param pTimeData Pointer to time buffer. Depending on interface +- * configuration, the content of pTimeData is ignored, and the internal QMF +- * buffer will be used as input data source. +- * Otherwise, the MPEG Surround processing is applied to the timesignal +- * pTimeData. For both variants, the resulting MPEG +- * Surround signal is written into pTimeData. +- * \param timeDataSize Size of pTimeData (available buffer size). +- * \param timeDataFrameSize Frame size of input timedata +- * \param nChannels Pointer where the amount of input channels is +- * given and amount of output channels is returned. +- * \param frameSize Pointer where the amount of output samples is +- * returned into. +- * \param channelType Array were the corresponding channel type for +- * each output audio channel is stored into. +- * \param channelIndices Array were the corresponding channel type index +- * for each output audio channel is stored into. +- * \param mapDescr Channep map descriptor for output channel mapping +- * to be used (From MPEG PCE ordering to whatever is required). +- * +- * \return Error code. +- */ +-int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, +- INT_PCM *input, PCM_MPS *pTimeData, +- const int timeDataSize, int timeDataFrameSize, +- int *nChannels, int *frameSize, int sampleRate, +- AUDIO_OBJECT_TYPE coreCodec, +- AUDIO_CHANNEL_TYPE channelType[], +- UCHAR channelIndices[], +- const FDK_channelMapDescr *const mapDescr); +- +-/** +- * \brief Deallocate a MPEG Surround decoder instance. +- * \param pMpegSurroundDecoder A decoder handle. +- * \return No return value. +- */ +-void mpegSurroundDecoder_Close(CMpegSurroundDecoder *pMpegSurroundDecoder); +- +-/** +- * \brief Free config dependent MPEG Surround memory. +- * \param pMpegSurroundDecoder A decoder handle. +- * \return error. +- */ +-SACDEC_ERROR mpegSurroundDecoder_FreeMem( +- CMpegSurroundDecoder *pMpegSurroundDecoder); +- +-/** +- * \brief Set one single MPEG Surround decoder parameter. +- * +- * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. Must not be +- * NULL pointer. +- * \param param Parameter to be set. See SACDEC_PARAM. +- * \param value Parameter value. See SACDEC_PARAM. +- * +- * \return 0 on sucess, and non-zero on failure. +- */ +-SACDEC_ERROR mpegSurroundDecoder_SetParam( +- CMpegSurroundDecoder *pMpegSurroundDecoder, const SACDEC_PARAM param, +- const INT value); +- +-/** +- * \brief Retrieve MPEG Surround decoder library info and fill info list with all depending library infos. +- * \param libInfo Pointer to library info list to be filled. +- * \return 0 on sucess, and non-zero on failure. +- **/ +-int mpegSurroundDecoder_GetLibInfo(LIB_INFO *libInfo); +- +-/** +- * \brief Set one single MPEG Surround decoder parameter. +- * +- * \param pMpegSurroundDecoder A valid MPEG Surrround decoder handle. +- * +- * \return The additional signal delay caused by the module. +- */ +-UINT mpegSurroundDecoder_GetDelay(const CMpegSurroundDecoder *self); +- +-/** +- * \brief Get info on whether the USAC pseudo LR feature is active. +- * +- * \param pMpegSurroundDecoder A valid MPEG Surrround decoder handle. +- * \param bsPseudoLr Pointer to return wether pseudo LR USAC feature +- * is used. +- * +- * \return 0 on sucess, and non-zero on failure. +- */ +-SACDEC_ERROR mpegSurroundDecoder_IsPseudoLR( +- CMpegSurroundDecoder *pMpegSurroundDecoder, int *bsPseudoLr); +- +-#ifdef __cplusplus +-} +-#endif /* __cplusplus */ +- +-#endif /* #ifndef SAC_DEC_LIB_H */ +diff --git a/libSACdec/src/sac_bitdec.cpp b/libSACdec/src/sac_bitdec.cpp +deleted file mode 100644 +index 883e1e8..0000000 +--- a/libSACdec/src/sac_bitdec.cpp ++++ /dev/null +@@ -1,2167 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec bitstream decoder +- +-*******************************************************************************/ +- +-#include "sac_bitdec.h" +- +-#include "sac_dec_errorcodes.h" +-#include "nlc_dec.h" +-#include "sac_rom.h" +-#include "FDK_matrixCalloc.h" +-#include "sac_tsd.h" +- +-enum { +- ottVsTotInactiv = 0, +- ottVsTotDb1Activ = 1, +- ottVsTotDb2Activ = 2, +- ottVsTotDb1Db2Activ = 3 +-}; +- +-static SACDEC_ERROR SpatialDecDecodeHelperInfo( +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType) { +- int i; +- UINT syntaxFlags; +- +- /* Determine bit stream syntax */ +- syntaxFlags = 0; +- switch (pSpatialSpecificConfig->coreCodec) { +- case AOT_ER_AAC_ELD: +- case AOT_ER_AAC_LD: +- syntaxFlags |= SACDEC_SYNTAX_LD; +- break; +- case AOT_USAC: +- syntaxFlags |= SACDEC_SYNTAX_USAC; +- break; +- case AOT_NONE: +- default: +- return MPS_UNSUPPORTED_FORMAT; +- } +- +- pSpatialSpecificConfig->syntaxFlags = syntaxFlags; +- +- switch (pSpatialSpecificConfig->treeConfig) { +- case TREE_212: { +- pSpatialSpecificConfig->ottCLDdefault[0] = 0; +- } break; +- default: +- return MPS_INVALID_TREECONFIG; +- } +- +- if (syntaxFlags & SACDEC_SYNTAX_USAC) { +- if (pSpatialSpecificConfig->bsOttBandsPhasePresent) { +- pSpatialSpecificConfig->numOttBandsIPD = +- pSpatialSpecificConfig->bsOttBandsPhase; +- } else { +- int numParameterBands; +- +- numParameterBands = pSpatialSpecificConfig->freqRes; +- switch (numParameterBands) { +- case 4: +- case 5: +- pSpatialSpecificConfig->numOttBandsIPD = 2; +- break; +- case 7: +- pSpatialSpecificConfig->numOttBandsIPD = 3; +- break; +- case 10: +- pSpatialSpecificConfig->numOttBandsIPD = 5; +- break; +- case 14: +- pSpatialSpecificConfig->numOttBandsIPD = 7; +- break; +- case 20: +- case 28: +- pSpatialSpecificConfig->numOttBandsIPD = 10; +- break; +- default: +- return MPS_INVALID_PARAMETERBANDS; +- } +- } +- } else { +- pSpatialSpecificConfig->numOttBandsIPD = 0; +- } +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- { +- pSpatialSpecificConfig->bitstreamOttBands[i] = +- pSpatialSpecificConfig->freqRes; +- } +- { +- pSpatialSpecificConfig->numOttBands[i] = +- pSpatialSpecificConfig->bitstreamOttBands[i]; +- if (syntaxFlags & SACDEC_SYNTAX_USAC && +- !pSpatialSpecificConfig->bsOttBandsPhasePresent) { +- if (pSpatialSpecificConfig->bResidualCoding && +- pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent && +- (pSpatialSpecificConfig->numOttBandsIPD < +- pSpatialSpecificConfig->ResidualConfig[i].nResidualBands)) { +- pSpatialSpecificConfig->numOttBandsIPD = +- pSpatialSpecificConfig->ResidualConfig[i].nResidualBands; +- } +- } +- } +- } /* i */ +- +- return MPS_OK; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecParseExtensionConfig +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +- +-static SACDEC_ERROR SpatialDecParseExtensionConfig( +- HANDLE_FDK_BITSTREAM bitstream, SPATIAL_SPECIFIC_CONFIG *config, +- int numOttBoxes, int numTttBoxes, int numOutChan, int bitsAvailable) { +- SACDEC_ERROR err = MPS_OK; +- INT ba = bitsAvailable; +- +- config->sacExtCnt = 0; +- config->bResidualCoding = 0; +- +- ba = fMin((int)FDKgetValidBits(bitstream), ba); +- +- while ((ba >= 8) && (config->sacExtCnt < MAX_NUM_EXT_TYPES)) { +- int bitsRead, nFillBits; +- INT tmp; +- UINT sacExtLen; +- +- config->sacExtType[config->sacExtCnt] = FDKreadBits(bitstream, 4); +- ba -= 4; +- +- sacExtLen = FDKreadBits(bitstream, 4); +- ba -= 4; +- +- if (sacExtLen == 15) { +- sacExtLen += FDKreadBits(bitstream, 8); +- ba -= 8; +- if (sacExtLen == 15 + 255) { +- sacExtLen += FDKreadBits(bitstream, 16); +- ba -= 16; +- } +- } +- +- tmp = (INT)FDKgetValidBits( +- bitstream); /* Extension config payload start anchor. */ +- if ((tmp <= 0) || (tmp < (INT)sacExtLen * 8) || (ba < (INT)sacExtLen * 8)) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- +- switch (config->sacExtType[config->sacExtCnt]) { +- default:; /* unknown extension data => do nothing */ +- } +- +- /* skip remaining extension data */ +- bitsRead = tmp - FDKgetValidBits(bitstream); +- nFillBits = 8 * sacExtLen - bitsRead; +- +- if (nFillBits < 0) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } else { +- /* Skip fill bits or an unkown extension. */ +- FDKpushFor(bitstream, nFillBits); +- } +- +- ba -= 8 * sacExtLen; +- config->sacExtCnt++; +- } +- +-bail: +- return err; +-} +- +-SACDEC_ERROR SpatialDecParseSpecificConfigHeader( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, SPATIAL_DEC_UPMIX_TYPE upmixType) { +- SACDEC_ERROR err = MPS_OK; +- INT numFillBits; +- int sacHeaderLen = 0; +- int sacTimeAlignFlag = 0; +- +- sacTimeAlignFlag = FDKreadBits(bitstream, 1); +- sacHeaderLen = FDKreadBits(bitstream, 7); +- +- if (sacHeaderLen == 127) { +- sacHeaderLen += FDKreadBits(bitstream, 16); +- } +- numFillBits = (INT)FDKgetValidBits(bitstream); +- +- err = SpatialDecParseSpecificConfig(bitstream, pSpatialSpecificConfig, +- sacHeaderLen, coreCodec); +- +- numFillBits -= +- (INT)FDKgetValidBits(bitstream); /* the number of read bits (tmpBits) */ +- numFillBits = (8 * sacHeaderLen) - numFillBits; +- if (numFillBits < 0) { +- /* Parsing went wrong */ +- err = MPS_PARSE_ERROR; +- } +- /* Move to the very end of the SSC */ +- FDKpushBiDirectional(bitstream, numFillBits); +- +- if ((err == MPS_OK) && sacTimeAlignFlag) { +- /* not supported */ +- FDKreadBits(bitstream, 16); +- err = MPS_UNSUPPORTED_CONFIG; +- } +- +- /* Derive additional helper variables */ +- SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, (UPMIXTYPE)upmixType); +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecParseMps212Config( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int samplingRate, +- AUDIO_OBJECT_TYPE coreCodec, INT stereoConfigIndex, +- INT coreSbrFrameLengthIndex) { +- int i; +- +- FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG)); +- +- pSpatialSpecificConfig->stereoConfigIndex = stereoConfigIndex; +- pSpatialSpecificConfig->coreSbrFrameLengthIndex = coreSbrFrameLengthIndex; +- pSpatialSpecificConfig->freqRes = +- (SPATIALDEC_FREQ_RES)freqResTable[FDKreadBits(bitstream, 3)]; +- if (pSpatialSpecificConfig->freqRes == 0) { +- return MPS_PARSE_ERROR; /* reserved value */ +- } +- +- switch (coreCodec) { +- case AOT_DRM_USAC: +- pSpatialSpecificConfig->bsFixedGainDMX = +- (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3); +- /* tempShapeConfig = (bsTempShapeConfigDrm == 1) ? 3 : 0 */ +- pSpatialSpecificConfig->tempShapeConfig = +- (SPATIALDEC_TS_CONF)(FDKreadBits(bitstream, 1) * 3); +- pSpatialSpecificConfig->decorrConfig = (SPATIALDEC_DECORR_CONF)0; +- pSpatialSpecificConfig->bsDecorrType = 0; +- break; +- case AOT_USAC: +- pSpatialSpecificConfig->bsFixedGainDMX = +- (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3); +- pSpatialSpecificConfig->tempShapeConfig = +- (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2); +- pSpatialSpecificConfig->decorrConfig = +- (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2); +- if (pSpatialSpecificConfig->decorrConfig > 2) { +- return MPS_PARSE_ERROR; /* reserved value */ +- } +- pSpatialSpecificConfig->bsDecorrType = 0; +- break; +- default: +- return MPS_UNSUPPORTED_FORMAT; +- } +- pSpatialSpecificConfig->nTimeSlots = (coreSbrFrameLengthIndex == 4) ? 64 : 32; +- pSpatialSpecificConfig->bsHighRateMode = (UCHAR)FDKreadBits(bitstream, 1); +- +- { +- pSpatialSpecificConfig->bsPhaseCoding = (UCHAR)FDKreadBits(bitstream, 1); +- pSpatialSpecificConfig->bsOttBandsPhasePresent = +- (UCHAR)FDKreadBits(bitstream, 1); +- if (pSpatialSpecificConfig->bsOttBandsPhasePresent) { +- if (MAX_PARAMETER_BANDS < (pSpatialSpecificConfig->bsOttBandsPhase = +- FDKreadBits(bitstream, 5))) { +- return MPS_PARSE_ERROR; +- } +- } else { +- pSpatialSpecificConfig->bsOttBandsPhase = 0; +- } +- } +- +- if (stereoConfigIndex > 1) { /* do residual coding */ +- pSpatialSpecificConfig->bResidualCoding = 1; +- pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 1; +- if (pSpatialSpecificConfig->freqRes < +- (pSpatialSpecificConfig->ResidualConfig->nResidualBands = +- FDKreadBits(bitstream, 5))) { +- return MPS_PARSE_ERROR; +- } +- pSpatialSpecificConfig->bsOttBandsPhase = +- fMax(pSpatialSpecificConfig->bsOttBandsPhase, +- pSpatialSpecificConfig->ResidualConfig->nResidualBands); +- pSpatialSpecificConfig->bsPseudoLr = (UCHAR)FDKreadBits(bitstream, 1); +- +- if (pSpatialSpecificConfig->bsPhaseCoding) { +- pSpatialSpecificConfig->bsPhaseCoding = 3; +- } +- } else { +- pSpatialSpecificConfig->bResidualCoding = 0; +- pSpatialSpecificConfig->ResidualConfig->bResidualPresent = 0; +- } +- +- if (pSpatialSpecificConfig->tempShapeConfig == 2) { +- switch (coreCodec) { +- case AOT_USAC: +- pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1); +- break; +- default: /* added to avoid compiler warning */ +- break; /* added to avoid compiler warning */ +- } +- } +- +- /* Static parameters */ +- +- pSpatialSpecificConfig->samplingFreq = +- samplingRate; /* wrong for stereoConfigIndex == 3 but value is unused */ +- pSpatialSpecificConfig->treeConfig = SPATIALDEC_MODE_RSVD7; +- pSpatialSpecificConfig->nOttBoxes = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes; +- pSpatialSpecificConfig->nInputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels; +- pSpatialSpecificConfig->nOutputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels; +- +- pSpatialSpecificConfig->bArbitraryDownmix = 0; +- +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- pSpatialSpecificConfig->OttConfig[i].nOttBands = 0; +- } +- +- if (coreCodec == AOT_DRM_USAC) { +- /* MPS payload is MPEG conform -> no need for pseudo DRM AOT */ +- coreCodec = AOT_USAC; +- } +- pSpatialSpecificConfig->coreCodec = coreCodec; +- +- /* Derive additional helper variables */ +- SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL); +- +- return MPS_OK; +-} +- +-SACDEC_ERROR SpatialDecParseSpecificConfig( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen, +- AUDIO_OBJECT_TYPE coreCodec) { +- SACDEC_ERROR err = MPS_OK; +- int i; +- int bsSamplingFreqIndex; +- int bsFreqRes, b3DaudioMode = 0; +- int numHeaderBits; +- int cfgStartPos, bitsAvailable; +- +- FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG)); +- +- cfgStartPos = FDKgetValidBits(bitstream); +- /* It might be that we do not know the SSC length beforehand. */ +- if (sacHeaderLen == 0) { +- bitsAvailable = cfgStartPos; +- } else { +- bitsAvailable = 8 * sacHeaderLen; +- if (bitsAvailable > cfgStartPos) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- } +- +- bsSamplingFreqIndex = FDKreadBits(bitstream, 4); +- +- if (bsSamplingFreqIndex == 15) { +- pSpatialSpecificConfig->samplingFreq = FDKreadBits(bitstream, 24); +- } else { +- pSpatialSpecificConfig->samplingFreq = +- samplingFreqTable[bsSamplingFreqIndex]; +- if (pSpatialSpecificConfig->samplingFreq == 0) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- } +- +- pSpatialSpecificConfig->nTimeSlots = FDKreadBits(bitstream, 5) + 1; +- if ((pSpatialSpecificConfig->nTimeSlots < 1) || +- (pSpatialSpecificConfig->nTimeSlots > MAX_TIME_SLOTS)) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- +- bsFreqRes = FDKreadBits(bitstream, 3); +- +- pSpatialSpecificConfig->freqRes = +- (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes]; +- +- pSpatialSpecificConfig->treeConfig = +- (SPATIALDEC_TREE_CONFIG)FDKreadBits(bitstream, 4); +- +- if (pSpatialSpecificConfig->treeConfig != SPATIALDEC_MODE_RSVD7) { +- err = MPS_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- { +- pSpatialSpecificConfig->nOttBoxes = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes; +- pSpatialSpecificConfig->nTttBoxes = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numTttBoxes; +- pSpatialSpecificConfig->nInputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels; +- pSpatialSpecificConfig->nOutputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels; +- } +- +- pSpatialSpecificConfig->quantMode = +- (SPATIALDEC_QUANT_MODE)FDKreadBits(bitstream, 2); +- +- pSpatialSpecificConfig->bArbitraryDownmix = FDKreadBits(bitstream, 1); +- +- pSpatialSpecificConfig->bsFixedGainDMX = +- (SPATIALDEC_FIXED_GAINS)FDKreadBits(bitstream, 3); +- +- pSpatialSpecificConfig->tempShapeConfig = +- (SPATIALDEC_TS_CONF)FDKreadBits(bitstream, 2); +- if (pSpatialSpecificConfig->tempShapeConfig > 2) { +- return MPS_PARSE_ERROR; /* reserved value */ +- } +- +- pSpatialSpecificConfig->decorrConfig = +- (SPATIALDEC_DECORR_CONF)FDKreadBits(bitstream, 2); +- if (pSpatialSpecificConfig->decorrConfig > 2) { +- return MPS_PARSE_ERROR; /* reserved value */ +- } +- +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- pSpatialSpecificConfig->OttConfig[i].nOttBands = 0; +- } +- +- for (i = 0; i < pSpatialSpecificConfig->nTttBoxes; i++) { +- int bTttDualMode = FDKreadBits(bitstream, 1); +- FDKreadBits(bitstream, 3); /* not supported */ +- +- if (bTttDualMode) { +- FDKreadBits(bitstream, 8); /* not supported */ +- } +- } +- +- if (pSpatialSpecificConfig->tempShapeConfig == 2) { +- pSpatialSpecificConfig->envQuantMode = FDKreadBits(bitstream, 1); +- } +- +- if (b3DaudioMode) { +- if (FDKreadBits(bitstream, 2) == 0) { /* b3DaudioHRTFset ? */ +- int hc; +- int HRTFnumBand; +- int HRTFfreqRes = FDKreadBits(bitstream, 3); +- int HRTFnumChan = FDKreadBits(bitstream, 4); +- int HRTFasymmetric = FDKreadBits(bitstream, 1); +- +- HRTFnumBand = freqResTable_LD[HRTFfreqRes]; +- +- for (hc = 0; hc < HRTFnumChan; hc++) { +- FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFlevelLeft[hc][hb] */ +- if (HRTFasymmetric) { +- FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFlevelRight[hc][hb] */ +- } +- if (FDKreadBits(bitstream, 1)) { /* HRTFphase[hc] ? */ +- FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFphaseLR[hc][hb] */ +- } +- if (FDKreadBits(bitstream, 1)) { /* HRTFicc[hc] ? */ +- FDKpushFor(bitstream, HRTFnumBand * 6); /* HRTFiccLR[hc][hb] */ +- } +- } +- } +- } +- +- FDKbyteAlign(bitstream, +- cfgStartPos); /* ISO/IEC FDIS 23003-1: 5.2. ... byte alignment +- with respect to the beginning of the syntactic +- element in which ByteAlign() occurs. */ +- +- numHeaderBits = cfgStartPos - (INT)FDKgetValidBits(bitstream); +- bitsAvailable -= numHeaderBits; +- if (bitsAvailable < 0) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- +- pSpatialSpecificConfig->sacExtCnt = 0; +- pSpatialSpecificConfig->bResidualCoding = 0; +- +- err = SpatialDecParseExtensionConfig( +- bitstream, pSpatialSpecificConfig, pSpatialSpecificConfig->nOttBoxes, +- pSpatialSpecificConfig->nTttBoxes, +- pSpatialSpecificConfig->nOutputChannels, bitsAvailable); +- +- FDKbyteAlign( +- bitstream, +- cfgStartPos); /* Same alignment anchor as above because +- SpatialExtensionConfig() always reads full bytes */ +- +- pSpatialSpecificConfig->coreCodec = coreCodec; +- +- SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL); +- +-bail: +- if (sacHeaderLen > 0) { +- /* If the config is of known length then assure that the +- bitbuffer is exactly at its end when leaving the function. */ +- FDKpushBiDirectional( +- bitstream, +- (sacHeaderLen * 8) - (cfgStartPos - (INT)FDKgetValidBits(bitstream))); +- } +- +- return err; +-} +- +-int SpatialDecDefaultSpecificConfig( +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, int samplingFreq, int nTimeSlots, +- int sacDecoderLevel, int isBlind, int numCoreChannels) +- +-{ +- int err = MPS_OK; +- int i; +- +- FDK_ASSERT(coreCodec != AOT_NONE); +- FDK_ASSERT(nTimeSlots > 0); +- FDK_ASSERT(samplingFreq > 0); +- +- pSpatialSpecificConfig->coreCodec = coreCodec; +- pSpatialSpecificConfig->samplingFreq = samplingFreq; +- pSpatialSpecificConfig->nTimeSlots = nTimeSlots; +- if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) || +- (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD)) +- pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_23; +- else +- pSpatialSpecificConfig->freqRes = SPATIALDEC_FREQ_RES_28; +- +- { +- pSpatialSpecificConfig->treeConfig = +- SPATIALDEC_MODE_RSVD7; /* 212 configuration */ +- } +- +- { +- pSpatialSpecificConfig->nOttBoxes = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOttBoxes; +- pSpatialSpecificConfig->nInputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numInputChannels; +- pSpatialSpecificConfig->nOutputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig].numOutputChannels; +- } +- +- pSpatialSpecificConfig->quantMode = SPATIALDEC_QUANT_FINE_DEF; +- pSpatialSpecificConfig->bArbitraryDownmix = 0; +- pSpatialSpecificConfig->bResidualCoding = 0; +- if ((pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_ELD) || +- (pSpatialSpecificConfig->coreCodec == AOT_ER_AAC_LD)) +- pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_RSVD2; +- else +- pSpatialSpecificConfig->bsFixedGainDMX = SPATIALDEC_GAIN_MODE0; +- +- pSpatialSpecificConfig->tempShapeConfig = SPATIALDEC_TS_TPNOWHITE; +- pSpatialSpecificConfig->decorrConfig = SPATIALDEC_DECORR_MODE0; +- +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- pSpatialSpecificConfig->OttConfig[i].nOttBands = 0; +- } +- +- return err; +-} +- +-/******************************************************************************* +- Functionname: coarse2fine +- ******************************************************************************* +- +- Description: +- Parameter index mapping from coarse to fine quantization +- +- Arguments: +- +-Input: +- +-Output: +- +-*******************************************************************************/ +-static void coarse2fine(SCHAR *data, DATA_TYPE dataType, int startBand, +- int numBands) { +- int i; +- +- for (i = startBand; i < startBand + numBands; i++) { +- data[i] <<= 1; +- } +- +- if (dataType == t_CLD) { +- for (i = startBand; i < startBand + numBands; i++) { +- if (data[i] == -14) +- data[i] = -15; +- else if (data[i] == 14) +- data[i] = 15; +- } +- } +-} +- +-/******************************************************************************* +- Functionname: fine2coarse +- ******************************************************************************* +- +- Description: +- Parameter index mapping from fine to coarse quantization +- +- Arguments: +- +-Input: +- +-Output: +- +-*******************************************************************************/ +-static void fine2coarse(SCHAR *data, DATA_TYPE dataType, int startBand, +- int numBands) { +- int i; +- +- for (i = startBand; i < startBand + numBands; i++) { +- /* Note: the if cases below actually make a difference (negative values) */ +- if (dataType == t_CLD) +- data[i] /= 2; +- else +- data[i] >>= 1; +- } +-} +- +-/******************************************************************************* +- Functionname: getStrideMap +- ******************************************************************************* +- +- Description: +- Index Mapping accroding to pbStrides +- +- Arguments: +- +-Input: +- +-Output: +- +-*******************************************************************************/ +-static int getStrideMap(int freqResStride, int startBand, int stopBand, +- int *aStrides) { +- int i, pb, pbStride, dataBands, strOffset; +- +- pbStride = pbStrideTable[freqResStride]; +- dataBands = (stopBand - startBand - 1) / pbStride + 1; +- +- aStrides[0] = startBand; +- for (pb = 1; pb <= dataBands; pb++) { +- aStrides[pb] = aStrides[pb - 1] + pbStride; +- } +- strOffset = 0; +- while (aStrides[dataBands] > stopBand) { +- if (strOffset < dataBands) strOffset++; +- for (i = strOffset; i <= dataBands; i++) { +- aStrides[i]--; +- } +- } +- +- return dataBands; +-} +- +-/******************************************************************************* +- Functionname: ecDataDec +- ******************************************************************************* +- +- Description: +- Do delta decoding and dequantization +- +- Arguments: +- +-Input: +- +-Output: +- +- +-*******************************************************************************/ +- +-static SACDEC_ERROR ecDataDec( +- const SPATIAL_BS_FRAME *frame, UINT syntaxFlags, +- HANDLE_FDK_BITSTREAM bitstream, LOSSLESSDATA *const llData, +- SCHAR (*data)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], SCHAR **lastdata, +- int datatype, int boxIdx, int startBand, int stopBand, SCHAR defaultValue) { +- SACDEC_ERROR err = MPS_OK; +- int i, j, pb, dataSets, setIdx, bsDataPair, dataBands, oldQuantCoarseXXX; +- INT aStrides[MAX_PARAMETER_BANDS + 1] = {0}; +- +- dataSets = 0; +- for (i = 0; i < frame->numParameterSets; i++) { +- llData->bsXXXDataMode[i] = (SCHAR)FDKreadBits(bitstream, 2); +- +- if ((frame->bsIndependencyFlag == 1) && (i == 0) && +- (llData->bsXXXDataMode[i] == 1 || +- llData->bsXXXDataMode[i] == 2)) { /* This check catches bitstreams +- generated by older encoder that +- cause trouble */ +- return MPS_PARSE_ERROR; +- } +- if ((i >= frame->numParameterSets - 1) && +- (llData->bsXXXDataMode[i] == +- 2)) { /* The interpolation mode must not be active for the last +- parameter set */ +- return MPS_PARSE_ERROR; +- } +- +- if (llData->bsXXXDataMode[i] == 3) { +- dataSets++; +- } +- } +- +- setIdx = 0; +- bsDataPair = 0; +- oldQuantCoarseXXX = llData->state->bsQuantCoarseXXXprevParse; +- +- for (i = 0; i < frame->numParameterSets; i++) { +- if (llData->bsXXXDataMode[i] == 0) { +- for (pb = startBand; pb < stopBand; pb++) { +- lastdata[boxIdx][pb] = defaultValue; +- } +- +- oldQuantCoarseXXX = 0; +- } +- +- if (llData->bsXXXDataMode[i] == 3) { +- if (bsDataPair) { +- bsDataPair = 0; +- } else { +- bsDataPair = FDKreadBits(bitstream, 1); +- llData->bsQuantCoarseXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 1); +- llData->bsFreqResStrideXXX[setIdx] = (UCHAR)FDKreadBits(bitstream, 2); +- +- if (llData->bsQuantCoarseXXX[setIdx] != oldQuantCoarseXXX) { +- if (oldQuantCoarseXXX) { +- coarse2fine(lastdata[boxIdx], (DATA_TYPE)datatype, startBand, +- stopBand - startBand); +- } else { +- fine2coarse(lastdata[boxIdx], (DATA_TYPE)datatype, startBand, +- stopBand - startBand); +- } +- } +- +- dataBands = getStrideMap(llData->bsFreqResStrideXXX[setIdx], startBand, +- stopBand, aStrides); +- +- for (pb = 0; pb < dataBands; pb++) { +- lastdata[boxIdx][startBand + pb] = lastdata[boxIdx][aStrides[pb]]; +- } +- +- if (boxIdx > MAX_NUM_OTT) return MPS_INVALID_BOXIDX; +- if ((setIdx + bsDataPair) > MAX_PARAMETER_SETS) +- return MPS_INVALID_SETIDX; +- +- /* DECODER_TYPE defined in FDK_tools */ +- DECODER_TYPE this_decoder_type = SAC_DECODER; +- if (syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) { +- this_decoder_type = USAC_DECODER; +- } else if (syntaxFlags & SACDEC_SYNTAX_LD) { +- this_decoder_type = SAOC_DECODER; +- } +- +- err = (SACDEC_ERROR)EcDataPairDec( +- this_decoder_type, bitstream, data[boxIdx][setIdx + 0], +- data[boxIdx][setIdx + 1], lastdata[boxIdx], (DATA_TYPE)datatype, +- startBand, dataBands, bsDataPair, llData->bsQuantCoarseXXX[setIdx], +- !(frame->bsIndependencyFlag && (i == 0)) || (setIdx > 0)); +- if (err != MPS_OK) goto bail; +- +- if (datatype == t_IPD) { +- const SCHAR mask = (llData->bsQuantCoarseXXX[setIdx]) ? 7 : 15; +- for (pb = 0; pb < dataBands; pb++) { +- for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) { +- lastdata[boxIdx][j] = +- data[boxIdx][setIdx + bsDataPair][startBand + pb] & mask; +- } +- } +- } else { +- for (pb = 0; pb < dataBands; pb++) { +- for (j = aStrides[pb]; j < aStrides[pb + 1]; j++) { +- lastdata[boxIdx][j] = +- data[boxIdx][setIdx + bsDataPair][startBand + pb]; +- } +- } +- } +- +- oldQuantCoarseXXX = llData->bsQuantCoarseXXX[setIdx]; +- +- if (bsDataPair) { +- llData->bsQuantCoarseXXX[setIdx + 1] = +- llData->bsQuantCoarseXXX[setIdx]; +- llData->bsFreqResStrideXXX[setIdx + 1] = +- llData->bsFreqResStrideXXX[setIdx]; +- } +- setIdx += bsDataPair + 1; +- } /* !bsDataPair */ +- } /* llData->bsXXXDataMode[i] == 3 */ +- } +- +- llData->state->bsQuantCoarseXXXprevParse = oldQuantCoarseXXX; +- +-bail: +- return err; +-} +- +-/******************************************************************************* +- Functionname: parseArbitraryDownmixData +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static SACDEC_ERROR parseArbitraryDownmixData( +- spatialDec *self, const SPATIAL_SPECIFIC_CONFIG *pSSC, +- const UINT syntaxFlags, const SPATIAL_BS_FRAME *frame, +- HANDLE_FDK_BITSTREAM bitstream) { +- SACDEC_ERROR err = MPS_OK; +- int ch; +- int offset = pSSC->nOttBoxes; +- +- /* CLD (arbitrary down-mix gains) */ +- for (ch = 0; ch < pSSC->nInputChannels; ch++) { +- err = ecDataDec(frame, syntaxFlags, bitstream, +- &frame->CLDLosslessData[offset + ch], +- frame->cmpArbdmxGainIdx, self->cmpArbdmxGainIdxPrev, t_CLD, +- ch, 0, pSSC->freqRes, arbdmxGainDefault); +- if (err != MPS_OK) return err; +- } +- +- return err; +- +-} /* parseArbitraryDownmixData */ +- +-/******************************************************************************* +- Functionname: SpatialDecParseFrame +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- +- Output: +- +-*******************************************************************************/ +- +-static int nBitsParamSlot(int i) { +- int bitsParamSlot; +- +- bitsParamSlot = fMax(0, DFRACT_BITS - 1 - fNormz((FIXP_DBL)i)); +- if ((1 << bitsParamSlot) < i) { +- bitsParamSlot++; +- } +- FDK_ASSERT((bitsParamSlot >= 0) && (bitsParamSlot <= 32)); +- +- return bitsParamSlot; +-} +- +-SACDEC_ERROR SpatialDecParseFrameData( +- spatialDec_struct *self, SPATIAL_BS_FRAME *frame, +- HANDLE_FDK_BITSTREAM bitstream, +- const SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType, +- int fGlobalIndependencyFlag) { +- SACDEC_ERROR err = MPS_OK; +- int bsFramingType, dataBands, ps, pg, i; +- int pb; +- int numTempShapeChan = 0; +- int bsNumOutputChannels = +- treePropertyTable[pSpatialSpecificConfig->treeConfig] +- .numOutputChannels; /* CAUTION: Maybe different to +- pSpatialSpecificConfig->treeConfig in some +- modes! */ +- int paramSetErr = 0; +- UINT alignAnchor = FDKgetValidBits( +- bitstream); /* Anchor for ByteAlign() function. See comment below. */ +- UINT syntaxFlags; +- +- syntaxFlags = pSpatialSpecificConfig->syntaxFlags; +- +- if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) && +- pSpatialSpecificConfig->bsHighRateMode == 0) { +- bsFramingType = 0; /* fixed framing */ +- frame->numParameterSets = 1; +- } else { +- bsFramingType = FDKreadBits(bitstream, 1); +- if (syntaxFlags & SACDEC_SYNTAX_LD) +- frame->numParameterSets = FDKreadBits(bitstream, 1) + 1; +- else +- frame->numParameterSets = FDKreadBits(bitstream, 3) + 1; +- } +- +- /* Any error after this line shall trigger parameter invalidation at bail +- * label. */ +- paramSetErr = 1; +- +- if (frame->numParameterSets >= MAX_PARAMETER_SETS) { +- goto bail; +- } +- +- /* Basic config check. */ +- if (pSpatialSpecificConfig->nInputChannels <= 0 || +- pSpatialSpecificConfig->nOutputChannels <= 0) { +- err = MPS_UNSUPPORTED_CONFIG; +- goto bail; +- } +- +- if (bsFramingType) { +- int prevParamSlot = -1; +- int bitsParamSlot; +- +- { +- bitsParamSlot = nBitsParamSlot(pSpatialSpecificConfig->nTimeSlots); +- +- for (i = 0; i < frame->numParameterSets; i++) { +- frame->paramSlot[i] = FDKreadBits(bitstream, bitsParamSlot); +- /* Sanity check */ +- if ((frame->paramSlot[i] <= prevParamSlot) || +- (frame->paramSlot[i] >= pSpatialSpecificConfig->nTimeSlots)) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- prevParamSlot = frame->paramSlot[i]; +- } +- } +- } else { +- for (i = 0; i < frame->numParameterSets; i++) { +- frame->paramSlot[i] = ((pSpatialSpecificConfig->nTimeSlots * (i + 1)) / +- frame->numParameterSets) - +- 1; +- } +- } +- +- if ((syntaxFlags & (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) && +- fGlobalIndependencyFlag) { +- frame->bsIndependencyFlag = 1; +- } else { +- frame->bsIndependencyFlag = (UCHAR)FDKreadBits(bitstream, 1); +- } +- +- /* +- * OttData() +- */ +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- err = ecDataDec(frame, syntaxFlags, bitstream, &frame->CLDLosslessData[i], +- frame->cmpOttCLDidx, self->cmpOttCLDidxPrev, t_CLD, i, 0, +- pSpatialSpecificConfig->bitstreamOttBands[i], +- pSpatialSpecificConfig->ottCLDdefault[i]); +- if (err != MPS_OK) { +- goto bail; +- } +- } /* i < numOttBoxes */ +- +- { +- for (i = 0; i < pSpatialSpecificConfig->nOttBoxes; i++) { +- err = ecDataDec(frame, syntaxFlags, bitstream, &frame->ICCLosslessData[i], +- frame->cmpOttICCidx, self->cmpOttICCidxPrev, t_ICC, i, 0, +- pSpatialSpecificConfig->bitstreamOttBands[i], ICCdefault); +- if (err != MPS_OK) { +- goto bail; +- } +- } /* i < numOttBoxes */ +- } /* !oneICC */ +- +- if ((pSpatialSpecificConfig->treeConfig == SPATIALDEC_MODE_RSVD7) && +- (pSpatialSpecificConfig->bsPhaseCoding)) { +- frame->phaseMode = FDKreadBits(bitstream, 1); +- +- if (frame->phaseMode == 0) { +- for (pb = 0; pb < pSpatialSpecificConfig->numOttBandsIPD; pb++) { +- self->cmpOttIPDidxPrev[0][pb] = 0; +- for (i = 0; i < frame->numParameterSets; i++) { +- frame->cmpOttIPDidx[0][i][pb] = 0; +- // frame->ottIPDidx[0][i][pb] = 0; +- } +- /* self->ottIPDidxPrev[0][pb] = 0; */ +- } +- frame->OpdSmoothingMode = 0; +- } else { +- frame->OpdSmoothingMode = FDKreadBits(bitstream, 1); +- err = ecDataDec(frame, syntaxFlags, bitstream, &frame->IPDLosslessData[0], +- frame->cmpOttIPDidx, self->cmpOttIPDidxPrev, t_IPD, 0, 0, +- pSpatialSpecificConfig->numOttBandsIPD, IPDdefault); +- if (err != MPS_OK) { +- goto bail; +- } +- } +- } +- +- /* +- * SmgData() +- */ +- +- { +- if (!pSpatialSpecificConfig->bsHighRateMode && +- (syntaxFlags & SACDEC_SYNTAX_USAC)) { +- for (ps = 0; ps < frame->numParameterSets; ps++) { +- frame->bsSmoothMode[ps] = 0; +- } +- } else { +- for (ps = 0; ps < frame->numParameterSets; ps++) { +- frame->bsSmoothMode[ps] = (UCHAR)FDKreadBits(bitstream, 2); +- if (frame->bsSmoothMode[ps] >= 2) { +- frame->bsSmoothTime[ps] = (UCHAR)FDKreadBits(bitstream, 2); +- } +- if (frame->bsSmoothMode[ps] == 3) { +- frame->bsFreqResStrideSmg[ps] = (UCHAR)FDKreadBits(bitstream, 2); +- dataBands = (pSpatialSpecificConfig->freqRes - 1) / +- pbStrideTable[frame->bsFreqResStrideSmg[ps]] + +- 1; +- for (pg = 0; pg < dataBands; pg++) { +- frame->bsSmgData[ps][pg] = (UCHAR)FDKreadBits(bitstream, 1); +- } +- } +- } /* ps < numParameterSets */ +- } +- } +- +- /* +- * TempShapeData() +- */ +- if ((pSpatialSpecificConfig->tempShapeConfig == 3) && +- (syntaxFlags & SACDEC_SYNTAX_USAC)) { +- int TsdErr; +- TsdErr = TsdRead(bitstream, pSpatialSpecificConfig->nTimeSlots, +- &frame->TsdData[0]); +- if (TsdErr) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- } else { +- frame->TsdData[0].bsTsdEnable = 0; +- } +- +- for (i = 0; i < bsNumOutputChannels; i++) { +- frame->tempShapeEnableChannelSTP[i] = 0; +- frame->tempShapeEnableChannelGES[i] = 0; +- } +- +- if ((pSpatialSpecificConfig->tempShapeConfig == 1) || +- (pSpatialSpecificConfig->tempShapeConfig == 2)) { +- int bsTempShapeEnable = FDKreadBits(bitstream, 1); +- if (bsTempShapeEnable) { +- numTempShapeChan = +- tempShapeChanTable[pSpatialSpecificConfig->tempShapeConfig - 1] +- [pSpatialSpecificConfig->treeConfig]; +- switch (pSpatialSpecificConfig->tempShapeConfig) { +- case 1: /* STP */ +- for (i = 0; i < numTempShapeChan; i++) { +- int stpEnable = FDKreadBits(bitstream, 1); +- frame->tempShapeEnableChannelSTP[i] = stpEnable; +- } +- break; +- case 2: /* GES */ +- { +- UCHAR gesChannelEnable[MAX_OUTPUT_CHANNELS]; +- +- for (i = 0; i < numTempShapeChan; i++) { +- gesChannelEnable[i] = (UCHAR)FDKreadBits(bitstream, 1); +- frame->tempShapeEnableChannelGES[i] = gesChannelEnable[i]; +- } +- for (i = 0; i < numTempShapeChan; i++) { +- if (gesChannelEnable[i]) { +- int envShapeData_tmp[MAX_TIME_SLOTS]; +- if (huff_dec_reshape(bitstream, envShapeData_tmp, +- pSpatialSpecificConfig->nTimeSlots) != 0) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- for (int ts = 0; ts < pSpatialSpecificConfig->nTimeSlots; ts++) { +- if (!(envShapeData_tmp[ts] >= 0) && +- (envShapeData_tmp[ts] <= 4)) { +- err = MPS_PARSE_ERROR; +- goto bail; +- } +- frame->bsEnvShapeData[i][ts] = (UCHAR)envShapeData_tmp[ts]; +- } +- } +- } +- } break; +- default: +- err = MPS_INVALID_TEMPSHAPE; +- goto bail; +- } +- } /* bsTempShapeEnable */ +- } /* pSpatialSpecificConfig->tempShapeConfig != 0 */ +- +- if (pSpatialSpecificConfig->bArbitraryDownmix != 0) { +- err = parseArbitraryDownmixData(self, pSpatialSpecificConfig, syntaxFlags, +- frame, bitstream); +- if (err != MPS_OK) goto bail; +- } +- +- if (1 && (!(syntaxFlags & (SACDEC_SYNTAX_USAC)))) { +- FDKbyteAlign(bitstream, +- alignAnchor); /* ISO/IEC FDIS 23003-1: 5.2. ... byte alignment +- with respect to the beginning of the syntactic +- element in which ByteAlign() occurs. */ +- } +- +-bail: +- if (err != MPS_OK && paramSetErr != 0) { +- /* Since the parameter set data has already been written to the instance we +- * need to ... */ +- frame->numParameterSets = 0; /* ... signal that it is corrupt ... */ +- } +- +- return err; +- +-} /* SpatialDecParseFrame */ +- +-/******************************************************************************* +- Functionname: createMapping +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void createMapping(int aMap[MAX_PARAMETER_BANDS + 1], int startBand, +- int stopBand, int stride) { +- int inBands, outBands, bandsAchived, bandsDiff, incr, k, i; +- int vDk[MAX_PARAMETER_BANDS + 1]; +- inBands = stopBand - startBand; +- outBands = (inBands - 1) / stride + 1; +- +- if (outBands < 1) { +- outBands = 1; +- } +- +- bandsAchived = outBands * stride; +- bandsDiff = inBands - bandsAchived; +- for (i = 0; i < outBands; i++) { +- vDk[i] = stride; +- } +- +- if (bandsDiff > 0) { +- incr = -1; +- k = outBands - 1; +- } else { +- incr = 1; +- k = 0; +- } +- +- while (bandsDiff != 0) { +- vDk[k] = vDk[k] - incr; +- k = k + incr; +- bandsDiff = bandsDiff + incr; +- if (k >= outBands) { +- if (bandsDiff > 0) { +- k = outBands - 1; +- } else if (bandsDiff < 0) { +- k = 0; +- } +- } +- } +- aMap[0] = startBand; +- for (i = 0; i < outBands; i++) { +- aMap[i + 1] = aMap[i] + vDk[i]; +- } +-} /* createMapping */ +- +-/******************************************************************************* +- Functionname: mapFrequency +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void mapFrequency(const SCHAR *pInput, /* Input */ +- SCHAR *pOutput, /* Output */ +- int *pMap, /* Mapping function */ +- int dataBands) /* Number of data Bands */ +-{ +- int i, j; +- int startBand0 = pMap[0]; +- +- for (i = 0; i < dataBands; i++) { +- int startBand, stopBand, value; +- +- value = pInput[i + startBand0]; +- +- startBand = pMap[i]; +- stopBand = pMap[i + 1]; +- for (j = startBand; j < stopBand; j++) { +- pOutput[j] = value; +- } +- } +-} +- +-/******************************************************************************* +- Functionname: deq +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static int deqIdx(int value, int paramType) { +- int idx = -1; +- +- switch (paramType) { +- case t_CLD: +- if (((value + 15) >= 0) && ((value + 15) < 31)) { +- idx = (value + 15); +- } +- break; +- +- case t_ICC: +- if ((value >= 0) && (value < 8)) { +- idx = value; +- } +- break; +- +- case t_IPD: +- /* (+/-)15 * MAX_PARAMETER_BANDS for differential coding in frequency +- * domain (according to rbl) */ +- if ((value >= -420) && (value <= 420)) { +- idx = (value & 0xf); +- } +- break; +- +- default: +- FDK_ASSERT(0); +- } +- +- return idx; +-} +- +- /******************************************************************************* +- Functionname: factorFunct +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +- *******************************************************************************/ +- +-#define SF_IDX (7) +-#define SF_FACTOR (3) +-#define SCALE_FACTOR (1 << SF_FACTOR) +-#define SCALE_CLD_C1C2 (1 << SF_CLD_C1C2) +- +-static FIXP_DBL factorFunct(FIXP_DBL ottVsTotDb, INT quantMode) { +- FIXP_DBL factor; +- +- if (ottVsTotDb > FL2FXCONST_DBL(0.0)) { +- ottVsTotDb = FL2FXCONST_DBL(0.0); +- } +- +- ottVsTotDb = -ottVsTotDb; +- +- switch (quantMode) { +- case 0: +- factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR); +- break; +- case 1: +- if (ottVsTotDb >= FL2FXCONST_DBL(21.0f / SCALE_CLD_C1C2)) +- factor = FL2FXCONST_DBL(5.0f / SCALE_FACTOR); +- else if (ottVsTotDb <= FL2FXCONST_DBL(1.0f / SCALE_CLD_C1C2)) +- factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR); +- else +- factor = (fMult(FL2FXCONST_DBL(0.2f), ottVsTotDb) + +- FL2FXCONST_DBL(0.8f / SCALE_CLD_C1C2)) +- << (SF_CLD_C1C2 - SF_FACTOR); +- break; +- case 2: +- if (ottVsTotDb >= FL2FXCONST_DBL(25.0f / SCALE_CLD_C1C2)) { +- FDK_ASSERT(SF_FACTOR == 3); +- factor = (FIXP_DBL) +- MAXVAL_DBL; /* avoid warning: FL2FXCONST_DBL(8.0f/SCALE_FACTOR) */ +- } else if (ottVsTotDb <= FL2FXCONST_DBL(1.0f / SCALE_CLD_C1C2)) +- factor = FL2FXCONST_DBL(1.0f / SCALE_FACTOR); +- else +- factor = (fMult(FL2FXCONST_DBL(7.0f / 24.0f), ottVsTotDb) + +- FL2FXCONST_DBL((17.0f / 24.0f) / SCALE_CLD_C1C2)) +- << (SF_CLD_C1C2 - SF_FACTOR); +- break; +- default: +- factor = FL2FXCONST_DBL(0.0f); +- } +- +- return (factor); +-} +- +-/******************************************************************************* +- Functionname: factorCLD +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void factorCLD(SCHAR *idx, FIXP_DBL ottVsTotDb, FIXP_DBL *ottVsTotDb1, +- FIXP_DBL *ottVsTotDb2, SCHAR ottVsTotDbMode, +- INT quantMode) { +- FIXP_DBL factor; +- FIXP_DBL cldIdxFract; +- INT cldIdx; +- +- factor = factorFunct(ottVsTotDb, quantMode); +- +- cldIdxFract = +- fMult((FIXP_DBL)((*idx) << ((DFRACT_BITS - 1) - SF_IDX)), factor); +- cldIdxFract += FL2FXCONST_DBL(15.5f / (1 << (SF_FACTOR + SF_IDX))); +- cldIdx = fixp_truncateToInt(cldIdxFract, SF_FACTOR + SF_IDX); +- +- cldIdx = fMin(cldIdx, 30); +- cldIdx = fMax(cldIdx, 0); +- +- *idx = cldIdx - 15; +- +- if (ottVsTotDbMode & ottVsTotDb1Activ) +- (*ottVsTotDb1) = ottVsTotDb + dequantCLD_c1[cldIdx]; +- +- if (ottVsTotDbMode & ottVsTotDb2Activ) +- (*ottVsTotDb2) = ottVsTotDb + dequantCLD_c1[30 - cldIdx]; +-} +- +-/******************************************************************************* +- Functionname: mapIndexData +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static SACDEC_ERROR mapIndexData( +- LOSSLESSDATA *llData, SCHAR ***outputDataIdx, SCHAR ***outputIdxData, +- const SCHAR (*cmpIdxData)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], +- SCHAR ***diffIdxData, SCHAR xttIdx, SCHAR **idxPrev, int paramIdx, +- int paramType, int startBand, int stopBand, SCHAR defaultValue, +- int numParameterSets, const int *paramSlot, int extendFrame, int quantMode, +- SpatialDecConcealmentInfo *concealmentInfo, SCHAR ottVsTotDbMode, +- FIXP_DBL (*pOttVsTotDbIn)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], +- FIXP_DBL (*pOttVsTotDb1)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], +- FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) { +- int aParamSlots[MAX_PARAMETER_SETS]; +- int aInterpolate[MAX_PARAMETER_SETS]; +- +- int dataSets; +- int aMap[MAX_PARAMETER_BANDS + 1]; +- +- int setIdx, i, band, parmSlot; +- int dataBands; +- int ps, pb; +- int i1; +- +- if (numParameterSets > MAX_PARAMETER_SETS) return MPS_WRONG_PARAMETERSETS; +- +- dataSets = 0; +- for (i = 0; i < numParameterSets; i++) { +- if (llData->bsXXXDataMode[i] == 3) { +- aParamSlots[dataSets] = i; +- dataSets++; +- } +- } +- +- setIdx = 0; +- +- /* Main concealment stage is here: */ +- SpatialDecConcealment_Apply( +- concealmentInfo, cmpIdxData[xttIdx], +- (diffIdxData != NULL) ? diffIdxData[xttIdx] : NULL, idxPrev[xttIdx], +- llData->bsXXXDataMode, startBand, stopBand, defaultValue, paramType, +- numParameterSets); +- +- /* Prepare data */ +- for (i = 0; i < numParameterSets; i++) { +- if (llData->bsXXXDataMode[i] == 0) { +- llData->nocmpQuantCoarseXXX[i] = 0; +- for (band = startBand; band < stopBand; band++) { +- outputIdxData[xttIdx][i][band] = defaultValue; +- } +- for (band = startBand; band < stopBand; band++) { +- idxPrev[xttIdx][band] = outputIdxData[xttIdx][i][band]; +- } +- /* Because the idxPrev are also set to the defaultValue -> signalize fine +- */ +- llData->state->bsQuantCoarseXXXprev = 0; +- } +- +- if (llData->bsXXXDataMode[i] == 1) { +- for (band = startBand; band < stopBand; band++) { +- outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band]; +- } +- llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev; +- } +- +- if (llData->bsXXXDataMode[i] == 2) { +- for (band = startBand; band < stopBand; band++) { +- outputIdxData[xttIdx][i][band] = idxPrev[xttIdx][band]; +- } +- llData->nocmpQuantCoarseXXX[i] = llData->state->bsQuantCoarseXXXprev; +- aInterpolate[i] = 1; +- } else { +- aInterpolate[i] = 0; +- } +- +- if (llData->bsXXXDataMode[i] == 3) { +- int stride; +- +- parmSlot = aParamSlots[setIdx]; +- stride = pbStrideTable[llData->bsFreqResStrideXXX[setIdx]]; +- dataBands = (stopBand - startBand - 1) / stride + 1; +- createMapping(aMap, startBand, stopBand, stride); +- mapFrequency(&cmpIdxData[xttIdx][setIdx][0], +- &outputIdxData[xttIdx][parmSlot][0], aMap, dataBands); +- for (band = startBand; band < stopBand; band++) { +- idxPrev[xttIdx][band] = outputIdxData[xttIdx][parmSlot][band]; +- } +- llData->state->bsQuantCoarseXXXprev = llData->bsQuantCoarseXXX[setIdx]; +- llData->nocmpQuantCoarseXXX[i] = llData->bsQuantCoarseXXX[setIdx]; +- +- setIdx++; +- } +- if (diffIdxData != NULL) { +- for (band = startBand; band < stopBand; band++) { +- outputIdxData[xttIdx][i][band] += diffIdxData[xttIdx][i][band]; +- } +- } +- } /* for( i = 0 ; i < numParameterSets; i++ ) */ +- +- /* Map all coarse data to fine */ +- for (i = 0; i < numParameterSets; i++) { +- if (llData->nocmpQuantCoarseXXX[i] == 1) { +- coarse2fine(outputIdxData[xttIdx][i], (DATA_TYPE)paramType, startBand, +- stopBand - startBand); +- llData->nocmpQuantCoarseXXX[i] = 0; +- } +- } +- +- /* Interpolate */ +- i1 = 0; +- for (i = 0; i < numParameterSets; i++) { +- int xi, i2, x1, x2; +- +- if (aInterpolate[i] != 1) { +- i1 = i; +- } +- i2 = i; +- while (aInterpolate[i2] == 1) { +- i2++; +- } +- x1 = paramSlot[i1]; +- xi = paramSlot[i]; +- x2 = paramSlot[i2]; +- +- if (aInterpolate[i] == 1) { +- if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS; +- for (band = startBand; band < stopBand; band++) { +- int yi, y1, y2; +- y1 = outputIdxData[xttIdx][i1][band]; +- y2 = outputIdxData[xttIdx][i2][band]; +- if (x1 != x2) { +- yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); +- } else { +- yi = y1 /*+ (xi-x1)*(y2-y1)/1e-12*/; +- } +- outputIdxData[xttIdx][i][band] = yi; +- } +- } +- } /* for( i = 0 ; i < numParameterSets; i++ ) */ +- +- /* Dequantize data and apply factorCLD if necessary */ +- for (ps = 0; ps < numParameterSets; ps++) { +- if (quantMode && (paramType == t_CLD)) { +- if (pOttVsTotDbIn == 0) return MPS_WRONG_OTT; +- if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode == ottVsTotDb1Activ)) +- return MPS_WRONG_OTT; +- if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode == ottVsTotDb2Activ)) +- return MPS_WRONG_OTT; +- +- for (pb = startBand; pb < stopBand; pb++) { +- factorCLD(&(outputIdxData[xttIdx][ps][pb]), (*pOttVsTotDbIn)[ps][pb], +- (pOttVsTotDb1 != NULL) ? &((*pOttVsTotDb1)[ps][pb]) : NULL, +- (pOttVsTotDb2 != NULL) ? &((*pOttVsTotDb2)[ps][pb]) : NULL, +- ottVsTotDbMode, quantMode); +- } +- } +- +- /* Dequantize data */ +- for (band = startBand; band < stopBand; band++) { +- outputDataIdx[xttIdx][ps][band] = +- deqIdx(outputIdxData[xttIdx][ps][band], paramType); +- if (outputDataIdx[xttIdx][ps][band] == -1) { +- outputDataIdx[xttIdx][ps][band] = defaultValue; +- } +- } +- } /* for( i = 0 ; i < numParameterSets; i++ ) */ +- +- if (extendFrame) { +- for (band = startBand; band < stopBand; band++) { +- outputDataIdx[xttIdx][numParameterSets][band] = +- outputDataIdx[xttIdx][numParameterSets - 1][band]; +- } +- } +- +- return MPS_OK; +-} +- +-/******************************************************************************* +- Functionname: decodeAndMapFrameOtt +- ******************************************************************************* +- +- Description: +- Do delta decoding and dequantization +- +- Arguments: +- +-Input: +- +-Output: +- +-*******************************************************************************/ +-static SACDEC_ERROR decodeAndMapFrameOtt(HANDLE_SPATIAL_DEC self, +- SPATIAL_BS_FRAME *pCurBs) { +- int i, ottIdx; +- int numOttBoxes; +- +- SACDEC_ERROR err = MPS_OK; +- +- numOttBoxes = self->numOttBoxes; +- +- switch (self->treeConfig) { +- default: { +- if (self->quantMode != 0) { +- goto bail; +- } +- } +- for (i = 0; i < numOttBoxes; i++) { +- err = mapIndexData( +- &pCurBs->CLDLosslessData[i], /* LOSSLESSDATA *llData,*/ +- self->ottCLD__FDK, self->outIdxData, +- pCurBs +- ->cmpOttCLDidx, /* int +- cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], +- */ +- NULL, /* no differential data */ +- i, /* int xttIdx, Which ott/ttt index to use for input and +- output buffers */ +- self->ottCLDidxPrev, /* int +- idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS], +- */ +- i, t_CLD, 0, /* int startBand, */ +- self->pConfigCurrent->bitstreamOttBands[i], /* int stopBand, */ +- self->pConfigCurrent->ottCLDdefault[i], /* int defaultValue, */ +- pCurBs->numParameterSets, /* int numParameterSets) */ +- pCurBs->paramSlot, self->extendFrame, self->quantMode, +- &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL); +- if (err != MPS_OK) goto bail; +- +- } /* for(i = 0; i < numOttBoxes ; i++ ) */ +- break; +- } /* case */ +- +- for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) { +- /* Read ICC */ +- err = mapIndexData( +- &pCurBs->ICCLosslessData[ottIdx], /* LOSSLESSDATA *llData,*/ +- self->ottICC__FDK, self->outIdxData, +- pCurBs +- ->cmpOttICCidx, /* int +- cmpIdxData[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], +- */ +- self->ottICCdiffidx, /* differential data */ +- ottIdx, /* int xttIdx, Which ott/ttt index to use for input and +- output buffers */ +- self->ottICCidxPrev, /* int idxPrev[MAX_NUM_OTT][MAX_PARAMETER_BANDS], +- */ +- ottIdx, t_ICC, 0, /* int startBand, */ +- self->pConfigCurrent->bitstreamOttBands[ottIdx], /* int stopBand, */ +- ICCdefault, /* int defaultValue, */ +- pCurBs->numParameterSets, /* int numParameterSets) */ +- pCurBs->paramSlot, self->extendFrame, self->quantMode, +- &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL); +- if (err != MPS_OK) goto bail; +- } /* ottIdx */ +- +- if ((self->treeConfig == TREE_212) && (self->phaseCoding)) { +- if (pCurBs->phaseMode == 0) { +- for (int pb = 0; pb < self->pConfigCurrent->numOttBandsIPD; pb++) { +- self->ottIPDidxPrev[0][pb] = 0; +- } +- } +- for (ottIdx = 0; ottIdx < numOttBoxes; ottIdx++) { +- err = mapIndexData( +- &pCurBs->IPDLosslessData[ottIdx], self->ottIPD__FDK, self->outIdxData, +- pCurBs->cmpOttIPDidx, NULL, ottIdx, self->ottIPDidxPrev, ottIdx, +- t_IPD, 0, self->numOttBandsIPD, IPDdefault, pCurBs->numParameterSets, +- pCurBs->paramSlot, self->extendFrame, self->quantMode, +- &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL); +- } +- } +- +-bail: +- +- return MPS_OK; +- +-} /* decodeAndMapFrameOtt */ +- +-/******************************************************************************* +- Functionname: decodeAndMapFrameSmg +- ******************************************************************************* +- +- Description: +- Decode smoothing flags +- +- Arguments: +- +-Input: +- +-Output: +- +- +-*******************************************************************************/ +-static SACDEC_ERROR decodeAndMapFrameSmg(HANDLE_SPATIAL_DEC self, +- const SPATIAL_BS_FRAME *frame) { +- int ps, pb, pg, pbStride, dataBands, pbStart, pbStop, +- aGroupToBand[MAX_PARAMETER_BANDS + 1]; +- +- if (frame->numParameterSets > MAX_PARAMETER_SETS) +- return MPS_WRONG_PARAMETERSETS; +- if (self->bitstreamParameterBands > MAX_PARAMETER_BANDS) +- return MPS_WRONG_PARAMETERBANDS; +- +- for (ps = 0; ps < frame->numParameterSets; ps++) { +- switch (frame->bsSmoothMode[ps]) { +- case 0: +- self->smgTime[ps] = 256; +- FDKmemclear(self->smgData[ps], +- self->bitstreamParameterBands * sizeof(UCHAR)); +- break; +- +- case 1: +- if (ps > 0) { +- self->smgTime[ps] = self->smgTime[ps - 1]; +- FDKmemcpy(self->smgData[ps], self->smgData[ps - 1], +- self->bitstreamParameterBands * sizeof(UCHAR)); +- } else { +- self->smgTime[ps] = self->smoothState->prevSmgTime; +- FDKmemcpy(self->smgData[ps], self->smoothState->prevSmgData, +- self->bitstreamParameterBands * sizeof(UCHAR)); +- } +- break; +- +- case 2: +- self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]]; +- for (pb = 0; pb < self->bitstreamParameterBands; pb++) { +- self->smgData[ps][pb] = 1; +- } +- break; +- +- case 3: +- self->smgTime[ps] = smgTimeTable[frame->bsSmoothTime[ps]]; +- pbStride = pbStrideTable[frame->bsFreqResStrideSmg[ps]]; +- dataBands = (self->bitstreamParameterBands - 1) / pbStride + 1; +- createMapping(aGroupToBand, 0, self->bitstreamParameterBands, pbStride); +- for (pg = 0; pg < dataBands; pg++) { +- pbStart = aGroupToBand[pg]; +- pbStop = aGroupToBand[pg + 1]; +- for (pb = pbStart; pb < pbStop; pb++) { +- self->smgData[ps][pb] = frame->bsSmgData[ps][pg]; +- } +- } +- break; +- } +- } +- +- self->smoothState->prevSmgTime = self->smgTime[frame->numParameterSets - 1]; +- FDKmemcpy(self->smoothState->prevSmgData, +- self->smgData[frame->numParameterSets - 1], +- self->bitstreamParameterBands * sizeof(UCHAR)); +- +- if (self->extendFrame) { +- self->smgTime[frame->numParameterSets] = +- self->smgTime[frame->numParameterSets - 1]; +- FDKmemcpy(self->smgData[frame->numParameterSets], +- self->smgData[frame->numParameterSets - 1], +- self->bitstreamParameterBands * sizeof(UCHAR)); +- } +- +- return MPS_OK; +-} +- +-/******************************************************************************* +- Functionname: decodeAndMapFrameArbdmx +- ******************************************************************************* +- +- Description: +- Do delta decoding and dequantization +- +- Arguments: +- +-Input: +- +-Output: +- +-*******************************************************************************/ +-static SACDEC_ERROR decodeAndMapFrameArbdmx(HANDLE_SPATIAL_DEC self, +- const SPATIAL_BS_FRAME *frame) { +- SACDEC_ERROR err = MPS_OK; +- int ch; +- int offset = self->numOttBoxes; +- +- for (ch = 0; ch < self->numInputChannels; ch++) { +- err = mapIndexData(&frame->CLDLosslessData[offset + ch], +- self->arbdmxGain__FDK, self->outIdxData, +- frame->cmpArbdmxGainIdx, NULL, /* no differential data */ +- ch, self->arbdmxGainIdxPrev, offset + ch, t_CLD, 0, +- self->bitstreamParameterBands, +- 0 /*self->arbdmxGainDefault*/, frame->numParameterSets, +- frame->paramSlot, self->extendFrame, 0, +- &(self->concealInfo), ottVsTotInactiv, NULL, NULL, NULL); +- if (err != MPS_OK) goto bail; +- } +- +-bail: +- return err; +-} /* decodeAndMapFrameArbdmx */ +- +-/******************************************************************************* +- Functionname: SpatialDecDecodeFrame +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame) { +- SACDEC_ERROR err = MPS_OK; +- +- self->extendFrame = 0; +- if (frame->paramSlot[frame->numParameterSets - 1] != self->timeSlots - 1) { +- self->extendFrame = 1; +- } +- +- self->TsdTs = 0; +- +- /****** DTDF and MAP DATA ********/ +- if ((err = decodeAndMapFrameOtt(self, frame)) != MPS_OK) goto bail; +- +- if ((err = decodeAndMapFrameSmg(self, frame)) != MPS_OK) goto bail; +- +- if (self->arbitraryDownmix != 0) { +- if ((err = decodeAndMapFrameArbdmx(self, frame)) != MPS_OK) goto bail; +- } +- +- if (self->extendFrame) { +- frame->numParameterSets = +- fixMin(MAX_PARAMETER_SETS, frame->numParameterSets + 1); +- frame->paramSlot[frame->numParameterSets - 1] = self->timeSlots - 1; +- +- for (int p = 0; p < frame->numParameterSets; p++) { +- if (frame->paramSlot[p] > self->timeSlots - 1) { +- frame->paramSlot[p] = self->timeSlots - 1; +- err = MPS_PARSE_ERROR; +- } +- } +- if (err != MPS_OK) { +- goto bail; +- } +- } +- +-bail: +- return err; +-} /* SpatialDecDecodeFrame() */ +- +-/******************************************************************************* +- Functionname: SpatialDecodeHeader +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +- +-SACDEC_ERROR SpatialDecDecodeHeader( +- spatialDec *self, SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig) { +- SACDEC_ERROR err = MPS_OK; +- int i; +- +- self->samplingFreq = pSpatialSpecificConfig->samplingFreq; +- self->timeSlots = pSpatialSpecificConfig->nTimeSlots; +- self->frameLength = self->timeSlots * self->qmfBands; +- self->bitstreamParameterBands = pSpatialSpecificConfig->freqRes; +- +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) +- self->hybridBands = self->qmfBands; +- else +- self->hybridBands = SacGetHybridSubbands(self->qmfBands); +- self->tp_hybBandBorder = 12; +- +- self->numParameterBands = self->bitstreamParameterBands; +- +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) { +- switch (self->numParameterBands) { +- case 4: +- self->kernels = kernels_4_to_64; +- break; +- case 5: +- self->kernels = kernels_5_to_64; +- break; +- case 7: +- self->kernels = kernels_7_to_64; +- break; +- case 9: +- self->kernels = kernels_9_to_64; +- break; +- case 12: +- self->kernels = kernels_12_to_64; +- break; +- case 15: +- self->kernels = kernels_15_to_64; +- break; +- case 23: +- self->kernels = kernels_23_to_64; +- break; +- default: +- return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */ +- } +- } else { +- switch (self->numParameterBands) { +- case 4: +- self->kernels = kernels_4_to_71; +- break; +- case 5: +- self->kernels = kernels_5_to_71; +- break; +- case 7: +- self->kernels = kernels_7_to_71; +- break; +- case 10: +- self->kernels = kernels_10_to_71; +- break; +- case 14: +- self->kernels = kernels_14_to_71; +- break; +- case 20: +- self->kernels = kernels_20_to_71; +- break; +- case 28: +- self->kernels = kernels_28_to_71; +- break; +- default: +- return MPS_INVALID_PARAMETERBANDS; /* unsupported numParameterBands */ +- } +- } +- +- /* create param to hyb band table */ +- FDKmemclear(self->param2hyb, (MAX_PARAMETER_BANDS + 1) * sizeof(int)); +- for (i = 0; i < self->hybridBands; i++) { +- self->param2hyb[self->kernels[i] + 1] = i + 1; +- } +- { +- int pb = self->kernels[i - 1] + 2; +- for (; pb < (MAX_PARAMETER_BANDS + 1); pb++) { +- self->param2hyb[pb] = i; +- } +- for (pb = 0; pb < MAX_PARAMETER_BANDS; pb += 1) { +- self->kernels_width[pb] = self->param2hyb[pb + 1] - self->param2hyb[pb]; +- } +- } +- +- self->treeConfig = pSpatialSpecificConfig->treeConfig; +- +- self->numOttBoxes = pSpatialSpecificConfig->nOttBoxes; +- +- self->numInputChannels = pSpatialSpecificConfig->nInputChannels; +- +- self->numOutputChannels = pSpatialSpecificConfig->nOutputChannels; +- +- self->quantMode = pSpatialSpecificConfig->quantMode; +- +- self->arbitraryDownmix = pSpatialSpecificConfig->bArbitraryDownmix; +- +- self->numM2rows = self->numOutputChannels; +- +- { +- self->residualCoding = 0; +- if (self->arbitraryDownmix == 2) +- self->arbitraryDownmix = 1; /* no arbitrary downmix residuals */ +- } +- if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC)) { +- self->residualCoding = pSpatialSpecificConfig->bResidualCoding; +- } +- +- self->clipProtectGain__FDK = +- FX_CFG2FX_DBL(clipGainTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX]); +- self->clipProtectGainSF__FDK = +- clipGainSFTable__FDK[pSpatialSpecificConfig->bsFixedGainDMX]; +- +- self->tempShapeConfig = pSpatialSpecificConfig->tempShapeConfig; +- +- self->decorrConfig = pSpatialSpecificConfig->decorrConfig; +- +- if (self->upmixType == UPMIXTYPE_BYPASS) { +- self->numOutputChannels = self->numInputChannels; +- } +- +- self->numOutputChannelsAT = self->numOutputChannels; +- +- self->numOttBandsIPD = pSpatialSpecificConfig->numOttBandsIPD; +- self->phaseCoding = pSpatialSpecificConfig->bsPhaseCoding; +- for (i = 0; i < self->numOttBoxes; i++) { +- { +- self->pConfigCurrent->bitstreamOttBands[i] = +- self->bitstreamParameterBands; +- } +- self->numOttBands[i] = self->pConfigCurrent->bitstreamOttBands[i]; +- } /* i */ +- +- if (self->residualCoding) { +- int numBoxes = self->numOttBoxes; +- for (i = 0; i < numBoxes; i++) { +- self->residualPresent[i] = +- pSpatialSpecificConfig->ResidualConfig[i].bResidualPresent; +- +- if (self->residualPresent[i]) { +- self->residualBands[i] = +- pSpatialSpecificConfig->ResidualConfig[i].nResidualBands; +- /* conversion from hybrid bands to qmf bands */ +- self->residualQMFBands[i] = +- fMax(self->param2hyb[self->residualBands[i]] + 3 - 10, +- 3); /* simplification for the lowest 10 hybrid bands */ +- } else { +- self->residualBands[i] = 0; +- self->residualQMFBands[i] = 0; +- } +- } +- } /* self->residualCoding */ +- else { +- int boxes = self->numOttBoxes; +- for (i = 0; i < boxes; i += 1) { +- self->residualPresent[i] = 0; +- self->residualBands[i] = 0; +- } +- } +- +- switch (self->treeConfig) { +- case TREE_212: +- self->numDirektSignals = 1; +- self->numDecorSignals = 1; +- self->numXChannels = 1; +- if (self->arbitraryDownmix == 2) { +- self->numXChannels += 1; +- } +- self->numVChannels = self->numDirektSignals + self->numDecorSignals; +- break; +- default: +- return MPS_INVALID_TREECONFIG; +- } +- +- self->highRateMode = pSpatialSpecificConfig->bsHighRateMode; +- self->decorrType = pSpatialSpecificConfig->bsDecorrType; +- +- SpatialDecDecodeHelperInfo(pSpatialSpecificConfig, UPMIXTYPE_NORMAL); +- +- return err; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecCreateBsFrame +- ******************************************************************************* +- +- Description: Create spatial bitstream structure +- +- Arguments: spatialDec* self +- const SPATIAL_BS_FRAME **bsFrame +- +- Return: - +- +-*******************************************************************************/ +-SACDEC_ERROR SpatialDecCreateBsFrame(SPATIAL_BS_FRAME *bsFrame, +- BS_LL_STATE *llState) { +- SPATIAL_BS_FRAME *pBs = bsFrame; +- +- const int maxNumOtt = MAX_NUM_OTT; +- const int maxNumInputChannels = MAX_INPUT_CHANNELS; +- +- FDK_ALLOCATE_MEMORY_1D_P( +- pBs->cmpOttIPDidx, maxNumOtt * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, +- SCHAR, SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) +- +- /* Arbitrary Downmix */ +- FDK_ALLOCATE_MEMORY_1D_P( +- pBs->cmpArbdmxGainIdx, +- maxNumInputChannels * MAX_PARAMETER_SETS * MAX_PARAMETER_BANDS, SCHAR, +- SCHAR(*)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) +- +- /* Lossless control */ +- FDK_ALLOCATE_MEMORY_1D(pBs->CLDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA) +- FDK_ALLOCATE_MEMORY_1D(pBs->ICCLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA) +- +- FDK_ALLOCATE_MEMORY_1D(pBs->IPDLosslessData, MAX_NUM_PARAMETERS, LOSSLESSDATA) +- +- pBs->newBsData = 0; +- pBs->numParameterSets = 1; +- +- /* Link lossless states */ +- for (int x = 0; x < MAX_NUM_PARAMETERS; x++) { +- pBs->CLDLosslessData[x].state = &llState->CLDLosslessState[x]; +- pBs->ICCLosslessData[x].state = &llState->ICCLosslessState[x]; +- +- pBs->IPDLosslessData[x].state = &llState->IPDLosslessState[x]; +- } +- +- return MPS_OK; +- +-bail: +- return MPS_OUTOFMEMORY; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecCloseBsFrame +- ******************************************************************************* +- +- Description: Close spatial bitstream structure +- +- Arguments: spatialDec* self +- +- Return: - +- +-*******************************************************************************/ +-void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *pBs) { +- if (pBs != NULL) { +- /* These arrays contain the compact indices, only one value per pbstride, +- * only paramsets actually containing data. */ +- +- FDK_FREE_MEMORY_1D(pBs->cmpOttIPDidx); +- +- /* Arbitrary Downmix */ +- FDK_FREE_MEMORY_1D(pBs->cmpArbdmxGainIdx); +- +- /* Lossless control */ +- FDK_FREE_MEMORY_1D(pBs->IPDLosslessData); +- FDK_FREE_MEMORY_1D(pBs->CLDLosslessData); +- FDK_FREE_MEMORY_1D(pBs->ICCLosslessData); +- } +-} +diff --git a/libSACdec/src/sac_bitdec.h b/libSACdec/src/sac_bitdec.h +deleted file mode 100644 +index cb0c7d2..0000000 +--- a/libSACdec/src/sac_bitdec.h ++++ /dev/null +@@ -1,161 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec bitstream decoder +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Spatial Audio bitstream decoder +-*/ +- +-#ifndef SAC_BITDEC_H +-#define SAC_BITDEC_H +- +-#include "sac_dec.h" +- +-typedef struct { +- SCHAR numInputChannels; +- SCHAR numOutputChannels; +- SCHAR numOttBoxes; +- SCHAR numTttBoxes; +- SCHAR ottModeLfe[MAX_NUM_OTT]; +-} TREEPROPERTIES; +- +-enum { TREE_212 = 7, TREE_DUMMY = 255 }; +- +-enum { QUANT_FINE = 0, QUANT_EBQ1 = 1, QUANT_EBQ2 = 2 }; +- +-SACDEC_ERROR SpatialDecParseSpecificConfigHeader( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, SPATIAL_DEC_UPMIX_TYPE upmixType); +- +-SACDEC_ERROR SpatialDecParseMps212Config( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int samplingRate, +- AUDIO_OBJECT_TYPE coreCodec, INT stereoConfigIndex, +- INT coreSbrFrameLengthIndex); +- +-SACDEC_ERROR SpatialDecParseSpecificConfig( +- HANDLE_FDK_BITSTREAM bitstream, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, int sacHeaderLen, +- AUDIO_OBJECT_TYPE coreCodec); +- +-int SpatialDecDefaultSpecificConfig( +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, int samplingFreq, int nTimeSlots, +- int sacDecoderLevel, int isBlind, int coreChannels); +- +-SACDEC_ERROR SpatialDecCreateBsFrame(SPATIAL_BS_FRAME *bsFrame, +- BS_LL_STATE *llState); +- +-void SpatialDecCloseBsFrame(SPATIAL_BS_FRAME *bsFrame); +- +-SACDEC_ERROR SpatialDecParseFrameData( +- spatialDec *self, SPATIAL_BS_FRAME *frame, HANDLE_FDK_BITSTREAM bitstream, +- const SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, UPMIXTYPE upmixType, +- int fGlobalIndependencyFlag); +- +-SACDEC_ERROR SpatialDecDecodeFrame(spatialDec *self, SPATIAL_BS_FRAME *frame); +- +-SACDEC_ERROR SpatialDecDecodeHeader( +- spatialDec *self, SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig); +- +-#endif +diff --git a/libSACdec/src/sac_calcM1andM2.cpp b/libSACdec/src/sac_calcM1andM2.cpp +deleted file mode 100644 +index 6e5a145..0000000 +--- a/libSACdec/src/sac_calcM1andM2.cpp ++++ /dev/null +@@ -1,848 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec M1 and M2 calculation +- +-*******************************************************************************/ +- +-#include "sac_calcM1andM2.h" +-#include "sac_bitdec.h" +-#include "sac_process.h" +-#include "sac_rom.h" +-#include "sac_smoothing.h" +-#include "FDK_trigFcts.h" +- +-/* assorted definitions and constants */ +- +-#define ABS_THR2 1.0e-9 +-#define SQRT2_FDK \ +- ((FIXP_DBL)FL2FXCONST_DBL(0.70710678118f)) /* FDKsqrt(2.0) scaled by 0.5 */ +- +-static void param2UMX_PS__FDK(spatialDec* self, +- FIXP_DBL H11[MAX_PARAMETER_BANDS], +- FIXP_DBL H12[MAX_PARAMETER_BANDS], +- FIXP_DBL H21[MAX_PARAMETER_BANDS], +- FIXP_DBL H22[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], +- FIXP_DBL c_r[MAX_PARAMETER_BANDS], int ottBoxIndx, +- int parameterSetIndx, int resBands); +- +-static void param2UMX_PS_Core__FDK( +- const SCHAR cld[MAX_PARAMETER_BANDS], const SCHAR icc[MAX_PARAMETER_BANDS], +- const int numOttBands, const int resBands, +- FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS], +- FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS]); +- +-static void param2UMX_PS_IPD_OPD__FDK( +- spatialDec* self, const SPATIAL_BS_FRAME* frame, +- FIXP_DBL H11re[MAX_PARAMETER_BANDS], FIXP_DBL H12re[MAX_PARAMETER_BANDS], +- FIXP_DBL H21re[MAX_PARAMETER_BANDS], FIXP_DBL H22re[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS], +- int ottBoxIndx, int parameterSetIndx, int residualBands); +- +-static void param2UMX_Prediction__FDK( +- spatialDec* self, FIXP_DBL H11re[MAX_PARAMETER_BANDS], +- FIXP_DBL H11im[MAX_PARAMETER_BANDS], FIXP_DBL H12re[MAX_PARAMETER_BANDS], +- FIXP_DBL H12im[MAX_PARAMETER_BANDS], FIXP_DBL H21re[MAX_PARAMETER_BANDS], +- FIXP_DBL H21im[MAX_PARAMETER_BANDS], FIXP_DBL H22re[MAX_PARAMETER_BANDS], +- FIXP_DBL H22im[MAX_PARAMETER_BANDS], int ottBoxIndx, int parameterSetIndx, +- int resBands); +- +-/* static void SpatialDecCalculateM0(spatialDec* self,int ps); */ +-static SACDEC_ERROR SpatialDecCalculateM1andM2_212( +- spatialDec* self, int ps, const SPATIAL_BS_FRAME* frame); +- +-/******************************************************************************* +- Functionname: SpatialDecGetResidualIndex +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- +- Output: +- +-*******************************************************************************/ +-int SpatialDecGetResidualIndex(spatialDec* self, int row) { +- return row2residual[self->treeConfig][row]; +-} +- +-/******************************************************************************* +- Functionname: UpdateAlpha +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- +- Output: +- +-*******************************************************************************/ +-static void updateAlpha(spatialDec* self) { +- int nChIn = self->numInputChannels; +- int ch; +- +- for (ch = 0; ch < nChIn; ch++) { +- FIXP_DBL alpha = /* FL2FXCONST_DBL(1.0f) */ (FIXP_DBL)MAXVAL_DBL; +- +- self->arbdmxAlphaPrev__FDK[ch] = self->arbdmxAlpha__FDK[ch]; +- +- self->arbdmxAlpha__FDK[ch] = alpha; +- } +-} +- +-/******************************************************************************* +- Functionname: SpatialDecCalculateM1andM2 +- ******************************************************************************* +- Description: +- Arguments: +-*******************************************************************************/ +-SACDEC_ERROR SpatialDecCalculateM1andM2(spatialDec* self, int ps, +- const SPATIAL_BS_FRAME* frame) { +- SACDEC_ERROR err = MPS_OK; +- +- if ((self->arbitraryDownmix != 0) && (ps == 0)) { +- updateAlpha(self); +- } +- +- self->pActivM2ParamBands = NULL; +- +- switch (self->upmixType) { +- case UPMIXTYPE_BYPASS: +- case UPMIXTYPE_NORMAL: +- switch (self->treeConfig) { +- case TREE_212: +- err = SpatialDecCalculateM1andM2_212(self, ps, frame); +- break; +- default: +- err = MPS_WRONG_TREECONFIG; +- }; +- break; +- +- default: +- err = MPS_WRONG_TREECONFIG; +- } +- +- if (err != MPS_OK) { +- goto bail; +- } +- +-bail: +- return err; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecCalculateM1andM2_212 +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static SACDEC_ERROR SpatialDecCalculateM1andM2_212( +- spatialDec* self, int ps, const SPATIAL_BS_FRAME* frame) { +- SACDEC_ERROR err = MPS_OK; +- int pb; +- +- FIXP_DBL H11re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL H12re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL H21re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL H22re[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL H11im[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- FIXP_DBL H21im[MAX_PARAMETER_BANDS] = {FL2FXCONST_DBL(0.0f)}; +- +- INT phaseCoding = self->phaseCoding; +- +- switch (phaseCoding) { +- case 1: +- /* phase coding: yes; residuals: no */ +- param2UMX_PS_IPD_OPD__FDK(self, frame, H11re, H12re, H21re, H22re, NULL, +- NULL, 0, ps, self->residualBands[0]); +- break; +- case 3: +- /* phase coding: yes; residuals: yes */ +- param2UMX_Prediction__FDK(self, H11re, H11im, H12re, NULL, H21re, H21im, +- H22re, NULL, 0, ps, self->residualBands[0]); +- break; +- default: +- if (self->residualCoding) { +- /* phase coding: no; residuals: yes */ +- param2UMX_Prediction__FDK(self, H11re, NULL, H12re, NULL, H21re, NULL, +- H22re, NULL, 0, ps, self->residualBands[0]); +- } else { +- /* phase coding: no; residuals: no */ +- param2UMX_PS__FDK(self, H11re, H12re, H21re, H22re, NULL, NULL, 0, ps, +- 0); +- } +- break; +- } +- +- for (pb = 0; pb < self->numParameterBands; pb++) { +- self->M2Real__FDK[0][0][pb] = (H11re[pb]); +- self->M2Real__FDK[0][1][pb] = (H12re[pb]); +- +- self->M2Real__FDK[1][0][pb] = (H21re[pb]); +- self->M2Real__FDK[1][1][pb] = (H22re[pb]); +- } +- if (phaseCoding == 3) { +- for (pb = 0; pb < self->numParameterBands; pb++) { +- self->M2Imag__FDK[0][0][pb] = (H11im[pb]); +- self->M2Imag__FDK[1][0][pb] = (H21im[pb]); +- self->M2Imag__FDK[0][1][pb] = (FIXP_DBL)0; // H12im[pb]; +- self->M2Imag__FDK[1][1][pb] = (FIXP_DBL)0; // H22im[pb]; +- } +- } +- +- if (self->phaseCoding == 1) { +- SpatialDecSmoothOPD( +- self, frame, +- ps); /* INPUT: PhaseLeft, PhaseRight, (opdLeftState, opdRightState) */ +- } +- +- return err; +-} +- +-/******************************************************************************* +- Functionname: param2UMX_PS_Core +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void param2UMX_PS_Core__FDK( +- const SCHAR cld[MAX_PARAMETER_BANDS], const SCHAR icc[MAX_PARAMETER_BANDS], +- const int numOttBands, const int resBands, +- FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS], +- FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS]) { +- int band; +- +- if ((c_l != NULL) && (c_r != NULL)) { +- for (band = 0; band < numOttBands; band++) { +- SpatialDequantGetCLDValues(cld[band], &c_l[band], &c_r[band]); +- } +- } +- +- band = 0; +- FDK_ASSERT(resBands == 0); +- for (; band < numOttBands; band++) { +- /* compute mixing variables: */ +- const int idx1 = cld[band]; +- const int idx2 = icc[band]; +- H11[band] = FX_CFG2FX_DBL(H11_nc[idx1][idx2]); +- H21[band] = FX_CFG2FX_DBL(H11_nc[30 - idx1][idx2]); +- H12[band] = FX_CFG2FX_DBL(H12_nc[idx1][idx2]); +- H22[band] = FX_CFG2FX_DBL(-H12_nc[30 - idx1][idx2]); +- } +-} +- +-/******************************************************************************* +- Functionname: param2UMX_PS +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void param2UMX_PS__FDK(spatialDec* self, +- FIXP_DBL H11[MAX_PARAMETER_BANDS], +- FIXP_DBL H12[MAX_PARAMETER_BANDS], +- FIXP_DBL H21[MAX_PARAMETER_BANDS], +- FIXP_DBL H22[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], +- FIXP_DBL c_r[MAX_PARAMETER_BANDS], int ottBoxIndx, +- int parameterSetIndx, int residualBands) { +- int band; +- param2UMX_PS_Core__FDK(self->ottCLD__FDK[ottBoxIndx][parameterSetIndx], +- self->ottICC__FDK[ottBoxIndx][parameterSetIndx], +- self->numOttBands[ottBoxIndx], residualBands, H11, H12, +- H21, H22, c_l, c_r); +- +- for (band = self->numOttBands[ottBoxIndx]; band < self->numParameterBands; +- band++) { +- H11[band] = H21[band] = H12[band] = H22[band] = FL2FXCONST_DBL(0.f); +- } +-} +- +-#define N_CLD (31) +-#define N_IPD (16) +- +-static const FIXP_DBL sinIpd_tab[N_IPD] = { +- FIXP_DBL(0x00000000), FIXP_DBL(0x30fbc54e), FIXP_DBL(0x5a827999), +- FIXP_DBL(0x7641af3d), FIXP_DBL(0x7fffffff), FIXP_DBL(0x7641af3d), +- FIXP_DBL(0x5a82799a), FIXP_DBL(0x30fbc54d), FIXP_DBL(0xffffffff), +- FIXP_DBL(0xcf043ab3), FIXP_DBL(0xa57d8666), FIXP_DBL(0x89be50c3), +- FIXP_DBL(0x80000000), FIXP_DBL(0x89be50c3), FIXP_DBL(0xa57d8666), +- FIXP_DBL(0xcf043ab2), +-}; +- +-/* cosIpd[i] = sinIpd[(i+4)&15] */ +-#define SIN_IPD(a) (sinIpd_tab[(a)]) +-#define COS_IPD(a) (sinIpd_tab[((a) + 4) & 15]) //(cosIpd_tab[(a)]) +- +-static const FIXP_SGL sqrt_one_minus_ICC2[8] = { +- FL2FXCONST_SGL(0.0f), +- FL2FXCONST_SGL(0.349329357483736f), +- FL2FXCONST_SGL(0.540755219669676f), +- FL2FXCONST_SGL(0.799309172723546f), +- FL2FXCONST_SGL(0.929968187843004f), +- FX_DBL2FXCONST_SGL(MAXVAL_DBL), +- FL2FXCONST_SGL(0.80813303360276f), +- FL2FXCONST_SGL(0.141067359796659f), +-}; +- +-/* exponent of sqrt(CLD) */ +-static const SCHAR sqrt_CLD_e[N_CLD] = { +- -24, -7, -6, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0, 0, 0, 1, +- 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 25}; +- +-static const FIXP_DBL sqrt_CLD_m[N_CLD] = { +- FL2FXCONST_DBL(0.530542153566195f), +- FL2FXCONST_DBL(0.719796896243647f), +- FL2FXCONST_DBL(0.64f), +- FL2FXCONST_DBL(0.569049411212455f), +- FL2FXCONST_DBL(0.505964425626941f), +- FL2FXCONST_DBL(0.899746120304559f), +- FL2FXCONST_DBL(0.635462587779425f), +- FL2FXCONST_DBL(0.897614763441571f), +- FL2FXCONST_DBL(0.633957276984445f), +- FL2FXCONST_DBL(0.895488455427336f), +- FL2FXCONST_DBL(0.632455532033676f), +- FL2FXCONST_DBL(0.796214341106995f), +- FL2FXCONST_DBL(0.501187233627272f), +- FL2FXCONST_DBL(0.630957344480193f), +- FL2FXCONST_DBL(0.794328234724281f), +- FL2FXCONST_DBL(0.5f), +- FL2FXCONST_DBL(0.629462705897084f), +- FL2FXCONST_DBL(0.792446596230557f), +- FL2FXCONST_DBL(0.99763115748444f), +- FL2FXCONST_DBL(0.627971607877395f), +- FL2FXCONST_DBL(0.790569415042095f), +- FL2FXCONST_DBL(0.558354490188704f), +- FL2FXCONST_DBL(0.788696680600242f), +- FL2FXCONST_DBL(0.557031836333591f), +- FL2FXCONST_DBL(0.786828382371355f), +- FL2FXCONST_DBL(0.555712315637163f), +- FL2FXCONST_DBL(0.988211768802619f), +- FL2FXCONST_DBL(0.87865832060992f), +- FL2FXCONST_DBL(0.78125f), +- FL2FXCONST_DBL(0.694640394546454f), +- FL2FXCONST_DBL(0.942432183077448f), +-}; +- +-static const FIXP_DBL CLD_m[N_CLD] = { +- FL2FXCONST_DBL(0.281474976710656f), +- FL2FXCONST_DBL(0.518107571841987f), +- FL2FXCONST_DBL(0.4096f), +- FL2FXCONST_DBL(0.323817232401242f), +- FL2FXCONST_DBL(0.256f), +- FL2FXCONST_DBL(0.809543081003105f), +- FL2FXCONST_DBL(0.403812700467324f), +- FL2FXCONST_DBL(0.805712263548267f), +- FL2FXCONST_DBL(0.401901829041533f), +- FL2FXCONST_DBL(0.801899573803636f), +- FL2FXCONST_DBL(0.4f), +- FL2FXCONST_DBL(0.633957276984445f), +- FL2FXCONST_DBL(0.251188643150958f), +- FL2FXCONST_DBL(0.398107170553497f), +- FL2FXCONST_DBL(0.630957344480193f), +- FL2FXCONST_DBL(0.25f), +- FL2FXCONST_DBL(0.396223298115278f), +- FL2FXCONST_DBL(0.627971607877395f), +- FL2FXCONST_DBL(0.995267926383743f), +- FL2FXCONST_DBL(0.394348340300121f), +- FL2FXCONST_DBL(0.625f), +- FL2FXCONST_DBL(0.311759736713887f), +- FL2FXCONST_DBL(0.62204245398984f), +- FL2FXCONST_DBL(0.310284466689172f), +- FL2FXCONST_DBL(0.619098903305123f), +- FL2FXCONST_DBL(0.308816177750818f), +- FL2FXCONST_DBL(0.9765625f), +- FL2FXCONST_DBL(0.772040444377046f), +- FL2FXCONST_DBL(0.6103515625f), +- FL2FXCONST_DBL(0.482525277735654f), +- FL2FXCONST_DBL(0.888178419700125), +-}; +- +-static FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK_Function(INT ipdIdx, +- INT cldIdx, +- INT iccIdx) { +- FIXP_DBL cld; +- SpatialDequantGetCLD2Values(cldIdx, &cld); +- +- /*const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL; +- const int one_e = 0;*/ +- const FIXP_DBL one_m = FL2FXCONST_DBL(0.5f); +- const int one_e = 1; +- /* iidLin = sqrt(cld); */ +- FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx]; +- int iidLin_e = sqrt_CLD_e[cldIdx]; +- /* iidLin2 = cld; */ +- FIXP_DBL iidLin2_m = CLD_m[cldIdx]; +- int iidLin2_e = sqrt_CLD_e[cldIdx] << 1; +- /* iidLin21 = iidLin2 + 1.0f; */ +- int iidLin21_e; +- FIXP_DBL iidLin21_m = +- fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e); +- /* iidIcc2 = iidLin * icc * 2.0f; */ +- FIXP_CFG icc = dequantICC__FDK[iccIdx]; +- FIXP_DBL temp1_m, temp1c_m; +- int temp1_e, temp1c_e; +- temp1_m = fMult(iidLin_m, icc); +- temp1_e = iidLin_e + 1; +- +- FIXP_DBL cosIpd, sinIpd; +- cosIpd = COS_IPD(ipdIdx); +- sinIpd = SIN_IPD(ipdIdx); +- +- temp1c_m = fMult(temp1_m, cosIpd); +- temp1c_e = temp1_e; //+cosIpd_e; +- +- int temp2_e, temp3_e, inv_temp3_e, ratio_e; +- FIXP_DBL temp2_m = +- fAddNorm(iidLin21_m, iidLin21_e, temp1c_m, temp1c_e, &temp2_e); +- FIXP_DBL temp3_m = +- fAddNorm(iidLin21_m, iidLin21_e, temp1_m, temp1_e, &temp3_e); +- /* calculate 1/temp3 needed later */ +- inv_temp3_e = temp3_e; +- FIXP_DBL inv_temp3_m = invFixp(temp3_m, &inv_temp3_e); +- FIXP_DBL ratio_m = +- fAddNorm(fMult(inv_temp3_m, temp2_m), (inv_temp3_e + temp2_e), +- FL2FXCONST_DBL(1e-9f), 0, &ratio_e); +- +- int weight2_e, tempb_atan2_e; +- FIXP_DBL weight2_m = +- fPow(ratio_m, ratio_e, FL2FXCONST_DBL(0.5f), -1, &weight2_e); +- /* atan2(w2*sinIpd, w1*iidLin + w2*cosIpd) = atan2(w2*sinIpd, (2 - w2)*iidLin +- * + w2*cosIpd) = atan2(w2*sinIpd, 2*iidLin + w2*(cosIpd - iidLin)); */ +- /* tmpa_atan2 = w2*sinIpd; tmpb_atan2 = 2*iidLin + w2*(cosIpd - iidLin); */ +- FIXP_DBL tempb_atan2_m = iidLin_m; +- tempb_atan2_e = iidLin_e + 1; +- int add_tmp1_e = 0; +- FIXP_DBL add_tmp1_m = fAddNorm(cosIpd, 0, -iidLin_m, iidLin_e, &add_tmp1_e); +- FIXP_DBL add_tmp2_m = fMult(add_tmp1_m, weight2_m); +- int add_tmp2_e = add_tmp1_e + weight2_e; +- tempb_atan2_m = fAddNorm(tempb_atan2_m, tempb_atan2_e, add_tmp2_m, add_tmp2_e, +- &tempb_atan2_e); +- +- FIXP_DBL tempa_atan2_m = fMult(weight2_m, sinIpd); +- int tempa_atan2_e = weight2_e; // + sinIpd_e; +- +- if (tempa_atan2_e > tempb_atan2_e) { +- tempb_atan2_m = (tempb_atan2_m >> (tempa_atan2_e - tempb_atan2_e)); +- tempb_atan2_e = tempa_atan2_e; +- } else if (tempb_atan2_e > tempa_atan2_e) { +- tempa_atan2_m = (tempa_atan2_m >> (tempb_atan2_e - tempa_atan2_e)); +- } +- +- return fixp_atan2(tempa_atan2_m, tempb_atan2_m); +-} +- +-static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx, +- FIXP_DBL opd[MAX_PARAMETER_BANDS]) { +- INT band; +- +- for (band = 0; band < self->numOttBandsIPD; band++) { +- INT idxCld = self->ottCLD__FDK[ottBoxIndx][parameterSetIndx][band]; +- INT idxIpd = self->ottIPD__FDK[ottBoxIndx][parameterSetIndx][band]; +- INT idxIcc = self->ottICC__FDK[ottBoxIndx][parameterSetIndx][band]; +- FIXP_DBL cld, ipd; +- +- ipd = FX_CFG2FX_DBL(dequantIPD__FDK[idxIpd]); +- +- SpatialDequantGetCLD2Values(idxCld, &cld); +- +- /* ipd(idxIpd==8) == PI */ +- if ((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) { +- opd[2 * band] = FL2FXCONST_DBL(0.0f); +- } else { +- opd[2 * band] = (dequantIPD_CLD_ICC_splitAngle__FDK_Function( +- idxIpd, idxCld, idxIcc) >> +- (IPD_SCALE - AT2O_SF)); +- } +- opd[2 * band + 1] = opd[2 * band] - ipd; +- } +-} +- +-/* wrap phase in rad to the range of 0 <= x < 2*pi */ +-static FIXP_DBL wrapPhase(FIXP_DBL phase) { +- while (phase < (FIXP_DBL)0) phase += PIx2__IPD; +- while (phase >= PIx2__IPD) phase -= PIx2__IPD; +- FDK_ASSERT((phase >= (FIXP_DBL)0) && (phase < PIx2__IPD)); +- +- return phase; +-} +- +-/******************************************************************************* +- Functionname: param2UMX_PS_IPD +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static void param2UMX_PS_IPD_OPD__FDK( +- spatialDec* self, const SPATIAL_BS_FRAME* frame, +- FIXP_DBL H11[MAX_PARAMETER_BANDS], FIXP_DBL H12[MAX_PARAMETER_BANDS], +- FIXP_DBL H21[MAX_PARAMETER_BANDS], FIXP_DBL H22[MAX_PARAMETER_BANDS], +- FIXP_DBL c_l[MAX_PARAMETER_BANDS], FIXP_DBL c_r[MAX_PARAMETER_BANDS], +- int ottBoxIndx, int parameterSetIndx, int residualBands) { +- INT band; +- FIXP_DBL opd[2 * MAX_PARAMETER_BANDS]; +- INT numOttBands = self->numOttBands[ottBoxIndx]; +- INT numIpdBands; +- +- numIpdBands = frame->phaseMode ? self->numOttBandsIPD : 0; +- +- FDK_ASSERT(self->residualCoding == 0); +- +- param2UMX_PS_Core__FDK(self->ottCLD__FDK[ottBoxIndx][parameterSetIndx], +- self->ottICC__FDK[ottBoxIndx][parameterSetIndx], +- self->numOttBands[ottBoxIndx], residualBands, H11, H12, +- H21, H22, c_l, c_r); +- +- for (band = self->numOttBands[ottBoxIndx]; band < self->numParameterBands; +- band++) { +- H11[band] = H21[band] = H12[band] = H22[band] = FL2FXCONST_DBL(0.f); +- } +- +- if (frame->phaseMode) { +- calculateOpd(self, ottBoxIndx, parameterSetIndx, opd); +- +- for (band = 0; band < numIpdBands; band++) { +- self->PhaseLeft__FDK[band] = wrapPhase(opd[2 * band]); +- self->PhaseRight__FDK[band] = wrapPhase(opd[2 * band + 1]); +- } +- } +- +- for (band = numIpdBands; band < numOttBands; band++) { +- self->PhaseLeft__FDK[band] = FL2FXCONST_DBL(0.0f); +- self->PhaseRight__FDK[band] = FL2FXCONST_DBL(0.0f); +- } +-} +- +-FDK_INLINE void param2UMX_Prediction_Core__FDK( +- FIXP_DBL* H11re, FIXP_DBL* H11im, FIXP_DBL* H12re, FIXP_DBL* H12im, +- FIXP_DBL* H21re, FIXP_DBL* H21im, FIXP_DBL* H22re, FIXP_DBL* H22im, +- int cldIdx, int iccIdx, int ipdIdx, int band, int numOttBandsIPD, +- int resBands) { +-#define MAX_WEIGHT (1.2f) +- FDK_ASSERT((H12im == NULL) && (H22im == NULL)); /* always == 0 */ +- +- if ((band < numOttBandsIPD) && (cldIdx == 15) && (iccIdx == 0) && +- (ipdIdx == 8)) { +- const FIXP_DBL gain = +- FL2FXCONST_DBL(0.5f / MAX_WEIGHT) >> SCALE_PARAM_M2_212_PRED; +- +- *H11re = gain; +- if (band < resBands) { +- *H21re = gain; +- *H12re = gain; +- *H22re = -gain; +- } else { +- *H21re = -gain; +- *H12re = (FIXP_DBL)0; +- *H22re = (FIXP_DBL)0; +- } +- if ((H11im != NULL) && +- (H21im != NULL) /*&& (H12im!=NULL) && (H22im!=NULL)*/) { +- *H11im = (FIXP_DBL)0; +- *H21im = (FIXP_DBL)0; +- /* *H12im = (FIXP_DBL)0; */ +- /* *H22im = (FIXP_DBL)0; */ +- } +- } else { +- const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL; +- const int one_e = 0; +- /* iidLin = sqrt(cld); */ +- FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx]; +- int iidLin_e = sqrt_CLD_e[cldIdx]; +- /* iidLin2 = cld; */ +- FIXP_DBL iidLin2_m = CLD_m[cldIdx]; +- int iidLin2_e = sqrt_CLD_e[cldIdx] << 1; +- /* iidLin21 = iidLin2 + 1.0f; */ +- int iidLin21_e; +- FIXP_DBL iidLin21_m = +- fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e); +- /* iidIcc2 = iidLin * icc * 2.0f; */ +- FIXP_CFG icc = dequantICC__FDK[iccIdx]; +- int iidIcc2_e = iidLin_e + 1; +- FIXP_DBL iidIcc2_m = fMult(iidLin_m, icc); +- FIXP_DBL temp_m, sqrt_temp_m, inv_temp_m, weight_m; +- int temp_e, sqrt_temp_e, inv_temp_e, weight_e, scale; +- FIXP_DBL cosIpd, sinIpd; +- +- cosIpd = COS_IPD((band < numOttBandsIPD) ? ipdIdx : 0); +- sinIpd = SIN_IPD((band < numOttBandsIPD) ? ipdIdx : 0); +- +- /* temp = iidLin21 + iidIcc2 * cosIpd; */ +- temp_m = fAddNorm(iidLin21_m, iidLin21_e, fMult(iidIcc2_m, cosIpd), +- iidIcc2_e, &temp_e); +- +- /* calculate 1/temp needed later */ +- inv_temp_e = temp_e; +- inv_temp_m = invFixp(temp_m, &inv_temp_e); +- +- /* 1/weight = sqrt(temp) * 1/sqrt(iidLin21) */ +- if (temp_e & 1) { +- sqrt_temp_m = temp_m >> 1; +- sqrt_temp_e = (temp_e + 1) >> 1; +- } else { +- sqrt_temp_m = temp_m; +- sqrt_temp_e = temp_e >> 1; +- } +- sqrt_temp_m = sqrtFixp(sqrt_temp_m); +- if (iidLin21_e & 1) { +- iidLin21_e += 1; +- iidLin21_m >>= 1; +- } +- /* weight_[m,e] is actually 1/weight in the next few lines */ +- weight_m = invSqrtNorm2(iidLin21_m, &weight_e); +- weight_e -= iidLin21_e >> 1; +- weight_m = fMult(sqrt_temp_m, weight_m); +- weight_e += sqrt_temp_e; +- scale = fNorm(weight_m); +- weight_m = scaleValue(weight_m, scale); +- weight_e -= scale; +- /* weight = 0.5 * max(1/weight, 1/maxWeight) */ +- if ((weight_e < 0) || +- ((weight_e == 0) && (weight_m < FL2FXCONST_DBL(1.f / MAX_WEIGHT)))) { +- weight_m = FL2FXCONST_DBL(1.f / MAX_WEIGHT); +- weight_e = 0; +- } +- weight_e -= 1; +- +- { +- FIXP_DBL alphaRe_m, alphaIm_m, accu_m; +- int alphaRe_e, alphaIm_e, accu_e; +- /* alphaRe = (1.0f - iidLin2) / temp; */ +- alphaRe_m = fAddNorm(one_m, one_e, -iidLin2_m, iidLin2_e, &alphaRe_e); +- alphaRe_m = fMult(alphaRe_m, inv_temp_m); +- alphaRe_e += inv_temp_e; +- +- /* H11re = weight - alphaRe * weight; */ +- /* H21re = weight + alphaRe * weight; */ +- accu_m = fMult(alphaRe_m, weight_m); +- accu_e = alphaRe_e + weight_e; +- { +- int accu2_e; +- FIXP_DBL accu2_m; +- accu2_m = fAddNorm(weight_m, weight_e, -accu_m, accu_e, &accu2_e); +- *H11re = scaleValue(accu2_m, accu2_e - SCALE_PARAM_M2_212_PRED); +- accu2_m = fAddNorm(weight_m, weight_e, accu_m, accu_e, &accu2_e); +- *H21re = scaleValue(accu2_m, accu2_e - SCALE_PARAM_M2_212_PRED); +- } +- +- if ((H11im != NULL) && +- (H21im != NULL) /*&& (H12im != NULL) && (H22im != NULL)*/) { +- /* alphaIm = -iidIcc2 * sinIpd / temp; */ +- alphaIm_m = fMult(-iidIcc2_m, sinIpd); +- alphaIm_m = fMult(alphaIm_m, inv_temp_m); +- alphaIm_e = iidIcc2_e + inv_temp_e; +- /* H11im = -alphaIm * weight; */ +- /* H21im = alphaIm * weight; */ +- accu_m = fMult(alphaIm_m, weight_m); +- accu_e = alphaIm_e + weight_e; +- accu_m = scaleValue(accu_m, accu_e - SCALE_PARAM_M2_212_PRED); +- *H11im = -accu_m; +- *H21im = accu_m; +- +- /* *H12im = (FIXP_DBL)0; */ +- /* *H22im = (FIXP_DBL)0; */ +- } +- } +- if (band < resBands) { +- FIXP_DBL weight = +- scaleValue(weight_m, weight_e - SCALE_PARAM_M2_212_PRED); +- *H12re = weight; +- *H22re = -weight; +- } else { +- /* beta = 2.0f * iidLin * (float) sqrt(1.0f - icc * icc) * weight / temp; +- */ +- FIXP_DBL beta_m; +- int beta_e; +- beta_m = FX_SGL2FX_DBL(sqrt_one_minus_ICC2[iccIdx]); +- beta_e = 1; /* multipication with 2.0f */ +- beta_m = fMult(beta_m, weight_m); +- beta_e += weight_e; +- beta_m = fMult(beta_m, iidLin_m); +- beta_e += iidLin_e; +- beta_m = fMult(beta_m, inv_temp_m); +- beta_e += inv_temp_e; +- +- beta_m = scaleValue(beta_m, beta_e - SCALE_PARAM_M2_212_PRED); +- *H12re = beta_m; +- *H22re = -beta_m; +- } +- } +-} +- +-static void param2UMX_Prediction__FDK(spatialDec* self, FIXP_DBL* H11re, +- FIXP_DBL* H11im, FIXP_DBL* H12re, +- FIXP_DBL* H12im, FIXP_DBL* H21re, +- FIXP_DBL* H21im, FIXP_DBL* H22re, +- FIXP_DBL* H22im, int ottBoxIndx, +- int parameterSetIndx, int resBands) { +- int band; +- FDK_ASSERT((H12im == NULL) && (H22im == NULL)); /* always == 0 */ +- +- for (band = 0; band < self->numParameterBands; band++) { +- int cldIdx = self->ottCLD__FDK[ottBoxIndx][parameterSetIndx][band]; +- int iccIdx = self->ottICC__FDK[ottBoxIndx][parameterSetIndx][band]; +- int ipdIdx = self->ottIPD__FDK[ottBoxIndx][parameterSetIndx][band]; +- +- param2UMX_Prediction_Core__FDK( +- &H11re[band], (H11im ? &H11im[band] : NULL), &H12re[band], NULL, +- &H21re[band], (H21im ? &H21im[band] : NULL), &H22re[band], NULL, cldIdx, +- iccIdx, ipdIdx, band, self->numOttBandsIPD, resBands); +- } +-} +- +-/******************************************************************************* +- Functionname: initM1andM2 +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +- +-SACDEC_ERROR initM1andM2(spatialDec* self, int initStatesFlag, +- int configChanged) { +- SACDEC_ERROR err = MPS_OK; +- +- self->bOverwriteM1M2prev = (configChanged && !initStatesFlag) ? 1 : 0; +- +- { self->numM2rows = self->numOutputChannels; } +- +- if (initStatesFlag) { +- int i, j, k; +- +- for (i = 0; i < self->numM2rows; i++) { +- for (j = 0; j < self->numVChannels; j++) { +- for (k = 0; k < MAX_PARAMETER_BANDS; k++) { +- self->M2Real__FDK[i][j][k] = FL2FXCONST_DBL(0); +- self->M2RealPrev__FDK[i][j][k] = FL2FXCONST_DBL(0); +- } +- } +- } +- } +- +- return err; +-} +diff --git a/libSACdec/src/sac_calcM1andM2.h b/libSACdec/src/sac_calcM1andM2.h +deleted file mode 100644 +index 996238d..0000000 +--- a/libSACdec/src/sac_calcM1andM2.h ++++ /dev/null +@@ -1,129 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec M1 and M2 calculation +- +-*******************************************************************************/ +- +-/* sa_calcM1andM2.h */ +- +-#ifndef SAC_CALCM1ANDM2_H +-#define SAC_CALCM1ANDM2_H +- +-#include "sac_dec.h" +- +-#define SCALE_PARAM_M1 3 +- +-/* Scaling of M2 matrix, but only for binaural upmix type. */ +-#define SCALE_PARAM_CALC_M2 (3) +-#define SCALE_PARAM_M2_515X (3) +-#define SCALE_PARAM_M2_525 (SCALE_PARAM_M1 + HRG_SF + 1 - SCALE_PARAM_CALC_M2) +-#define SCALE_PARAM_M2_212_PRED (3) +-/* Scaling of spectral data after applying M2 matrix, but only for binaural +- upmix type Scaling is compensated later in synthesis qmf filterbank */ +-#define SCALE_DATA_APPLY_M2 (1) +- +-SACDEC_ERROR initM1andM2(spatialDec* self, int initStatesFlag, +- int configChanged); +- +-int SpatialDecGetResidualIndex(spatialDec* self, int row); +- +-SACDEC_ERROR SpatialDecCalculateM1andM2(spatialDec* self, int ps, +- const SPATIAL_BS_FRAME* frame); +- +-#endif /* SAC_CALCM1ANDM2_H */ +diff --git a/libSACdec/src/sac_dec.cpp b/libSACdec/src/sac_dec.cpp +deleted file mode 100644 +index 4537d6e..0000000 +--- a/libSACdec/src/sac_dec.cpp ++++ /dev/null +@@ -1,1509 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Decoder Library +- +-*******************************************************************************/ +- +-#include "sac_dec_errorcodes.h" +-#include "sac_dec.h" +- +-#include "sac_process.h" +-#include "sac_bitdec.h" +-#include "sac_smoothing.h" +-#include "sac_calcM1andM2.h" +-#include "sac_reshapeBBEnv.h" +-#include "sac_stp.h" +-#include "sac_rom.h" +- +-#include "FDK_decorrelate.h" +- +-#include "FDK_trigFcts.h" +-#include "FDK_matrixCalloc.h" +- +-/* static int pbStrideTable[] = {1, 2, 5, 28}; see sac_rom.cpp */ +- +-enum { +- APPLY_M2_NONE = 0, /* init value */ +- APPLY_M2 = 1, /* apply m2 fallback implementation */ +- APPLY_M2_MODE212 = 2, /* apply m2 for 212 mode */ +- APPLY_M2_MODE212_Res_PhaseCoding = +- 3 /* apply m2 for 212 mode with residuals and phase coding */ +-}; +- +-/******************************************************************************************/ +-/* function: FDK_SpatialDecInitDefaultSpatialSpecificConfig */ +-/* output: struct of type SPATIAL_SPECIFIC_CONFIG */ +-/* input: core coder audio object type */ +-/* input: nr of core channels */ +-/* input: sampling rate */ +-/* input: nr of time slots */ +-/* input: decoder level */ +-/* input: flag indicating upmix type blind */ +-/* */ +-/* returns: error code */ +-/******************************************************************************************/ +-int FDK_SpatialDecInitDefaultSpatialSpecificConfig( +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, int coreChannels, int samplingFreq, +- int nTimeSlots, int decoderLevel, int isBlind) { +- return SpatialDecDefaultSpecificConfig(pSpatialSpecificConfig, coreCodec, +- samplingFreq, nTimeSlots, decoderLevel, +- isBlind, coreChannels); +-} +- +-/******************************************************************************************/ +-/* function: FDK_SpatialDecCompareSpatialSpecificConfigHeader */ +-/* input: 2 pointers to a ssc */ +-/* */ +-/* output: - */ +-/* returns: error code (0 = equal, <>0 unequal) */ +-/******************************************************************************************/ +-int FDK_SpatialDecCompareSpatialSpecificConfigHeader( +- SPATIAL_SPECIFIC_CONFIG *pSsc1, SPATIAL_SPECIFIC_CONFIG *pSsc2) { +- int result = MPS_OK; +- +- /* we assume: every bit must be equal */ +- if (FDKmemcmp(pSsc1, pSsc2, sizeof(SPATIAL_SPECIFIC_CONFIG)) != 0) { +- result = MPS_UNEQUAL_SSC; +- } +- return result; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecClearFrameData +- ******************************************************************************* +- +- Description: Clear/Fake frame data to avoid misconfiguration and allow proper +- error concealment. +- Arguments: +- Input: self (frame data) +- Output: No return value. +- +-*******************************************************************************/ +-static void SpatialDecClearFrameData( +- spatialDec *self, /* Shall be removed */ +- SPATIAL_BS_FRAME *bsFrame, const SACDEC_CREATION_PARAMS *const setup) { +- int i; +- +- FDK_ASSERT(self != NULL); +- FDK_ASSERT(bsFrame != NULL); +- FDK_ASSERT(setup != NULL); +- +- /* do not apply shaping tools (GES or STP) */ +- for (i = 0; i < setup->maxNumOutputChannels; +- i += 1) { /* MAX_OUTPUT_CHANNELS */ +- bsFrame->tempShapeEnableChannelSTP[i] = 0; +- bsFrame->tempShapeEnableChannelGES[i] = 0; +- } +- +- bsFrame->TsdData->bsTsdEnable = 0; +- +- /* use only 1 parameter set at the end of the frame */ +- bsFrame->numParameterSets = 1; +- bsFrame->paramSlot[0] = self->timeSlots - 1; +- +- /* parameter smoothing tool set to off */ +- bsFrame->bsSmoothMode[0] = 0; +- +- /* reset residual data */ +- { +- int resQmfBands, resTimeSlots = (1); +- +- resQmfBands = setup->maxNumQmfBands; +- +- for (i = 0; i < setup->bProcResidual +- ? fMin(setup->maxNumResChannels, +- setup->maxNumOttBoxes + setup->maxNumInputChannels) +- : 0; +- i += 1) { +- for (int j = 0; j < resTimeSlots; j += 1) { +- for (int k = 0; k < resQmfBands; k += 1) { +- self->qmfResidualReal__FDK[i][j][k] = FL2FXCONST_DBL(0.0f); +- self->qmfResidualImag__FDK[i][j][k] = FL2FXCONST_DBL(0.0f); +- } +- } +- } +- } +- +- return; +-} +- +-/******************************************************************************* +- Functionname: FDK_SpatialDecOpen +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-spatialDec *FDK_SpatialDecOpen(const SPATIAL_DEC_CONFIG *config, +- int stereoConfigIndex) { +- int i; +- int lfSize, hfSize; +- spatialDec *self = NULL; +- SACDEC_CREATION_PARAMS setup; +- +- switch (config->decoderLevel) { +- case DECODER_LEVEL_0: /* 212 maxNumOutputChannels== 2 */ +- setup.maxNumInputChannels = 1; +- setup.maxNumOutputChannels = 2; +- setup.maxNumQmfBands = 64; +- setup.maxNumXChannels = 2; +- setup.maxNumVChannels = 2; +- setup.maxNumDecorChannels = 1; +- setup.bProcResidual = 1; +- setup.maxNumResidualChannels = 0; +- setup.maxNumOttBoxes = 1; +- setup.maxNumParams = setup.maxNumInputChannels + setup.maxNumOttBoxes; +- break; +- default: +- return NULL; +- } +- +- setup.maxNumResChannels = 1; +- +- { +- switch (config->maxNumOutputChannels) { +- case OUTPUT_CHANNELS_2_0: +- setup.maxNumOutputChannels = fMin(setup.maxNumOutputChannels, 2); +- break; +- case OUTPUT_CHANNELS_DEFAULT: +- default: +- break; +- } +- } +- +- setup.maxNumHybridBands = SacGetHybridSubbands(setup.maxNumQmfBands); +- +- switch (config->decoderMode) { +- case EXT_HQ_ONLY: +- setup.maxNumCmplxQmfBands = setup.maxNumQmfBands; +- setup.maxNumCmplxHybBands = setup.maxNumHybridBands; +- break; +- default: +- setup.maxNumCmplxQmfBands = fixMax(PC_NUM_BANDS, setup.maxNumQmfBands); +- setup.maxNumCmplxHybBands = +- fixMax(PC_NUM_HYB_BANDS, setup.maxNumHybridBands); +- break; +- } /* switch config->decoderMode */ +- +- FDK_ALLOCATE_MEMORY_1D_INT(self, 1, spatialDec, SECT_DATA_L2) +- +- self->createParams = setup; +- +- FDK_ALLOCATE_MEMORY_1D(self->param2hyb, MAX_PARAMETER_BANDS + 1, int) +- +- FDK_ALLOCATE_MEMORY_1D(self->numOttBands, setup.maxNumOttBoxes, int) +- +- /* allocate arrays */ +- +- FDK_ALLOCATE_MEMORY_1D(self->smgTime, MAX_PARAMETER_SETS, int) +- FDK_ALLOCATE_MEMORY_2D(self->smgData, MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, +- UCHAR) +- +- FDK_ALLOCATE_MEMORY_3D(self->ottCLD__FDK, setup.maxNumOttBoxes, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_3D(self->ottICC__FDK, setup.maxNumOttBoxes, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_3D(self->ottIPD__FDK, setup.maxNumOttBoxes, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- +- /* Last parameters from prev frame */ +- FDK_ALLOCATE_MEMORY_2D(self->ottCLDidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_2D(self->ottICCidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_3D(self->ottICCdiffidx, setup.maxNumOttBoxes, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_2D(self->ottIPDidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_2D(self->arbdmxGainIdxPrev, setup.maxNumInputChannels, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_2D(self->cmpOttCLDidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_2D(self->cmpOttICCidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_3D(self->outIdxData, setup.maxNumOttBoxes, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- +- FDK_ALLOCATE_MEMORY_3D(self->arbdmxGain__FDK, setup.maxNumInputChannels, +- MAX_PARAMETER_SETS, MAX_PARAMETER_BANDS, SCHAR) +- FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlpha__FDK, setup.maxNumInputChannels, +- FIXP_DBL) +- FDK_ALLOCATE_MEMORY_1D(self->arbdmxAlphaPrev__FDK, setup.maxNumInputChannels, +- FIXP_DBL) +- FDK_ALLOCATE_MEMORY_2D(self->cmpArbdmxGainIdxPrev, setup.maxNumInputChannels, +- MAX_PARAMETER_BANDS, SCHAR) +- +- FDK_ALLOCATE_MEMORY_2D(self->cmpOttIPDidxPrev, setup.maxNumOttBoxes, +- MAX_PARAMETER_BANDS, SCHAR) +- +- FDK_ALLOCATE_MEMORY_3D_INT(self->M2Real__FDK, setup.maxNumOutputChannels, +- setup.maxNumVChannels, MAX_PARAMETER_BANDS, +- FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_3D(self->M2Imag__FDK, setup.maxNumOutputChannels, +- setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL) +- +- FDK_ALLOCATE_MEMORY_3D_INT(self->M2RealPrev__FDK, setup.maxNumOutputChannels, +- setup.maxNumVChannels, MAX_PARAMETER_BANDS, +- FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_3D(self->M2ImagPrev__FDK, setup.maxNumOutputChannels, +- setup.maxNumVChannels, MAX_PARAMETER_BANDS, FIXP_DBL) +- +- FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED( +- self->qmfInputReal__FDK, setup.maxNumInputChannels, setup.maxNumQmfBands, +- FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED( +- self->qmfInputImag__FDK, setup.maxNumInputChannels, +- setup.maxNumCmplxQmfBands, FIXP_DBL, SECT_DATA_L2) +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputReal__FDK, setup.maxNumInputChannels, +- setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybInputImag__FDK, setup.maxNumInputChannels, +- setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2) +- +- if (setup.bProcResidual) { +- FDK_ALLOCATE_MEMORY_1D(self->qmfResidualReal__FDK, setup.maxNumResChannels, +- FIXP_DBL **) +- FDK_ALLOCATE_MEMORY_1D(self->qmfResidualImag__FDK, setup.maxNumResChannels, +- FIXP_DBL **) +- +- FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK, setup.maxNumResChannels, +- FIXP_DBL *) +- FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK, setup.maxNumResChannels, +- FIXP_DBL *) +- +- for (i = 0; i < setup.maxNumResChannels; i++) { +- int resQmfBands = (config->decoderMode == EXT_LP_ONLY) +- ? PC_NUM_BANDS +- : setup.maxNumQmfBands; +- int resHybBands = (config->decoderMode == EXT_LP_ONLY) +- ? PC_NUM_HYB_BANDS +- : setup.maxNumHybridBands; +- /* Alignment is needed for USAC residuals because QMF analysis directly +- * writes to this buffer. */ +- FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualReal__FDK[i], (1), +- resQmfBands, FIXP_DBL, SECT_DATA_L1) +- FDK_ALLOCATE_MEMORY_2D_INT_ALIGNED(self->qmfResidualImag__FDK[i], (1), +- resQmfBands, FIXP_DBL, SECT_DATA_L1) +- +- FDK_ALLOCATE_MEMORY_1D(self->hybResidualReal__FDK[i], +- setup.maxNumHybridBands, FIXP_DBL) +- FDK_ALLOCATE_MEMORY_1D(self->hybResidualImag__FDK[i], resHybBands, +- FIXP_DBL) +- } +- } /* if (setup.bProcResidual) */ +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->wReal__FDK, setup.maxNumVChannels, +- setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D_INT(self->wImag__FDK, setup.maxNumVChannels, +- setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2) +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealDry__FDK, +- setup.maxNumOutputChannels, +- setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagDry__FDK, +- setup.maxNumOutputChannels, +- setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2) +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputRealWet__FDK, +- setup.maxNumOutputChannels, +- setup.maxNumHybridBands, FIXP_DBL, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D_INT(self->hybOutputImagWet__FDK, +- setup.maxNumOutputChannels, +- setup.maxNumCmplxHybBands, FIXP_DBL, SECT_DATA_L2) +- +- FDK_ALLOCATE_MEMORY_1D(self->hybridSynthesis, setup.maxNumOutputChannels, +- FDK_SYN_HYB_FILTER) +- +- FDK_ALLOCATE_MEMORY_1D( +- self->hybridAnalysis, +- setup.bProcResidual ? setup.maxNumInputChannels + setup.maxNumResChannels +- : setup.maxNumInputChannels, +- FDK_ANA_HYB_FILTER) +- +- lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID; +- { +- hfSize = +- BUFFER_LEN_HF * ((setup.maxNumQmfBands - MAX_QMF_BANDS_TO_HYBRID) + +- (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID)); +- } +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFdmx, +- setup.maxNumInputChannels, lfSize, FIXP_DBL, +- SECT_DATA_L2) { +- FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFdmx, +- setup.maxNumInputChannels, hfSize, FIXP_DBL) +- } +- +- for (i = 0; i < setup.maxNumInputChannels; i++) { +- FIXP_DBL *pHybridAnaStatesHFdmx; +- +- pHybridAnaStatesHFdmx = self->pHybridAnaStatesHFdmx[i]; +- +- FDKhybridAnalysisOpen(&self->hybridAnalysis[i], +- self->pHybridAnaStatesLFdmx[i], +- lfSize * sizeof(FIXP_DBL), pHybridAnaStatesHFdmx, +- hfSize * sizeof(FIXP_DBL)); +- } +- if (setup.bProcResidual) { +- lfSize = 2 * BUFFER_LEN_LF * MAX_QMF_BANDS_TO_HYBRID; +- hfSize = BUFFER_LEN_HF * +- ((((config->decoderMode == EXT_LP_ONLY) ? PC_NUM_BANDS +- : setup.maxNumQmfBands) - +- MAX_QMF_BANDS_TO_HYBRID) + +- (setup.maxNumCmplxQmfBands - MAX_QMF_BANDS_TO_HYBRID)); +- +- FDK_ALLOCATE_MEMORY_2D_INT(self->pHybridAnaStatesLFres, +- setup.maxNumResChannels, lfSize, FIXP_DBL, +- SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_2D(self->pHybridAnaStatesHFres, setup.maxNumResChannels, +- hfSize, FIXP_DBL) +- +- for (i = setup.maxNumInputChannels; +- i < (setup.maxNumInputChannels + setup.maxNumResChannels); i++) { +- FDKhybridAnalysisOpen( +- &self->hybridAnalysis[i], +- self->pHybridAnaStatesLFres[i - setup.maxNumInputChannels], +- lfSize * sizeof(FIXP_DBL), +- self->pHybridAnaStatesHFres[i - setup.maxNumInputChannels], +- hfSize * sizeof(FIXP_DBL)); +- } +- } +- +- FDK_ALLOCATE_MEMORY_1D(self->smoothState, 1, SMOOTHING_STATE) +- FDK_ALLOCATE_MEMORY_1D(self->reshapeBBEnvState, 1, RESHAPE_BBENV_STATE) +- +- FDK_ALLOCATE_MEMORY_1D(self->apDecor, setup.maxNumDecorChannels, DECORR_DEC) +- FDK_ALLOCATE_MEMORY_2D_INT(self->pDecorBufferCplx, setup.maxNumDecorChannels, +- (2 * ((825) + (373))), FIXP_DBL, SECT_DATA_L2) +- +- for (i = 0; i < setup.maxNumDecorChannels; i++) { +- if (FDKdecorrelateOpen(&self->apDecor[i], self->pDecorBufferCplx[i], +- (2 * ((825) + (373))))) { +- goto bail; +- } +- } +- +- if (subbandTPCreate(&self->hStpDec) != MPS_OK) { +- goto bail; +- } +- +- /* save general decoder configuration */ +- self->decoderLevel = config->decoderLevel; +- self->decoderMode = config->decoderMode; +- self->binauralMode = config->binauralMode; +- +- /* preinitialize configuration */ +- self->partiallyComplex = (config->decoderMode != EXT_HQ_ONLY) ? 1 : 0; +- +- /* Set to default state */ +- SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_ALL); +- +- /* Everything is fine so return the handle */ +- return self; +- +-bail: +- /* Collector for all errors. +- Deallocate all memory and return a invalid handle. */ +- FDK_SpatialDecClose(self); +- +- return NULL; +-} +- +-/******************************************************************************* +- Functionname: isValidConfig +- ******************************************************************************* +- +- Description: Validate if configuration is supported in present instance +- +- Arguments: +- +- Return: 1: all okay +- 0: configuration not supported +-*******************************************************************************/ +-static int isValidConfig(spatialDec const *const self, +- const SPATIAL_DEC_UPMIX_TYPE upmixType, +- SPATIALDEC_PARAM const *const pUserParams, +- const AUDIO_OBJECT_TYPE coreAot) { +- UPMIXTYPE nUpmixType; +- +- FDK_ASSERT(self != NULL); +- FDK_ASSERT(pUserParams != NULL); +- +- nUpmixType = (UPMIXTYPE)upmixType; +- +- switch (nUpmixType) { +- case UPMIXTYPE_BYPASS: /* UPMIX_TYPE_BYPASS */ +- break; +- case UPMIXTYPE_NORMAL: /* UPMIX_TYPE_NORMAL */ +- break; +- default: +- return 0; /* unsupported upmixType */ +- } +- +- return 1; /* upmixType supported */ +-} +- +-static SACDEC_ERROR CheckLevelTreeUpmixType( +- const SACDEC_CREATION_PARAMS *const pCreateParams, +- const SPATIAL_SPECIFIC_CONFIG *const pSsc, const int decoderLevel, +- const UPMIXTYPE upmixType) { +- SACDEC_ERROR err = MPS_OK; +- int nOutputChannels, treeConfig; +- +- FDK_ASSERT(pCreateParams != NULL); +- FDK_ASSERT(pSsc != NULL); +- +- treeConfig = pSsc->treeConfig; +- +- switch (decoderLevel) { +- case 0: { +- if (treeConfig != SPATIALDEC_MODE_RSVD7) { +- err = MPS_INVALID_TREECONFIG; +- goto bail; +- } +- break; +- } +- default: +- err = MPS_INVALID_PARAMETER /* MPS_UNIMPLEMENTED */; +- goto bail; +- } +- +- switch (upmixType) { +- case UPMIXTYPE_BYPASS: +- nOutputChannels = pSsc->nInputChannels; +- break; +- default: +- nOutputChannels = pSsc->nOutputChannels; +- break; +- } +- +- /* Is sufficient memory allocated. */ +- if ((pSsc->nInputChannels > pCreateParams->maxNumInputChannels) || +- (nOutputChannels > pCreateParams->maxNumOutputChannels) || +- (pSsc->nOttBoxes > pCreateParams->maxNumOttBoxes)) { +- err = MPS_INVALID_PARAMETER; +- } +- +-bail: +- return err; +-} +- +-void SpatialDecInitParserContext(spatialDec *self) { +- int i, j; +- +- for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) { +- for (j = 0; j < MAX_PARAMETER_BANDS; j++) { +- self->ottCLDidxPrev[i][j] = 0; +- self->ottICCidxPrev[i][j] = 0; +- self->cmpOttCLDidxPrev[i][j] = 0; +- self->cmpOttICCidxPrev[i][j] = 0; +- } +- } +- for (i = 0; i < self->createParams.maxNumInputChannels; i++) { +- for (j = 0; j < MAX_PARAMETER_BANDS; j++) { +- self->arbdmxGainIdxPrev[i][j] = 0; +- self->cmpArbdmxGainIdxPrev[i][j] = 0; +- } +- } +-} +- +-/******************************************************************************* +- Functionname: FDK_SpatialDecInit +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +- +-SACDEC_ERROR FDK_SpatialDecInit(spatialDec *self, SPATIAL_BS_FRAME *frame, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- int nQmfBands, +- SPATIAL_DEC_UPMIX_TYPE const upmixType, +- SPATIALDEC_PARAM *pUserParams, UINT initFlags) { +- SACDEC_ERROR err = MPS_OK; +- int nCh, i, j, k; +- int maxQmfBands; +- int bypassMode = 0; +- +- self->useFDreverb = 0; +- +- /* check configuration parameter */ +- if (!isValidConfig(self, upmixType, pUserParams, +- pSpatialSpecificConfig->coreCodec)) { +- return MPS_INVALID_PARAMETER; +- } +- +- /* check tree configuration */ +- err = CheckLevelTreeUpmixType(&self->createParams, pSpatialSpecificConfig, +- self->decoderLevel, (UPMIXTYPE)upmixType); +- if (err != MPS_OK) { +- goto bail; +- } +- +- /* Store and update instance after all checks passed successfully: */ +- self->upmixType = (UPMIXTYPE)upmixType; +- +- if (initFlags & MPEGS_INIT_PARAMS_ERROR_CONCEALMENT) { /* At least one error +- concealment +- parameter changed */ +- err = SpatialDecConcealment_SetParam( +- &self->concealInfo, SAC_DEC_CONCEAL_METHOD, pUserParams->concealMethod); +- if (err != MPS_OK) { +- goto bail; +- } +- err = SpatialDecConcealment_SetParam(&self->concealInfo, +- SAC_DEC_CONCEAL_NUM_KEEP_FRAMES, +- pUserParams->concealNumKeepFrames); +- if (err != MPS_OK) { +- goto bail; +- } +- err = SpatialDecConcealment_SetParam( +- &self->concealInfo, SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH, +- pUserParams->concealFadeOutSlopeLength); +- if (err != MPS_OK) { +- goto bail; +- } +- err = SpatialDecConcealment_SetParam(&self->concealInfo, +- SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH, +- pUserParams->concealFadeInSlopeLength); +- if (err != MPS_OK) { +- goto bail; +- } +- err = SpatialDecConcealment_SetParam(&self->concealInfo, +- SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES, +- pUserParams->concealNumReleaseFrames); +- if (err != MPS_OK) { +- goto bail; +- } +- } +- +- if (initFlags & +- MPEGS_INIT_STATES_ERROR_CONCEALMENT) { /* Set to default state */ +- SpatialDecConcealment_Init(&self->concealInfo, MPEGS_CONCEAL_RESET_STATE); +- } +- +- /* determine bypass mode */ +- bypassMode |= pUserParams->bypassMode; +- bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0); +- +- /* static decoder scale depends on number of qmf bands */ +- switch (nQmfBands) { +- case 16: +- case 24: +- case 32: +- self->staticDecScale = 21; +- break; +- case 64: +- self->staticDecScale = 22; +- break; +- default: +- return MPS_INVALID_PARAMETER; +- } +- +- self->numParameterSetsPrev = 1; +- +- self->qmfBands = nQmfBands; +- /* self->hybridBands will be updated in SpatialDecDecodeHeader() below. */ +- +- self->bShareDelayWithSBR = 0; +- +- err = SpatialDecDecodeHeader(self, pSpatialSpecificConfig); +- if (err != MPS_OK) { +- goto bail; +- } +- +- self->stereoConfigIndex = pSpatialSpecificConfig->stereoConfigIndex; +- +- if (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) { +- self->qmfInputDelayBufPos = 0; +- self->pc_filterdelay = 1; /* Division by 0 not possible */ +- } +- +- maxQmfBands = self->qmfBands; +- +- /* init residual decoder */ +- +- /* init tonality smoothing */ +- if (initFlags & MPEGS_INIT_STATES_PARAM) { +- initParameterSmoothing(self); +- } +- +- /* init GES */ +- initBBEnv(self, (initFlags & MPEGS_INIT_STATES_GES) ? 1 : 0); +- +- /* Clip protection is applied only for normal processing. */ +- if (!isTwoChMode(self->upmixType) && !bypassMode) { +- self->staticDecScale += self->clipProtectGainSF__FDK; +- } +- +- { +- UINT flags = 0; +- INT initStatesFlag = (initFlags & MPEGS_INIT_STATES_ANA_QMF_FILTER) ? 1 : 0; +- INT useLdFilter = +- (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) ? 1 : 0; +- +- flags = self->pQmfDomain->globalConf.flags_requested; +- flags &= (~(UINT)QMF_FLAG_LP); +- +- if (initStatesFlag) +- flags &= ~QMF_FLAG_KEEP_STATES; +- else +- flags |= QMF_FLAG_KEEP_STATES; +- +- if (useLdFilter) +- flags |= QMF_FLAG_MPSLDFB; +- else +- flags &= ~QMF_FLAG_MPSLDFB; +- +- self->pQmfDomain->globalConf.flags_requested = flags; +- FDK_QmfDomain_Configure(self->pQmfDomain); +- +- /* output scaling */ +- for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) { +- int outputScale = 0, outputGain_e = 0, scale = 0; +- FIXP_DBL outputGain_m = getChGain(self, nCh, &outputGain_e); +- +- if (!isTwoChMode(self->upmixType) && !bypassMode) { +- outputScale += +- self->clipProtectGainSF__FDK; /* consider clip protection scaling at +- synthesis qmf */ +- } +- +- scale = outputScale; +- +- qmfChangeOutScalefactor(&self->pQmfDomain->QmfDomainOut[nCh].fb, scale); +- qmfChangeOutGain(&self->pQmfDomain->QmfDomainOut[nCh].fb, outputGain_m, +- outputGain_e); +- } +- } +- +- for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) { +- FDKhybridSynthesisInit(&self->hybridSynthesis[nCh], THREE_TO_TEN, +- self->qmfBands, maxQmfBands); +- } +- +- /* for input, residual channels and arbitrary down-mix residual channels */ +- for (nCh = 0; nCh < self->createParams.maxNumInputChannels; nCh++) { +- FDKhybridAnalysisInit( +- &self->hybridAnalysis[nCh], THREE_TO_TEN, self->qmfBands, maxQmfBands, +- (initFlags & MPEGS_INIT_STATES_ANA_HYB_FILTER) ? 1 : 0); +- } +- for (; nCh < (self->createParams.bProcResidual +- ? (self->createParams.maxNumInputChannels + +- self->createParams.maxNumResChannels) +- : self->createParams.maxNumInputChannels); +- nCh++) { +- FDKhybridAnalysisInit(&self->hybridAnalysis[nCh], THREE_TO_TEN, maxQmfBands, +- maxQmfBands, 0); +- } +- +- { +- for (k = 0; k < self->numDecorSignals; k++) { +- int errCode, idec; +- FDK_DECORR_TYPE decorrType = DECORR_PS; +- decorrType = DECORR_LD; +- if (self->pConfigCurrent->syntaxFlags & +- (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) { +- decorrType = +- ((self->treeConfig == TREE_212) && (self->decorrType == DECORR_PS)) +- ? DECORR_PS +- : DECORR_USAC; +- } +- { +- idec = k; +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) { +- if (self->treeConfig == TREE_212 && k == 0) { +- idec = 2; +- } +- } +- } +- errCode = FDKdecorrelateInit( +- &self->apDecor[k], self->hybridBands, decorrType, DUCKER_AUTOMATIC, +- self->decorrConfig, idec, 0, /* self->partiallyComplex */ +- 0, 0, /* isLegacyPS */ +- (initFlags & MPEGS_INIT_STATES_DECORRELATOR) ? 1 : 0); +- if (errCode) return MPS_NOTOK; +- } +- } /* !self->partiallyComplex */ +- +- err = initM1andM2(self, (initFlags & MPEGS_INIT_STATES_M1M2) ? 1 : 0, +- (initFlags & MPEGS_INIT_CONFIG) ? 1 : 0); +- if (err != MPS_OK) return err; +- +- /* Initialization of previous frame data */ +- if (initFlags & MPEGS_INIT_STATES_PARAM) { +- for (i = 0; i < self->createParams.maxNumOttBoxes; i += 1) { +- /* reset icc diff data */ +- for (k = 0; k < MAX_PARAMETER_SETS; k += 1) { +- for (j = 0; j < MAX_PARAMETER_BANDS; j += 1) { +- self->ottICCdiffidx[i][k][j] = 0; +- } +- } +- } +- /* Parameter Smoothing */ +- /* robustness: init with one of the values of smgTimeTable[] = {64, 128, +- 256, 512} to avoid division by zero in calcFilterCoeff__FDK() */ +- self->smoothState->prevSmgTime = smgTimeTable[2]; /* == 256 */ +- FDKmemclear(self->smoothState->prevSmgData, +- MAX_PARAMETER_BANDS * sizeof(UCHAR)); +- FDKmemclear(self->smoothState->opdLeftState__FDK, +- MAX_PARAMETER_BANDS * sizeof(FIXP_DBL)); +- FDKmemclear(self->smoothState->opdRightState__FDK, +- MAX_PARAMETER_BANDS * sizeof(FIXP_DBL)); +- } +- +- self->prevTimeSlot = -1; +- self->curTimeSlot = +- MAX_TIME_SLOTS + 1; /* Initialize with a invalid value to trigger +- concealment if first frame has no valid data. */ +- self->curPs = 0; +- +- subbandTPInit(self->hStpDec); +- +-bail: +- return err; +-} +- +-void SpatialDecChannelProperties(spatialDec *self, +- AUDIO_CHANNEL_TYPE channelType[], +- UCHAR channelIndices[], +- const FDK_channelMapDescr *const mapDescr) { +- if ((self == NULL) || (channelType == NULL) || (channelIndices == NULL) || +- (mapDescr == NULL)) { +- return; /* no extern buffer to be filled */ +- } +- +- if (self->numOutputChannelsAT != +- treePropertyTable[self->treeConfig].numOutputChannels) { +- int ch; +- /* Declare all channels to be front channels: */ +- for (ch = 0; ch < self->numOutputChannelsAT; ch += 1) { +- channelType[ch] = ACT_FRONT; +- channelIndices[ch] = ch; +- } +- } else { +- /* ISO/IEC FDIS 23003-1:2006(E), page 46, Table 40 bsTreeConfig */ +- switch (self->treeConfig) { +- case TREE_212: +- channelType[0] = ACT_FRONT; +- channelIndices[0] = 0; +- channelType[1] = ACT_FRONT; +- channelIndices[1] = 1; +- break; +- default:; +- } +- } +-} +- +-/******************************************************************************* +- Functionname: FDK_SpatialDecClose +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +- +-void FDK_SpatialDecClose(spatialDec *self) { +- if (self) { +- int k; +- +- if (self->apDecor != NULL) { +- for (k = 0; k < self->createParams.maxNumDecorChannels; k++) { +- FDKdecorrelateClose(&(self->apDecor[k])); +- } +- FDK_FREE_MEMORY_1D(self->apDecor); +- } +- if (self->pDecorBufferCplx != NULL) { +- FDK_FREE_MEMORY_2D(self->pDecorBufferCplx); +- } +- +- subbandTPDestroy(&self->hStpDec); +- +- FDK_FREE_MEMORY_1D(self->reshapeBBEnvState); +- FDK_FREE_MEMORY_1D(self->smoothState); +- +- FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFdmx); +- FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFdmx); +- FDK_FREE_MEMORY_2D(self->pHybridAnaStatesLFres); +- FDK_FREE_MEMORY_2D(self->pHybridAnaStatesHFres); +- FDK_FREE_MEMORY_1D(self->hybridAnalysis); +- +- FDK_FREE_MEMORY_1D(self->hybridSynthesis); +- +- /* The time buffer is passed to the decoder from outside to avoid copying +- * (zero copy). */ +- /* FDK_FREE_MEMORY_2D(self->timeOut__FDK); */ +- +- FDK_FREE_MEMORY_2D(self->hybOutputImagWet__FDK); +- FDK_FREE_MEMORY_2D(self->hybOutputRealWet__FDK); +- +- FDK_FREE_MEMORY_2D(self->hybOutputImagDry__FDK); +- FDK_FREE_MEMORY_2D(self->hybOutputRealDry__FDK); +- +- FDK_FREE_MEMORY_2D(self->wImag__FDK); +- FDK_FREE_MEMORY_2D(self->wReal__FDK); +- +- if (self->createParams.bProcResidual) { +- int i; +- +- for (i = 0; i < self->createParams.maxNumResChannels; i++) { +- if (self->hybResidualImag__FDK != NULL) +- FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK[i]); +- if (self->hybResidualReal__FDK != NULL) +- FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK[i]); +- if (self->qmfResidualImag__FDK != NULL) +- FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualImag__FDK[i]); +- if (self->qmfResidualReal__FDK != NULL) +- FDK_FREE_MEMORY_2D_ALIGNED(self->qmfResidualReal__FDK[i]); +- } +- +- FDK_FREE_MEMORY_1D(self->hybResidualImag__FDK); +- FDK_FREE_MEMORY_1D(self->hybResidualReal__FDK); +- +- FDK_FREE_MEMORY_1D(self->qmfResidualImag__FDK); +- FDK_FREE_MEMORY_1D(self->qmfResidualReal__FDK); +- +- } /* self->createParams.bProcResidual */ +- +- FDK_FREE_MEMORY_2D(self->hybInputImag__FDK); +- FDK_FREE_MEMORY_2D(self->hybInputReal__FDK); +- +- FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputImag__FDK); +- FDK_FREE_MEMORY_2D_ALIGNED(self->qmfInputReal__FDK); +- +- FDK_FREE_MEMORY_3D(self->M2ImagPrev__FDK); +- +- FDK_FREE_MEMORY_3D(self->M2RealPrev__FDK); +- +- FDK_FREE_MEMORY_3D(self->M2Imag__FDK); +- +- FDK_FREE_MEMORY_3D(self->M2Real__FDK); +- +- FDK_FREE_MEMORY_1D(self->arbdmxAlphaPrev__FDK); +- FDK_FREE_MEMORY_1D(self->arbdmxAlpha__FDK); +- +- FDK_FREE_MEMORY_3D(self->arbdmxGain__FDK); +- +- FDK_FREE_MEMORY_3D(self->ottIPD__FDK); +- FDK_FREE_MEMORY_3D(self->ottICC__FDK); +- FDK_FREE_MEMORY_3D(self->ottCLD__FDK); +- +- /* Last parameters from prev frame */ +- FDK_FREE_MEMORY_2D(self->ottCLDidxPrev); +- FDK_FREE_MEMORY_2D(self->ottICCidxPrev); +- FDK_FREE_MEMORY_3D(self->ottICCdiffidx); +- FDK_FREE_MEMORY_2D(self->ottIPDidxPrev); +- FDK_FREE_MEMORY_2D(self->arbdmxGainIdxPrev); +- +- FDK_FREE_MEMORY_2D(self->cmpOttCLDidxPrev); +- FDK_FREE_MEMORY_2D(self->cmpOttICCidxPrev); +- FDK_FREE_MEMORY_3D(self->outIdxData); +- FDK_FREE_MEMORY_2D(self->cmpOttIPDidxPrev); +- FDK_FREE_MEMORY_2D(self->cmpArbdmxGainIdxPrev); +- +- FDK_FREE_MEMORY_2D(self->smgData); +- FDK_FREE_MEMORY_1D(self->smgTime); +- +- FDK_FREE_MEMORY_1D(self->numOttBands); +- +- FDK_FREE_MEMORY_1D(self->param2hyb); +- +- FDK_FREE_MEMORY_1D(self); +- } +- +- return; +-} +- +-/** +- * \brief Apply Surround bypass buffer copies +- * \param self spatialDec handle +- * \param hybInputReal +- * \param hybInputImag +- * \param hybOutputReal +- * \param hybOutputImag +- * \param numInputChannels amount if input channels available in hybInputReal +- * and hybInputImag, which may differ from self->numInputChannels. +- */ +-static void SpatialDecApplyBypass(spatialDec *self, FIXP_DBL **hybInputReal, +- FIXP_DBL **hybInputImag, +- FIXP_DBL **hybOutputReal, +- FIXP_DBL **hybOutputImag, +- const int numInputChannels) { +- int complexHybBands; +- +- complexHybBands = self->hybridBands; +- +- { +- int ch; +- int rf = -1, lf = -1, cf = -1; /* Right Front, Left Front, Center Front */ +- +- /* Determine output channel indices according to tree config */ +- switch (self->treeConfig) { +- case TREE_212: /* 212 */ +- lf = 0; +- rf = 1; +- break; +- default:; +- } +- +- /* Note: numInputChannels might not match the tree config ! */ +- switch (numInputChannels) { +- case 1: +- if (cf > 0) { +- FDKmemcpy(hybOutputReal[cf], hybInputReal[0], +- self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputImag[cf], hybInputImag[0], +- complexHybBands * sizeof(FIXP_DBL)); +- } else { +- FDKmemcpy(hybOutputReal[lf], hybInputReal[0], +- self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputReal[rf], hybInputReal[0], +- self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputImag[lf], hybInputImag[0], +- complexHybBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputImag[rf], hybInputImag[0], +- complexHybBands * sizeof(FIXP_DBL)); +- } +- break; +- case 2: +- FDK_ASSERT(lf != -1); +- FDK_ASSERT(rf != -1); +- FDKmemcpy(hybOutputReal[lf], hybInputReal[0], +- self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputReal[rf], hybInputReal[1], +- self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputImag[lf], hybInputImag[0], +- complexHybBands * sizeof(FIXP_DBL)); +- FDKmemcpy(hybOutputImag[rf], hybInputImag[1], +- complexHybBands * sizeof(FIXP_DBL)); +- break; +- } +- for (ch = 0; ch < self->numOutputChannelsAT; ch++) { +- if (ch == lf || ch == rf || ch == cf) { +- continue; /* Skip bypassed channels */ +- } +- FDKmemclear(hybOutputReal[ch], self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemclear(hybOutputImag[ch], complexHybBands * sizeof(FIXP_DBL)); +- } +- } +-} +- +-/******************************************************************************* +- Functionname: SpatialDecApplyParameterSets +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Return: +- +-*******************************************************************************/ +-static SACDEC_ERROR SpatialDecApplyParameterSets( +- spatialDec *self, const SPATIAL_BS_FRAME *frame, SPATIALDEC_INPUT_MODE mode, +- PCM_MPS *inData, /* Time domain input */ +- FIXP_DBL **qmfInDataReal, /* QMF domain data l/r */ +- FIXP_DBL **qmfInDataImag, /* QMF domain data l/r */ +- UINT nSamples, UINT controlFlags, int numInputChannels, +- const FDK_channelMapDescr *const mapDescr) { +- SACDEC_ERROR err = MPS_OK; +- +- FIXP_SGL alpha; +- +- int ts; +- int ch; +- int hyb; +- +- int prevSlot = self->prevTimeSlot; +- int ps = self->curPs; +- int ts_io = 0; /* i/o dependent slot */ +- int bypassMode = (controlFlags & MPEGS_BYPASSMODE) ? 1 : 0; +- +- /* Bypass can be triggered by the upmixType, too. */ +- bypassMode |= ((self->upmixType == UPMIXTYPE_BYPASS) ? 1 : 0); +- +- /* +- * Decode available slots +- */ +- for (ts = self->curTimeSlot; +- ts <= fixMin(self->curTimeSlot + (int)nSamples / self->qmfBands - 1, +- self->timeSlots - 1); +- ts++, ts_io++) { +- int currSlot = frame->paramSlot[ps]; +- +- /* +- * Get new parameter set +- */ +- if (ts == prevSlot + 1) { +- err = SpatialDecCalculateM1andM2(self, ps, +- frame); /* input: ottCLD, ottICC, ... */ +- /* output: M1param(Real/Imag), M2(Real/Imag) */ +- if (err != MPS_OK) { +- bypassMode = 1; +- if (self->errInt == MPS_OK) { +- /* store internal error befor it gets overwritten */ +- self->errInt = err; +- } +- err = MPS_OK; +- } +- +- if ((ps == 0) && (self->bOverwriteM1M2prev != 0)) { +- /* copy matrix entries of M1/M2 of the first parameter set to the +- previous matrices (of the last frame). This avoids the interpolation +- of incompatible values. E.g. for residual bands the coefficients are +- calculated differently compared to non-residual bands. +- */ +- SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */ +- /* output: M(1/2)param(Real/Imag)Prev */ +- self->bOverwriteM1M2prev = 0; +- } +- +- SpatialDecSmoothM1andM2( +- self, frame, +- ps); /* input: M1param(Real/Imag)(Prev), M2(Real/Imag)(Prev) */ +- /* output: M1param(Real/Imag), M2(Real/Imag) */ +- } +- +- alpha = FX_DBL2FX_SGL(fDivNorm(ts - prevSlot, currSlot - prevSlot)); +- +- switch (mode) { +- case INPUTMODE_QMF_SBR: +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) +- self->bShareDelayWithSBR = 0; /* We got no hybrid delay */ +- else +- self->bShareDelayWithSBR = 1; +- SpatialDecFeedQMF(self, qmfInDataReal, qmfInDataImag, ts_io, bypassMode, +- self->qmfInputReal__FDK, self->qmfInputImag__FDK, +- self->numInputChannels); +- break; +- case INPUTMODE_TIME: +- self->bShareDelayWithSBR = 0; +- SpatialDecQMFAnalysis(self, inData, ts_io, bypassMode, +- self->qmfInputReal__FDK, self->qmfInputImag__FDK, +- self->numInputChannels); +- break; +- default: +- break; +- } +- +- if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) && +- self->residualCoding) { +- int offset; +- ch = 1; +- +- offset = self->pQmfDomain->globalConf.nBandsSynthesis * +- self->pQmfDomain->globalConf.nQmfTimeSlots; +- +- { +- const PCM_MPS *inSamples = +- &inData[ts * self->pQmfDomain->globalConf.nBandsAnalysis]; +- +- CalculateSpaceAnalysisQmf( +- &self->pQmfDomain->QmfDomainIn[ch].fb, inSamples + (ch * offset), +- self->qmfResidualReal__FDK[0][0], self->qmfResidualImag__FDK[0][0]); +- +- if (!isTwoChMode(self->upmixType) && !bypassMode) { +- int i; +- FIXP_DBL *RESTRICT self_qmfResidualReal__FDK_0_0 = +- &self->qmfResidualReal__FDK[0][0][0]; +- FIXP_DBL *RESTRICT self_qmfResidualImag__FDK_0_0 = +- &self->qmfResidualImag__FDK[0][0][0]; +- +- if ((self->pQmfDomain->globalConf.nBandsAnalysis == 24) && +- !(self->stereoConfigIndex == 3)) { +- for (i = 0; i < self->qmfBands; i++) { +- self_qmfResidualReal__FDK_0_0[i] = +- fMult(self_qmfResidualReal__FDK_0_0[i] << 1, +- self->clipProtectGain__FDK); +- self_qmfResidualImag__FDK_0_0[i] = +- fMult(self_qmfResidualImag__FDK_0_0[i] << 1, +- self->clipProtectGain__FDK); +- } +- } else { +- for (i = 0; i < self->qmfBands; i++) { +- self_qmfResidualReal__FDK_0_0[i] = fMult( +- self_qmfResidualReal__FDK_0_0[i], self->clipProtectGain__FDK); +- self_qmfResidualImag__FDK_0_0[i] = fMult( +- self_qmfResidualImag__FDK_0_0[i], self->clipProtectGain__FDK); +- } +- } +- } +- } +- } +- +- SpatialDecHybridAnalysis( +- self, /* input: qmfInput(Real/Imag), qmfResidual(Real/Imag) */ +- self->qmfInputReal__FDK, self->qmfInputImag__FDK, +- self->hybInputReal__FDK, self->hybInputImag__FDK, ts, numInputChannels); +- +- if (bypassMode) { +- SpatialDecApplyBypass( +- self, self->hybInputReal__FDK, /* input: hybInput(Real/Imag) */ +- self->hybInputImag__FDK, +- self->hybOutputRealDry__FDK, /* output: hybOutput(Real/Imag)Dry */ +- self->hybOutputImagDry__FDK, numInputChannels); +- } else /* !bypassMode */ +- { +- FIXP_DBL *pxReal[MAX_NUM_XCHANNELS] = {NULL}; +- FIXP_DBL *pxImag[MAX_NUM_XCHANNELS] = {NULL}; +- +- SpatialDecCreateX(self, +- self->hybInputReal__FDK, /* input: hybInput(Real/Imag), +- hybResidual(Real/Imag) */ +- self->hybInputImag__FDK, pxReal, pxImag); +- +- { +- SpatialDecApplyM1_CreateW_Mode212( +- self, frame, pxReal, pxImag, +- self->wReal__FDK, /* output: w(Real/Imag) */ +- self->wImag__FDK); +- } +- if (err != MPS_OK) goto bail; +- +- int applyM2Config = APPLY_M2_NONE; +- +- applyM2Config = APPLY_M2; +- if ((self->pConfigCurrent->syntaxFlags & +- (SACDEC_SYNTAX_USAC | SACDEC_SYNTAX_RSVD50)) && +- (self->tempShapeConfig != 1) && (self->tempShapeConfig != 2)) { +- if (self->phaseCoding == 3) +- applyM2Config = APPLY_M2_MODE212_Res_PhaseCoding; +- else +- applyM2Config = APPLY_M2_MODE212; +- } +- +- switch (applyM2Config) { +- case APPLY_M2_MODE212: { +- err = SpatialDecApplyM2_Mode212( +- self, ps, alpha, self->wReal__FDK, self->wImag__FDK, +- self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK); +- } break; +- case APPLY_M2_MODE212_Res_PhaseCoding: +- err = SpatialDecApplyM2_Mode212_ResidualsPlusPhaseCoding( +- self, ps, alpha, self->wReal__FDK, self->wImag__FDK, +- self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK); +- break; +- case APPLY_M2: +- err = SpatialDecApplyM2( +- self, ps, alpha, self->wReal__FDK, self->wImag__FDK, +- self->hybOutputRealDry__FDK, self->hybOutputImagDry__FDK, +- self->hybOutputRealWet__FDK, self->hybOutputImagWet__FDK); +- break; +- default: +- err = MPS_APPLY_M2_ERROR; +- goto bail; +- } +- +- if (err != MPS_OK) goto bail; +- +- if ((self->tempShapeConfig == 2) && (!isTwoChMode(self->upmixType))) { +- SpatialDecReshapeBBEnv(self, frame, +- ts); /* input: reshapeBBEnvState, +- hybOutput(Real/Imag)(Dry/Wet), +- hybInput(Real/Imag) */ +- } /* output: hybOutput(Real/Imag)Dry */ +- +- /* Merge parts of the dry and wet QMF buffers. */ +- if ((self->tempShapeConfig == 1) && (!isTwoChMode(self->upmixType))) { +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- for (hyb = 0; hyb < self->tp_hybBandBorder; hyb++) { +- self->hybOutputRealDry__FDK[ch][hyb] += +- self->hybOutputRealWet__FDK[ch][hyb]; +- self->hybOutputImagDry__FDK[ch][hyb] += +- self->hybOutputImagWet__FDK[ch][hyb]; +- } /* loop hyb */ +- } /* loop ch */ +- err = subbandTPApply( +- self, frame); /* input: hStpDec, hybOutput(Real/Imag)Dry/Wet */ +- /* output: hStpDec, hybOutput(Real/Imag)Dry */ +- if (err != MPS_OK) goto bail; +- } /* (self->tempShapeConfig == 1) */ +- else { +- /* The wet signal is added to the dry signal in applyM2 if GES and STP +- * are disabled */ +- if ((self->tempShapeConfig == 1) || (self->tempShapeConfig == 2)) { +- int nHybBands; +- nHybBands = self->hybridBands; +- +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- FIXP_DBL *RESTRICT pRealDry = self->hybOutputRealDry__FDK[ch]; +- FIXP_DBL *RESTRICT pImagDry = self->hybOutputImagDry__FDK[ch]; +- FIXP_DBL *RESTRICT pRealWet = self->hybOutputRealWet__FDK[ch]; +- FIXP_DBL *RESTRICT pImagWet = self->hybOutputImagWet__FDK[ch]; +- for (hyb = 0; hyb < nHybBands; hyb++) { +- pRealDry[hyb] += pRealWet[hyb]; +- pImagDry[hyb] += pImagWet[hyb]; +- } /* loop hyb */ +- for (; hyb < self->hybridBands; hyb++) { +- pRealDry[hyb] += pRealWet[hyb]; +- } /* loop hyb */ +- } /* loop ch */ +- } /* ( self->tempShapeConfig == 1 ) || ( self->tempShapeConfig == 2 ) */ +- } /* !self->tempShapeConfig == 1 */ +- } /* !bypassMode */ +- +- if (self->phaseCoding == 1) { +- /* only if bsPhaseCoding == 1 and bsResidualCoding == 0 */ +- +- SpatialDecApplyPhase( +- self, alpha, (ts == currSlot) /* signal the last slot of the set */ +- ); +- } +- +- /* +- * Synthesis Filtering +- */ +- +- err = SpatialDecSynthesis( +- self, ts_io, +- self->hybOutputRealDry__FDK, /* input: hybOutput(Real/Imag)Dry */ +- self->hybOutputImagDry__FDK, self->timeOut__FDK, /* output: timeOut */ +- numInputChannels, mapDescr); +- +- if (err != MPS_OK) goto bail; +- +- /* +- * Update parameter buffer +- */ +- if (ts == currSlot) { +- SpatialDecBufferMatrices(self); /* input: M(1/2)param(Real/Imag) */ +- /* output: M(1/2)param(Real/Imag)Prev */ +- +- prevSlot = currSlot; +- ps++; +- } /* if (ts==currSlot) */ +- +- } /* ts loop */ +- +- /* +- * Save parameter states +- */ +- self->prevTimeSlot = prevSlot; +- self->curTimeSlot = ts; +- self->curPs = ps; +- +-bail: +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecApplyFrame( +- spatialDec *self, +- SPATIAL_BS_FRAME *frame, /* parsed frame data to be applied */ +- SPATIALDEC_INPUT_MODE inputMode, PCM_MPS *inData, /* Time domain input */ +- FIXP_DBL **qmfInDataReal, /* QMF domain data l/r */ +- FIXP_DBL **qmfInDataImag, /* QMF domain data l/r */ +- PCM_MPS *pcmOutBuf, /* MAX_OUTPUT_CHANNELS*MAX_TIME_SLOTS*NUM_QMF_BANDS] */ +- UINT nSamples, UINT *pControlFlags, int numInputChannels, +- const FDK_channelMapDescr *const mapDescr) { +- SACDEC_ERROR err = MPS_OK; +- +- int fDecAndMapFrameData; +- int controlFlags; +- +- FDK_ASSERT(self != NULL); +- FDK_ASSERT(pControlFlags != NULL); +- FDK_ASSERT(pcmOutBuf != NULL); +- +- self->errInt = err; /* Init internal error */ +- +- controlFlags = *pControlFlags; +- +- if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) && +- (self->stereoConfigIndex > 1)) { +- numInputChannels = +- 1; /* Do not count residual channel as input channel. It is handled +- seperately. */ +- } +- +- /* Check if input amount of channels is consistent */ +- if (numInputChannels != self->numInputChannels) { +- controlFlags |= MPEGS_CONCEAL; +- if (numInputChannels > self->createParams.maxNumInputChannels) { +- return MPS_INVALID_PARAMETER; +- } +- } +- +- self->timeOut__FDK = pcmOutBuf; +- +- /* Determine local function control flags */ +- fDecAndMapFrameData = frame->newBsData; +- +- if (((fDecAndMapFrameData == +- 0) /* assures that conceal flag will not be set for blind mode */ +- && (self->curTimeSlot + (int)nSamples / self->qmfBands > +- self->timeSlots)) || +- (frame->numParameterSets == +- 0)) { /* New input samples but missing side info */ +- fDecAndMapFrameData = 1; +- controlFlags |= MPEGS_CONCEAL; +- } +- +- if ((fDecAndMapFrameData == 0) && +- (frame->paramSlot[fMax(0, frame->numParameterSets - 1)] != +- (self->timeSlots - 1) || +- self->curTimeSlot > +- frame->paramSlot[self->curPs])) { /* Detected faulty parameter slot +- data. */ +- fDecAndMapFrameData = 1; +- controlFlags |= MPEGS_CONCEAL; +- } +- +- /* Update concealment state machine */ +- SpatialDecConcealment_UpdateState( +- &self->concealInfo, +- (controlFlags & MPEGS_CONCEAL) +- ? 0 +- : 1); /* convert from conceal flag to frame ok flag */ +- +- if (fDecAndMapFrameData) { +- /* Reset spatial framing control vars */ +- frame->newBsData = 0; +- self->prevTimeSlot = -1; +- self->curTimeSlot = 0; +- self->curPs = 0; +- +- if (controlFlags & MPEGS_CONCEAL) { +- /* Reset frame data to avoid misconfiguration. */ +- SpatialDecClearFrameData(self, frame, &self->createParams); +- } +- +- { +- err = SpatialDecDecodeFrame(self, frame); /* input: ... */ +- /* output: decodeAndMapFrameDATA */ +- } +- +- if (err != MPS_OK) { +- /* Rescue strategy is to apply bypass mode in order +- to keep at least the downmix channels continuous. */ +- controlFlags |= MPEGS_CONCEAL; +- if (self->errInt == MPS_OK) { +- /* store internal error befor it gets overwritten */ +- self->errInt = err; +- } +- } +- } +- +- err = SpatialDecApplyParameterSets( +- self, frame, inputMode, inData, qmfInDataReal, qmfInDataImag, nSamples, +- controlFlags | ((err == MPS_OK) ? 0 : MPEGS_BYPASSMODE), numInputChannels, +- mapDescr); +- if (err != MPS_OK) { +- goto bail; +- } +- +-bail: +- +- *pControlFlags = controlFlags; +- +- return err; +-} +diff --git a/libSACdec/src/sac_dec.h b/libSACdec/src/sac_dec.h +deleted file mode 100644 +index 992acad..0000000 +--- a/libSACdec/src/sac_dec.h ++++ /dev/null +@@ -1,539 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Decoder Library structures +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_H +-#define SAC_DEC_H +- +-#include "common_fix.h" +- +-#include "sac_dec_interface.h" /* library interface in ../include */ +- +-#include "FDK_qmf_domain.h" +-#include "sac_qmf.h" +-#include "FDK_bitstream.h" /* mp4 bitbuffer */ +-#include "sac_calcM1andM2.h" +-#include "FDK_hybrid.h" +-#include "FDK_decorrelate.h" +-#include "sac_reshapeBBEnv.h" +- +-#include "sac_dec_conceal.h" +- +-#include "sac_tsd.h" +- +-#ifndef MAX +-#define MAX(a, b) ((a) > (b) ? (a) : (b)) +-#endif +- +-#define ICCdefault 0 +-#define IPDdefault 0 +-#define arbdmxGainDefault 0 +-#define CPCdefault 10 +-#define tttCLD1default 15 +-#define tttCLD2default 0 +- +-#define IS_HQ_ONLY(aot) \ +- ((aot) == AOT_ER_AAC_LD || (aot) == AOT_ER_AAC_ELD || (aot) == AOT_USAC || \ +- (aot) == AOT_RSVD50) +- +-#define SCONST(x) FL2FXCONST_DBL(x) +- +-#define PC_NUM_BANDS (8) +-#define PC_NUM_HYB_BANDS (PC_NUM_BANDS - 3 + 10) +-#define ABS_THR (1e-9f * 32768 * 32768) +- +-#define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10) +-#define HYBRID_FILTER_DELAY (6) +- +-#define MAX_RESIDUAL_FRAMES (4) +-#define MAX_RESIDUAL_BISTREAM \ +- (836) /* 48000 bps * 3 res / (8 * 44100 / 2048 ) */ +-#define MAX_MDCT_COEFFS (1024) +-#define SACDEC_RESIDUAL_BS_BUF_SIZE \ +- (1024) /* used to setup and check residual bitstream buffer */ +- +-#define MAX_NUM_PARAMS (MAX_NUM_OTT + 4 * MAX_NUM_TTT + MAX_INPUT_CHANNELS) +-#define MAX_NUM_PARAMETERS (MAX(MAX_NUM_PARAMS, MAX_NUM_OTT)) +- +-#define MAX_PARAMETER_SETS (9) +- +-#define MAX_M2_INPUT (MAX_OUTPUT_CHANNELS) /* 3 direct + 5 diffuse */ +- +-#define MAX_QMF_BANDS_TO_HYBRID \ +- (3) /* 3 bands are filtered again in "40 bands" case */ +-#define PROTO_LEN (13) +-#define BUFFER_LEN_LF (PROTO_LEN) +-#define BUFFER_LEN_HF ((PROTO_LEN - 1) / 2) +- +-#define MAX_NO_DECORR_CHANNELS (MAX_OUTPUT_CHANNELS) +-#define HRTF_AZIMUTHS (5) +- +-#define MAX_NUM_OTT_AT 0 +- +-/* left out */ +- +-typedef enum { +- UPMIXTYPE_BYPASS = -1, /*just bypass the input channels without processing*/ +- UPMIXTYPE_NORMAL = 0 /*multichannel loudspeaker upmix with spatial data*/ +-} UPMIXTYPE; +- +-static inline int isTwoChMode(UPMIXTYPE upmixType) { +- int retval = 0; +- return retval; +-} +- +- /* left out end */ +- +-#define MPEGS_BYPASSMODE (0x00000001) +-#define MPEGS_CONCEAL (0x00000002) +- +-typedef struct STP_DEC *HANDLE_STP_DEC; +- +-typedef struct { +- SCHAR bsQuantCoarseXXXprev; +- SCHAR bsQuantCoarseXXXprevParse; +-} LOSSLESSSTATE; +- +-typedef struct { +- SCHAR bsXXXDataMode[MAX_PARAMETER_SETS]; +- SCHAR bsQuantCoarseXXX[MAX_PARAMETER_SETS]; +- SCHAR bsFreqResStrideXXX[MAX_PARAMETER_SETS]; +- SCHAR nocmpQuantCoarseXXX[MAX_PARAMETER_SETS]; +- LOSSLESSSTATE *state; /* Link to persistent state information */ +-} LOSSLESSDATA; +- +-struct SPATIAL_BS_FRAME_struct { +- UCHAR bsIndependencyFlag; +- UCHAR newBsData; +- UCHAR numParameterSets; +- +- /* +- If bsFramingType == 0, then the paramSlot[ps] for 0 <= ps < numParamSets is +- calculated as follows: paramSlot[ps] = ceil(numSlots*(ps+1)/numParamSets) - 1 +- Otherwise, it is +- paramSlot[ps] = bsParamSlot[ps] +- */ +- INT paramSlot[MAX_PARAMETER_SETS]; +- +- /* These arrays contain the compact indices, only one value per pbstride, only +- * paramsets actually containing data. */ +- /* These values are written from the parser in ecDataDec() and read during +- * decode in mapIndexData() */ +- SCHAR cmpOttCLDidx[MAX_NUM_OTT + MAX_NUM_OTT_AT][MAX_PARAMETER_SETS] +- [MAX_PARAMETER_BANDS]; +- SCHAR cmpOttICCidx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; +- +- /* Smoothing */ +- UCHAR bsSmoothMode[MAX_PARAMETER_SETS]; +- UCHAR bsSmoothTime[MAX_PARAMETER_SETS]; +- UCHAR bsFreqResStrideSmg[MAX_PARAMETER_SETS]; +- UCHAR bsSmgData[MAX_PARAMETER_SETS] +- [MAX_PARAMETER_BANDS]; /* smoothing flags, one if band is +- smoothed, otherwise zero */ +- +- /* Arbitrary Downmix */ +- SCHAR (*cmpArbdmxGainIdx)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; +- +- /* Lossless control */ +- LOSSLESSDATA *CLDLosslessData; +- LOSSLESSDATA *ICCLosslessData; +- /* LOSSLESSDATA *ADGLosslessData; -> is stored in CLDLosslessData[offset] */ +- +- LOSSLESSDATA *IPDLosslessData; +- SCHAR (*cmpOttIPDidx)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; +- int phaseMode; +- int OpdSmoothingMode; +- +- UCHAR tempShapeEnableChannelGES[MAX_OUTPUT_CHANNELS]; /*!< GES side info. */ +- UCHAR bsEnvShapeData[MAX_OUTPUT_CHANNELS] +- [MAX_TIME_SLOTS]; /*!< GES side info (quantized). */ +- +- UCHAR tempShapeEnableChannelSTP[MAX_OUTPUT_CHANNELS]; /*!< STP side info. */ +- +- TSD_DATA TsdData[1]; /*!< TSD data structure. */ +-}; +- +-typedef struct { +- /* Lossless state */ +- LOSSLESSSTATE CLDLosslessState[MAX_NUM_PARAMETERS]; +- LOSSLESSSTATE ICCLosslessState[MAX_NUM_PARAMETERS]; +- LOSSLESSSTATE IPDLosslessState[MAX_NUM_PARAMETERS]; +-} BS_LL_STATE; +- +-typedef struct { +- int prevParamSlot; +- int prevSmgTime; +- UCHAR prevSmgData[MAX_PARAMETER_BANDS]; +- +- FIXP_DBL opdLeftState__FDK[MAX_PARAMETER_BANDS]; +- FIXP_DBL opdRightState__FDK[MAX_PARAMETER_BANDS]; +- +-} SMOOTHING_STATE; +- +-typedef struct { +- FIXP_DBL alpha__FDK; +- FIXP_DBL beta__FDK; +- FIXP_DBL partNrgPrev__FDK[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS] +- [BB_ENV_SIZE]; +- FIXP_DBL normNrgPrev__FDK[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +- FIXP_DBL frameNrgPrev__FDK[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +- INT partNrgPrevSF[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +- INT partNrgPrev2SF[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +- INT normNrgPrevSF[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +- INT frameNrgPrevSF[2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS]; +-} RESHAPE_BBENV_STATE; +- +-typedef struct { +- int maxNumInputChannels; +- int maxNumOutputChannels; +- int maxNumQmfBands; +- int maxNumHybridBands; +- int maxNumXChannels; +- int maxNumVChannels; +- int maxNumDecorChannels; +- int maxNumCmplxQmfBands; +- int maxNumCmplxHybBands; +- int maxNumResChannels; +- int bProcResidual; /* process residual */ +- int maxNumResidualChannels; +- int maxNumOttBoxes; +- int maxNumParams; +- +-} SACDEC_CREATION_PARAMS; +- +-struct spatialDec_struct { +- SACDEC_ERROR +- errInt; /* Field to store internal errors. +- Will be clear at the very beginning of each process call. */ +- int staticDecScale; /* static scale of decoder */ +- +- /* GENERAL */ +- int samplingFreq; /* [Hz] */ +- CFG_LEVEL decoderLevel; /* 0..5 */ +- CFG_EXTENT decoderMode; +- CFG_BINAURAL binauralMode; +- +- SACDEC_CREATION_PARAMS createParams; +- +- int numComplexProcessingBands; +- +- int treeConfig; /* TREE_5151 = 5151, TREE_5152 = 5152, TREE_525 = 525, defined +- in sac_bitdec.h */ +- +- int numInputChannels; /* 1 (M) or 2 (L,R) */ +- int numOutputChannels; /* 6 for 3/2.1 (FL,FR,FC,LF,BL,BR) */ +- int numOttBoxes; /* number of ott boxes */ +- int numM2rows; +- +- int numOutputChannelsAT; /* Number of output channels after arbitrary tree +- processing */ +- +- int quantMode; /* QUANT_FINE, QUANT_EBQ1, QUANT_EBQ2, defined in sac_bitdec.h +- */ +- int arbitraryDownmix; /* (arbitraryDownmix != 0) 1 arbitrary downmix data +- present, 2 arbitrary downmix residual data present*/ +- int residualCoding; /* (residualCoding != 0) => residual coding data present +- */ +- UCHAR nrResidualFrame; +- UCHAR nrArbDownmixResidualFrame; +- FDK_BITSTREAM **hResidualBitstreams; +- int tempShapeConfig; /* */ +- int decorrType; /* Indicates to use PS or none PS decorrelator. */ +- int decorrConfig; /* chosen decorrelator */ +- int envQuantMode; /* quantization mode of envelope reshaping data */ +- +- FIXP_DBL clipProtectGain__FDK; /* global gain for upmix */ +- char clipProtectGainSF__FDK; /* global gain for upmix */ +- +- /* Currently ignoring center decorr +- numVChannels = numDirektSignals + numDecorSignals */ +- int numDirektSignals; /* needed for W, Number of direkt signals 515 -> 1 525 +- -> 3 */ +- int wStartResidualIdx; /* Where to start read residuals for W, = 0 for 515, = +- 1 for 525 since one residual is used in V */ +- int numDecorSignals; /* needed for W, Number of residual and decorrelated +- signals, = 2, 3 for center deccorelation*/ +- int numVChannels; /* direct signals + decorelator signals */ +- int numXChannels; /* direct input signals + TTT-residuals */ +- +- int timeSlots; /* length of spatial frame in QMF samples */ +- int curTimeSlot; /* pointer to the current time slot used for hyperframing */ +- int prevTimeSlot; /* */ +- int curPs; +- int frameLength; /* number of output waveform samples/channel/frame */ +- UPMIXTYPE upmixType; +- int partiallyComplex; +- int useFDreverb; +- +- int bShareDelayWithSBR; +- +- int tp_hybBandBorder; /* Hybrid band indicating the HP filter cut-off. */ +- +- /* FREQUENCY MAPPING */ +- int qmfBands; +- int hybridBands; +- const SCHAR *kernels; /* Mapping hybrid band to parameter band. */ +- +- int TsdTs; /**< TSD QMF slot counter 0<= ts < numSlots */ +- +- int *param2hyb; /* Mapping parameter bands to hybrid bands */ +- int kernels_width[MAX_PARAMETER_BANDS]; /* Mapping parmeter band to hybrid +- band offsets. */ +- +- /* Residual coding */ +- int residualSamplingFreq; +- UCHAR residualPresent[MAX_NUM_OTT + MAX_NUM_TTT]; +- UCHAR residualBands[MAX_NUM_OTT + MAX_NUM_TTT]; /* 0, if no residual data +- present for this box */ +- UCHAR residualQMFBands[MAX_NUM_OTT + MAX_NUM_TTT]; /* needed for optimized +- mdct2qmf calculation */ +- SPATIAL_SPECIFIC_CONFIG *pConfigCurrent; +- +- int arbdmxFramesPerSpatialFrame; +- int arbdmxUpdQMF; +- +- int numParameterBands; /* Number of parameter bands 40, 28, 20, 14, 10, ... +- .*/ +- int bitstreamParameterBands; +- int *numOttBands; /* number of bands for each ott, is != numParameterBands for +- LFEs */ +- +- /* 1 MAPPING */ +- UCHAR extendFrame; +- UCHAR numParameterSetsPrev; +- +- int *smgTime; +- UCHAR **smgData; +- +- /* PARAMETER DATA decoded and dequantized */ +- +- /* Last parameters from prev frame required during decode in mapIndexData() +- * and not touched during parse */ +- SCHAR **ottCLDidxPrev; +- SCHAR **ottICCidxPrev; +- SCHAR **arbdmxGainIdxPrev; +- SCHAR **ottIPDidxPrev; +- SCHAR ***outIdxData; /* is this really persistent memory ? */ +- +- /* State mem required during parse in SpatialDecParseFrameData() */ +- SCHAR **cmpOttCLDidxPrev; +- SCHAR **cmpOttICCidxPrev; +- SCHAR ***ottICCdiffidx; +- SCHAR **cmpOttIPDidxPrev; +- +- /* State mem required in parseArbitraryDownmixData */ +- SCHAR **cmpArbdmxGainIdxPrev; +- +- SCHAR ***ottCLD__FDK; +- SCHAR ***ottICC__FDK; +- +- SCHAR ***arbdmxGain__FDK; /* Holds the artistic downmix correction index.*/ +- +- FIXP_DBL *arbdmxAlpha__FDK; +- FIXP_DBL *arbdmxAlphaPrev__FDK; +- +- UCHAR stereoConfigIndex; +- int highRateMode; +- +- int phaseCoding; +- +- SCHAR ***ottIPD__FDK; +- +- FIXP_DBL PhaseLeft__FDK[MAX_PARAMETER_BANDS]; +- FIXP_DBL PhaseRight__FDK[MAX_PARAMETER_BANDS]; +- FIXP_DBL PhasePrevLeft__FDK[MAX_PARAMETER_BANDS]; +- FIXP_DBL PhasePrevRight__FDK[MAX_PARAMETER_BANDS]; +- int numOttBandsIPD; +- +- /* GAIN MATRICIES FOR CURRENT and PREVIOUS PARMATER SET(s)*/ +- FIXP_DBL ***M2Real__FDK; +- FIXP_DBL ***M2Imag__FDK; +- FIXP_DBL ***M2RealPrev__FDK; +- FIXP_DBL ***M2ImagPrev__FDK; +- +- /* INPUT SIGNALS */ +- FIXP_DBL ***qmfInputRealDelayBuffer__FDK; +- FIXP_DBL ***qmfInputImagDelayBuffer__FDK; +- +- int pc_filterdelay; /* additional delay to align HQ with LP before hybird +- analysis */ +- int qmfInputDelayBufPos; +- FIXP_DBL **qmfInputReal__FDK; +- FIXP_DBL **qmfInputImag__FDK; +- +- FIXP_DBL **hybInputReal__FDK; +- FIXP_DBL **hybInputImag__FDK; +- +- FIXP_DBL **binInputReverb; +- +- FIXP_DBL binGain, reverbGain; +- FIXP_DBL binCenterGain, reverbCenterGain; +- +- /* RESIDUAL SIGNALS */ +- +- FIXP_DBL ***qmfResidualReal__FDK; +- FIXP_DBL ***qmfResidualImag__FDK; +- +- FIXP_DBL **hybResidualReal__FDK; +- FIXP_DBL **hybResidualImag__FDK; +- +- int qmfOutputRealDryDelayBufPos; +- FIXP_DBL ***qmfOutputRealDryDelayBuffer__FDK; +- FIXP_DBL ***qmfOutputImagDryFilterBuffer__FDK; +- FIXP_DBL *qmfOutputImagDryFilterBufferBase__FDK; +- +- /* TEMPORARY SIGNALS */ +- +- FIXP_DBL **wReal__FDK; +- FIXP_DBL **wImag__FDK; +- +- /* OUTPUT SIGNALS */ +- FIXP_DBL **hybOutputRealDry__FDK; +- FIXP_DBL **hybOutputImagDry__FDK; +- FIXP_DBL **hybOutputRealWet__FDK; +- FIXP_DBL **hybOutputImagWet__FDK; +- PCM_MPS *timeOut__FDK; +- +- HANDLE_FDK_QMF_DOMAIN pQmfDomain; +- +- FDK_ANA_HYB_FILTER +- *hybridAnalysis; /*!< pointer Analysis hybrid filterbank array. */ +- FDK_SYN_HYB_FILTER +- *hybridSynthesis; /*!< pointer Synthesis hybrid filterbank array. */ +- FIXP_DBL ** +- pHybridAnaStatesLFdmx; /*!< pointer to analysis hybrid filter states LF */ +- FIXP_DBL ** +- pHybridAnaStatesHFdmx; /*!< pointer to analysis hybrid filter states HF */ +- FIXP_DBL ** +- pHybridAnaStatesLFres; /*!< pointer to analysis hybrid filter states LF */ +- FIXP_DBL ** +- pHybridAnaStatesHFres; /*!< pointer to analysis hybrid filter states HF */ +- +- DECORR_DEC *apDecor; /*!< pointer decorrelator array. */ +- FIXP_DBL **pDecorBufferCplx; +- +- SMOOTHING_STATE *smoothState; /*!< Pointer to smoothing states. */ +- +- RESHAPE_BBENV_STATE *reshapeBBEnvState; /*!< GES handle. */ +- SCHAR row2channelDmxGES[MAX_OUTPUT_CHANNELS]; +- +- HANDLE_STP_DEC hStpDec; /*!< STP handle. */ +- +- const UCHAR *pActivM2ParamBands; +- +- int bOverwriteM1M2prev; /* Overwrite previous M2/M2 params with first set of +- new frame after SSC change (aka +- decodeAfterConfigHasChangedFlag). */ +- SpatialDecConcealmentInfo concealInfo; +-}; +- +-#define SACDEC_SYNTAX_MPS 1 +-#define SACDEC_SYNTAX_USAC 2 +-#define SACDEC_SYNTAX_RSVD50 4 +-#define SACDEC_SYNTAX_L2 8 +-#define SACDEC_SYNTAX_L3 16 +-#define SACDEC_SYNTAX_LD 32 +- +-static inline int GetProcBand(spatialDec_struct *self, int qs) { +- return self->kernels[qs]; +-} +- +-#endif /* SAC_DEC_H */ +diff --git a/libSACdec/src/sac_dec_conceal.cpp b/libSACdec/src/sac_dec_conceal.cpp +deleted file mode 100644 +index dfeef7b..0000000 +--- a/libSACdec/src/sac_dec_conceal.cpp ++++ /dev/null +@@ -1,392 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): Christian Ertel, Christian Griebel +- +- Description: SAC Dec error concealment +- +-*******************************************************************************/ +- +-#include "sac_dec_conceal.h" +- +-void SpatialDecConcealment_Init(SpatialDecConcealmentInfo *info, +- const UINT resetFlags) { +- FDK_ASSERT(info != NULL); +- +- if (resetFlags & MPEGS_CONCEAL_RESET_STATE) { +- info->concealState = SpatialDecConcealState_Init; +- /* Frame counters will be initialized implicitely in function +- * SpatialDecConcealment_UpdateState(). */ +- } +- +- if (resetFlags & MPEGS_CONCEAL_RESET_PARAMETER) { +- /* Set default params */ +- info->concealParams.method = MPEGS_CONCEAL_DEFAULT_METHOD; +- info->concealParams.numKeepFrames = MPEGS_CONCEAL_DEFAULT_NUM_KEEP_FRAMES; +- info->concealParams.numFadeOutFrames = +- MPEGS_CONCEAL_DEFAULT_FADE_OUT_SLOPE_LENGTH; +- info->concealParams.numFadeInFrames = +- MPEGS_CONCEAL_DEFAULT_FADE_IN_SLOPE_LENGTH; +- info->concealParams.numReleaseFrames = +- MPEGS_CONCEAL_DEFAULT_NUM_RELEASE_FRAMES; +- } +- +- return; +-} +- +-int SpatialDecConcealment_Apply( +- SpatialDecConcealmentInfo *info, +- const SCHAR (*cmpIdxData)[MAX_PARAMETER_BANDS], SCHAR **diffIdxData, +- SCHAR * +- idxPrev, /* char +- idxPrev[SPATIALDEC_MAX_NUM_OTT][SPATIALDEC_MAX_PARAMETER_BANDS], +- */ +- SCHAR *bsXXXDataMode, const int startBand, const int stopBand, +- const SCHAR defaultValue, const int paramType, const int numParamSets) { +- int appliedProcessing = 0; +- int band, dataMode = -1; +- +- FDK_ASSERT(info != NULL); +- FDK_ASSERT(cmpIdxData != NULL); +- FDK_ASSERT(idxPrev != NULL); +- FDK_ASSERT(bsXXXDataMode != NULL); +- +- /* Processing depends only on the internal state */ +- switch (info->concealState) { +- case SpatialDecConcealState_Init: +- dataMode = 0; /* default */ +- break; +- +- case SpatialDecConcealState_Ok: +- /* Nothing to do */ +- break; +- +- case SpatialDecConcealState_Keep: +- dataMode = 1; /* keep */ +- break; +- +- case SpatialDecConcealState_FadeToDefault: { +- /* Start simple fade out */ +- FIXP_DBL fac = fDivNorm(info->cntStateFrames + 1, +- info->concealParams.numFadeOutFrames + 1); +- +- for (band = startBand; band < stopBand; band += 1) { +- /* idxPrev = fac * defaultValue + (1-fac) * idxPrev; */ +- idxPrev[band] = +- fMultI(fac, defaultValue - idxPrev[band]) + idxPrev[band]; +- } +- dataMode = 1; /* keep */ +- appliedProcessing = 1; +- } break; +- +- case SpatialDecConcealState_Default: +- for (band = startBand; band < stopBand; band += 1) { +- idxPrev[band] = defaultValue; +- } +- dataMode = 1; /* keep */ +- appliedProcessing = 1; +- break; +- +- case SpatialDecConcealState_FadeFromDefault: { +- FIXP_DBL fac = fDivNorm(info->cntValidFrames + 1, +- info->concealParams.numFadeInFrames + 1); +- +- for (band = startBand; band < stopBand; band += 1) { +- /* idxPrev = fac * cmpIdxData + (1-fac) * defaultValue; */ +- idxPrev[band] = +- fMultI(fac, cmpIdxData[numParamSets - 1][band] - defaultValue) + +- defaultValue; +- } +- dataMode = 1; /* keep */ +- appliedProcessing = 1; +- } break; +- +- default: +- FDK_ASSERT(0); /* All valid states shall be handled above. */ +- break; +- } +- +- if (dataMode >= 0) { +- int i; +- for (i = 0; i < numParamSets; i += 1) { +- bsXXXDataMode[i] = dataMode; +- if (diffIdxData != NULL) { +- for (band = startBand; band < stopBand; band += 1) { +- diffIdxData[i][band] = 0; +- } +- } +- } +- } +- +- return appliedProcessing; +-} +- +-void SpatialDecConcealment_UpdateState(SpatialDecConcealmentInfo *info, +- const int frameOk) { +- FDK_ASSERT(info != NULL); +- +- if (frameOk) { +- info->cntValidFrames += 1; +- } else { +- info->cntValidFrames = 0; +- } +- +- switch (info->concealState) { +- case SpatialDecConcealState_Init: +- if (frameOk) { +- /* NEXT STATE: Ok */ +- info->concealState = SpatialDecConcealState_Ok; +- info->cntStateFrames = 0; +- } +- break; +- +- case SpatialDecConcealState_Ok: +- if (!frameOk) { +- /* NEXT STATE: Keep */ +- info->concealState = SpatialDecConcealState_Keep; +- info->cntStateFrames = 0; +- } +- break; +- +- case SpatialDecConcealState_Keep: +- info->cntStateFrames += 1; +- if (frameOk) { +- /* NEXT STATE: Ok */ +- info->concealState = SpatialDecConcealState_Ok; +- } else { +- if (info->cntStateFrames >= info->concealParams.numKeepFrames) { +- if (info->concealParams.numFadeOutFrames == 0) { +- /* NEXT STATE: Default */ +- info->concealState = SpatialDecConcealState_Default; +- } else { +- /* NEXT STATE: Fade to default */ +- info->concealState = SpatialDecConcealState_FadeToDefault; +- info->cntStateFrames = 0; +- } +- } +- } +- break; +- +- case SpatialDecConcealState_FadeToDefault: +- info->cntStateFrames += 1; +- if (info->cntValidFrames > 0) { +- /* NEXT STATE: Fade in from default */ +- info->concealState = SpatialDecConcealState_FadeFromDefault; +- info->cntStateFrames = 0; +- } else { +- if (info->cntStateFrames >= info->concealParams.numFadeOutFrames) { +- /* NEXT STATE: Default */ +- info->concealState = SpatialDecConcealState_Default; +- } +- } +- break; +- +- case SpatialDecConcealState_Default: +- if (info->cntValidFrames > 0) { +- if (info->concealParams.numFadeInFrames == 0) { +- /* NEXT STATE: Ok */ +- info->concealState = SpatialDecConcealState_Ok; +- } else { +- /* NEXT STATE: Fade in from default */ +- info->concealState = SpatialDecConcealState_FadeFromDefault; +- info->cntValidFrames = 0; +- } +- } +- break; +- +- case SpatialDecConcealState_FadeFromDefault: +- info->cntValidFrames += 1; +- if (frameOk) { +- if (info->cntValidFrames >= info->concealParams.numFadeInFrames) { +- /* NEXT STATE: Ok */ +- info->concealState = SpatialDecConcealState_Ok; +- } +- } else { +- /* NEXT STATE: Fade to default */ +- info->concealState = SpatialDecConcealState_FadeToDefault; +- info->cntStateFrames = 0; +- } +- break; +- +- default: +- FDK_ASSERT(0); /* All valid states should be handled above! */ +- break; +- } +-} +- +-SACDEC_ERROR SpatialDecConcealment_SetParam(SpatialDecConcealmentInfo *self, +- const SAC_DEC_CONCEAL_PARAM param, +- const INT value) { +- SACDEC_ERROR err = MPS_OK; +- +- switch (param) { +- case SAC_DEC_CONCEAL_METHOD: +- switch ((SpatialDecConcealmentMethod)value) { +- case SAC_DEC_CONCEAL_WITH_ZERO_VALUED_OUTPUT: +- case SAC_DEC_CONCEAL_BY_FADING_PARAMETERS: +- break; +- default: +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- if (self != NULL) { +- /* store parameter value */ +- self->concealParams.method = (SpatialDecConcealmentMethod)value; +- } else { +- err = MPS_INVALID_HANDLE; +- goto bail; +- } +- break; +- case SAC_DEC_CONCEAL_NUM_KEEP_FRAMES: +- if (value < 0) { +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- if (self != NULL) { +- /* store parameter value */ +- self->concealParams.numKeepFrames = (UINT)value; +- } else { +- err = MPS_INVALID_HANDLE; +- goto bail; +- } +- break; +- case SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH: +- if (value < 0) { +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- if (self != NULL) { +- /* store parameter value */ +- self->concealParams.numFadeOutFrames = (UINT)value; +- } else { +- err = MPS_INVALID_HANDLE; +- goto bail; +- } +- break; +- case SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH: +- if (value < 0) { +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- if (self != NULL) { +- /* store parameter value */ +- self->concealParams.numFadeInFrames = (UINT)value; +- } else { +- err = MPS_INVALID_HANDLE; +- goto bail; +- } +- break; +- case SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES: +- if (value < 0) { +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- if (self != NULL) { +- /* store parameter value */ +- self->concealParams.numReleaseFrames = (UINT)value; +- } else { +- err = MPS_INVALID_HANDLE; +- goto bail; +- } +- break; +- default: +- err = MPS_INVALID_PARAMETER; +- goto bail; +- } +- +-bail: +- return err; +-} +diff --git a/libSACdec/src/sac_dec_conceal.h b/libSACdec/src/sac_dec_conceal.h +deleted file mode 100644 +index 27f5249..0000000 +--- a/libSACdec/src/sac_dec_conceal.h ++++ /dev/null +@@ -1,187 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): Christian Ertel, Christian Griebel +- +- Description: SAC Dec error concealment +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_CONCEAL_H +-#define SAC_DEC_CONCEAL_H +- +-#include "sac_dec_interface.h" +- +-/* Modules dynamic parameters: */ +-typedef enum { +- SAC_DEC_CONCEAL_METHOD = 0, +- SAC_DEC_CONCEAL_NUM_KEEP_FRAMES, +- SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH, +- SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH, +- SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES +- +-} SAC_DEC_CONCEAL_PARAM; +- +-/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ +-/* sac_dec_interface.h */ +-/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ +-typedef enum { +- SAC_DEC_CONCEAL_WITH_ZERO_VALUED_OUTPUT = 0, +- SAC_DEC_CONCEAL_BY_FADING_PARAMETERS = 1 +- +-} SpatialDecConcealmentMethod; +-/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ +- +-/* Default dynamic parameter values: */ +-#define MPEGS_CONCEAL_DEFAULT_METHOD SAC_DEC_CONCEAL_BY_FADING_PARAMETERS +-#define MPEGS_CONCEAL_DEFAULT_NUM_KEEP_FRAMES (10) +-#define MPEGS_CONCEAL_DEFAULT_FADE_OUT_SLOPE_LENGTH (5) +-#define MPEGS_CONCEAL_DEFAULT_FADE_IN_SLOPE_LENGTH (5) +-#define MPEGS_CONCEAL_DEFAULT_NUM_RELEASE_FRAMES (3) +- +-typedef enum { +- SpatialDecConcealState_Init = 0, +- SpatialDecConcealState_Ok, +- SpatialDecConcealState_Keep, +- SpatialDecConcealState_FadeToDefault, +- SpatialDecConcealState_Default, +- SpatialDecConcealState_FadeFromDefault +- +-} SpatialDecConcealmentState; +- +-typedef struct { +- SpatialDecConcealmentMethod method; +- +- UINT numKeepFrames; +- UINT numFadeOutFrames; +- UINT numFadeInFrames; +- UINT numReleaseFrames; +- +-} SpatialDecConcealmentParams; +- +-typedef struct { +- SpatialDecConcealmentParams concealParams; /* User set params */ +- SpatialDecConcealmentState +- concealState; /* State of internal state machine (fade-in/out etc) */ +- +- UINT cntStateFrames; /* Counter for fade-in/out handling */ +- UINT cntValidFrames; /* Counter for the number of consecutive good frames*/ +- +-} SpatialDecConcealmentInfo; +- +-/* Module reset flags */ +-#define MPEGS_CONCEAL_RESET_STATE (0x01) +-#define MPEGS_CONCEAL_RESET_PARAMETER (0x02) +-#define MPEGS_CONCEAL_RESET_ALL (0xFF) +- +-void SpatialDecConcealment_Init(SpatialDecConcealmentInfo *info, +- const UINT resetFlags); +- +-int SpatialDecConcealment_Apply(SpatialDecConcealmentInfo *info, +- const SCHAR (*cmpIdxData)[MAX_PARAMETER_BANDS], +- SCHAR **diffIdxData, SCHAR *idxPrev, +- SCHAR *bsXXXDataMode, const int startBand, +- const int stopBand, const SCHAR defaultValue, +- const int paramType, const int numParamSets); +- +-void SpatialDecConcealment_UpdateState(SpatialDecConcealmentInfo *info, +- const int frameOk); +- +-SACDEC_ERROR SpatialDecConcealment_SetParam(SpatialDecConcealmentInfo *info, +- const SAC_DEC_CONCEAL_PARAM param, +- const INT value); +- +-#endif /* SAC_DEC_CONCEAL_H */ +diff --git a/libSACdec/src/sac_dec_interface.h b/libSACdec/src/sac_dec_interface.h +deleted file mode 100644 +index a2eea92..0000000 +--- a/libSACdec/src/sac_dec_interface.h ++++ /dev/null +@@ -1,335 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Decoder Library Interface +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_INTERFACE_H +-#define SAC_DEC_INTERFACE_H +- +-#include "common_fix.h" +-#include "FDK_audio.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#include "sac_dec_errorcodes.h" +-#include "sac_dec_ssc_struct.h" +- +-/** +- * \brief Baseline MPEG-Surround profile Level 1-5. +- */ +-typedef enum { +- DECODER_LEVEL_0 = 0, /*!< Level 0: dummy level; 212 only */ +- DECODER_LEVEL_6 = 6 /*!< Level 6: no support */ +-} CFG_LEVEL; +- +-/* +- * \brief Number of output channels restriction. +- */ +-typedef enum { +- OUTPUT_CHANNELS_DEFAULT, /*!< Default configuration depending on Decoder Level +- */ +- OUTPUT_CHANNELS_2_0, /*!< Limitation to stereo output */ +- OUTPUT_CHANNELS_5_1 /*!< Limitation to 5.1 output */ +-} CFG_RESTRICTION; +- +-/* +- * \brief Supported decoder mode. +- */ +-typedef enum { +- EXT_HQ_ONLY = 0, /*!< High Quality processing only */ +- EXT_LP_ONLY = 1, /*!< Low Power procesing only */ +- EXT_HQ_AND_LP = 2 /*!< Support both HQ and LP processing */ +-} CFG_EXTENT; +- +-/* +- * \brief Supported binaural mode. +- */ +-typedef enum { +- BINAURAL_NONE = -1 /*!< No binaural procesing supported */ +-} CFG_BINAURAL; +- +-/** +- * \brief Decoder configuration structure. +- * +- * These structure contains all parameters necessary for decoder open function. +- * The configuration specifies the functional range of the decoder instance. +- */ +-typedef struct { +- CFG_LEVEL decoderLevel; +- CFG_EXTENT decoderMode; +- CFG_RESTRICTION maxNumOutputChannels; +- CFG_BINAURAL binauralMode; +- +-} SPATIAL_DEC_CONFIG; +- +-typedef enum { +- INPUTMODE_QMF = 1000, +- INPUTMODE_QMF_SBR = 1001, +- INPUTMODE_TIME = 1002 +-} SPATIALDEC_INPUT_MODE; +- +-/** +- * \brief MPEG Surround upmix type mode. +- **/ +-typedef enum { +- UPMIX_TYPE_BYPASS = +- -1, /*!< Bypass the downmix channels from the core decoder. */ +- UPMIX_TYPE_NORMAL = 0 /*!< Multi channel output. */ +- +-} SPATIAL_DEC_UPMIX_TYPE; +- +-/** +- * \brief Dynamic decoder parameters. +- */ +-typedef struct { +- /* Basics */ +- UCHAR outputMode; +- UCHAR blindEnable; +- UCHAR bypassMode; +- +- /* Error concealment */ +- UCHAR concealMethod; +- UINT concealNumKeepFrames; +- UINT concealFadeOutSlopeLength; +- UINT concealFadeInSlopeLength; +- UINT concealNumReleaseFrames; +- +-} SPATIALDEC_PARAM; +- +-/** +- * \brief Flags which control the initialization +- **/ +-typedef enum { +- MPEGS_INIT_NONE = 0x00000000, /*!< Indicates no initialization */ +- +- MPEGS_INIT_CONFIG = 0x00000010, /*!< Indicates a configuration change due to +- SSC value changes */ +- +- MPEGS_INIT_STATES_ANA_QMF_FILTER = +- 0x00000100, /*!< Controls the initialization of the analysis qmf filter +- states */ +- MPEGS_INIT_STATES_SYN_QMF_FILTER = +- 0x00000200, /*!< Controls the initialization of the synthesis qmf filter +- states */ +- MPEGS_INIT_STATES_ANA_HYB_FILTER = 0x00000400, /*!< Controls the +- initialization of the +- analysis hybrid filter +- states */ +- MPEGS_INIT_STATES_DECORRELATOR = +- 0x00000800, /*!< Controls the initialization of the decorrelator states */ +- MPEGS_INIT_STATES_M1M2 = 0x00002000, /*!< Controls the initialization of the +- history in m1 and m2 parameter +- calculation */ +- MPEGS_INIT_STATES_GES = 0x00004000, /*!< Controls the initialization of the +- history in the ges calculation */ +- MPEGS_INIT_STATES_REVERB = +- 0x00008000, /*!< Controls the initialization of the reverb states */ +- MPEGS_INIT_STATES_PARAM = +- 0x00020000, /*!< Controls the initialization of the history of all other +- parameter */ +- MPEGS_INIT_STATES_ERROR_CONCEALMENT = +- 0x00080000, /*!< Controls the initialization of the error concealment +- module state */ +- MPEGS_INIT_PARAMS_ERROR_CONCEALMENT = 0x00200000 /*!< Controls the +- initialization of the +- whole error concealment +- parameter set */ +- +-} MPEGS_INIT_CTRL_FLAGS; +- +-#define MASK_MPEGS_INIT_ALL_STATES (0x000FFF00) +-#define MASK_MPEGS_INIT_ALL_PARAMS (0x00F00000) +- +-typedef struct spatialDec_struct spatialDec, *HANDLE_SPATIAL_DEC; +- +-typedef struct SPATIAL_BS_FRAME_struct SPATIAL_BS_FRAME; +- +-typedef struct { +- UINT sizePersistent; /* persistent memory */ +- UINT sizeFastPersistent; /* fast persistent memory */ +- +-} MEM_REQUIREMENTS; +- +-#define PCM_MPS INT_PCM +-#define PCM_MPSF FIXP_PCM +- +-#define FIXP_DBL2PCM_MPS(x) ((INT_PCM)FX_DBL2FX_PCM(x)) +- +-/* exposed functions (library interface) */ +- +-int FDK_SpatialDecCompareSpatialSpecificConfigHeader( +- SPATIAL_SPECIFIC_CONFIG *pSsc1, SPATIAL_SPECIFIC_CONFIG *pSsc2); +- +-int FDK_SpatialDecInitDefaultSpatialSpecificConfig( +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- AUDIO_OBJECT_TYPE coreCodec, int coreChannels, int samplingFreq, +- int nTimeSlots, int decoderLevel, int isBlind); +- +-spatialDec *FDK_SpatialDecOpen(const SPATIAL_DEC_CONFIG *config, +- int stereoConfigIndex); +- +-/** +- * \brief Initialize state variables of the MPS parser +- */ +-void SpatialDecInitParserContext(spatialDec *self); +- +-/** +- * \brief Initialize state of MPS decoder. This may happen after the first parse +- * operation. +- */ +-SACDEC_ERROR FDK_SpatialDecInit(spatialDec *self, SPATIAL_BS_FRAME *frame, +- SPATIAL_SPECIFIC_CONFIG *pSpatialSpecificConfig, +- int nQmfBands, +- SPATIAL_DEC_UPMIX_TYPE const upmixType, +- SPATIALDEC_PARAM *pUserParams, +- UINT initFlags /* MPEGS_INIT_CTRL_FLAGS */ +-); +- +-/** +- * \brief Apply decoded MPEG Surround parameters to time domain or QMF down mix +- * data. +- * \param self spatial decoder handle. +- * \param inData Pointer to time domain input down mix data if any. +- * \param qmfInDataReal Pointer array of QMF domain down mix input data (real +- * part). +- * \param qmfInDataImag Pointer array of QMF domain down mix input data +- * (imaginary part). +- * \param pcmOutBuf Pointer to a time domain buffer were the upmixed output data +- * will be stored into. +- * \param nSamples Amount of audio samples per channel of down mix input data +- * (frame length). +- * \param pControlFlags pointer to control flags field; input/output. +- * \param numInputChannels amount of down mix input channels. Might not match +- * the current tree config, useful for internal sanity checks and bypass mode. +- * \param channelMapping array containing the desired output channel ordering to +- * transform MPEG PCE style ordering to any other channel ordering. First +- * dimension is the total channel count. +- */ +-SACDEC_ERROR SpatialDecApplyFrame( +- spatialDec *self, SPATIAL_BS_FRAME *frame, SPATIALDEC_INPUT_MODE inputMode, +- PCM_MPS *inData, /* Time domain input */ +- FIXP_DBL **qmfInDataReal, /* interleaved l/r */ +- FIXP_DBL **qmfInDataImag, /* interleaved l/r */ +- PCM_MPS *pcmOutBuf, /* MAX_OUTPUT_CHANNELS*MAX_TIME_SLOTS*NUM_QMF_BANDS] */ +- UINT nSamples, UINT *pControlFlags, int numInputChannels, +- const FDK_channelMapDescr *const mapDescr); +- +-/** +- * \brief Fill given arrays with audio channel types and indices. +- * \param self spatial decoder handle. +- * \param channelType array where corresponding channel types fr each output +- * channels are stored into. +- * \param channelIndices array where corresponding channel type indices fr each +- * output channels are stored into. +- */ +-void SpatialDecChannelProperties(spatialDec *self, +- AUDIO_CHANNEL_TYPE channelType[], +- UCHAR channelIndices[], +- const FDK_channelMapDescr *const mapDescr); +- +-void FDK_SpatialDecClose(spatialDec *self); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif /* SAC_DEC_INTERFACE_H */ +diff --git a/libSACdec/src/sac_dec_lib.cpp b/libSACdec/src/sac_dec_lib.cpp +deleted file mode 100644 +index bf6dedf..0000000 +--- a/libSACdec/src/sac_dec_lib.cpp ++++ /dev/null +@@ -1,1995 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Decoder Library Interface +- +-*******************************************************************************/ +- +-#include "sac_dec_lib.h" +-#include "sac_dec_interface.h" +-#include "sac_dec.h" +-#include "sac_bitdec.h" +-#include "FDK_matrixCalloc.h" +- +-#define MPS_DATA_BUFFER_SIZE (2048) +- +-/** +- * \brief MPEG Surround data indication. +- **/ +-typedef enum { +- MPEGS_ANCTYPE_FRAME = 0, /*!< MPEG Surround frame, see ISO/IEC 23003-1 */ +- MPEGS_ANCTYPE_HEADER_AND_FRAME = 1, /*!< MPEG Surround header and MPEG +- Surround frame, see ISO/IEC 23003-1 */ +- MPEGS_ANCTYPE_RESERVED_1 = 2, /*!< reserved, see ISO/IEC 23003-1 */ +- MPEGS_ANCTYPE_RESERVED_2 = 3 /*!< reserved, see ISO/IEC 23003-1*/ +-} MPEGS_ANCTYPE; +- +-/** +- * \brief MPEG Surround data segment indication. +- **/ +-typedef enum { +- MPEGS_CONTINUE = 0, /*!< Indicates if data segment continues a data block. */ +- MPEGS_STOP = 1, /*!< Indicates if data segment ends a data block. */ +- MPEGS_START = 2, /*!< Indicates if data segment begins a data block. */ +- MPEGS_START_STOP = +- 3 /*!< Indicates if data segment begins and ends a data block. */ +-} MPEGS_ANCSTARTSTOP; +- +-/** +- * \brief MPEG Surround synchronizaiton state. +- * +- * CAUTION: Changing the enumeration values can break the sync mechanism +- *because it is based on comparing the state values. +- **/ +-typedef enum { +- MPEGS_SYNC_LOST = +- 0, /*!< Indicates lost sync because of current discontinuity. */ +- MPEGS_SYNC_FOUND = 1, /*!< Parsed a valid header and (re)intialization was +- successfully completed. */ +- MPEGS_SYNC_COMPLETE = 2 /*!< In sync and continuous. Found an independent +- frame in addition to MPEGS_SYNC_FOUND. +- Precondition: MPEGS_SYNC_FOUND. */ +-} MPEGS_SYNCSTATE; +- +-/** +- * \brief MPEG Surround operation mode. +- **/ +-typedef enum { +- MPEGS_OPMODE_EMM = 0, /*!< Mode: Enhanced Matrix Mode (Blind) */ +- MPEGS_OPMODE_MPS_PAYLOAD = 1, /*!< Mode: Normal, Stereo or Binaural */ +- MPEGS_OPMODE_NO_MPS_PAYLOAD = 2 /*!< Mode: no MPEG Surround payload */ +-} MPEGS_OPMODE; +- +-/** +- * \brief MPEG Surround init flags. +- **/ +-typedef enum { +- MPEGS_INIT_OK = 0x00000000, /*!< indicate correct initialization */ +- MPEGS_INIT_ENFORCE_REINIT = +- 0x00000001, /*!< indicate complete initialization */ +- +- MPEGS_INIT_CHANGE_OUTPUT_MODE = +- 0x00000010, /*!< indicate change of the output mode */ +- MPEGS_INIT_CHANGE_PARTIALLY_COMPLEX = +- 0x00000020, /*!< indicate change of low power/high quality */ +- MPEGS_INIT_CHANGE_TIME_FREQ_INTERFACE = +- 0x00000040, /*!< indicate change of qmf/time interface */ +- MPEGS_INIT_CHANGE_HEADER = 0x00000080, /*!< indicate change of header */ +- +- MPEGS_INIT_ERROR_PAYLOAD = +- 0x00000100, /*!< indicate payload/ancType/ancStartStop error */ +- +- MPEGS_INIT_BS_INTERRUPTION = +- 0x00001000, /*!< indicate bitstream interruption */ +- MPEGS_INIT_CLEAR_HISTORY = +- 0x00002000, /*!< indicate that all states shall be cleared */ +- +- /* Re-initialization of submodules */ +- +- MPEGS_INIT_CHANGE_CONCEAL_PARAMS = 0x00100000, /*!< indicate a change of at +- least one error concealment +- param */ +- +- /* No re-initialization needed, currently not used */ +- MPEGS_INIT_CHANGE_BYPASS_MODE = +- 0x01000000, /*!< indicate change of bypass mode */ +- +- /* Re-initialization needed, currently not used */ +- MPEGS_INIT_ERROR_ANC_TYPE = 0x10000000, /*!< indicate ancType error*/ +- MPEGS_INIT_ERROR_ANC_STARTSTOP = +- 0x20000000 /*!< indicate ancStartStop error */ +-} MPEGS_INIT_FLAGS; +- +-struct MpegSurroundDecoder { +- HANDLE_FDK_QMF_DOMAIN pQmfDomain; +- UCHAR mpsData[MPS_DATA_BUFFER_SIZE]; /* Buffer for MPS payload accross more +- than one segment */ +- INT mpsDataBits; /* Amount of bits in mpsData */ +- /* MPEG Surround decoder */ +- SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig[1]; /* SSC delay line which is +- used during decoding */ +- spatialDec *pSpatialDec; +- SPATIAL_SPECIFIC_CONFIG +- spatialSpecificConfigBackup; /* SSC used while parsing */ +- +- /* Creation parameter */ +- UCHAR mpegSurroundDecoderLevel; +- /* Run-time parameter */ +- UCHAR mpegSurroundSscIsGlobalCfg; /* Flag telling that the SSC +- (::spatialSpecificConfig) is a +- out-of-band configuration. */ +- UCHAR mpegSurroundUseTimeInterface; +- +- SPATIAL_BS_FRAME +- bsFrames[1]; /* Bitstream Structs that contain data read from the +- SpatialFrame() bitstream element */ +- BS_LL_STATE llState; /* Bit stream parser state memory */ +- UCHAR bsFrameParse; /* Current parse frame context index */ +- UCHAR bsFrameDecode; /* Current decode/apply frame context index */ +- UCHAR bsFrameDelay; /* Amount of frames delay between parsing and processing. +- Required i.e. for interpolation error concealment. */ +- +- /* User prameters */ +- SPATIALDEC_PARAM mpegSurroundUserParams; +- +- /* Internal flags */ +- SPATIAL_DEC_UPMIX_TYPE upmixType; +- int initFlags[1]; +- MPEGS_ANCSTARTSTOP ancStartStopPrev; +- MPEGS_SYNCSTATE fOnSync[1]; +- +- /* Inital decoder configuration */ +- SPATIAL_DEC_CONFIG decConfig; +-}; +- +-SACDEC_ERROR +-static sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, +- const INT coreCodec, const INT sampleRate, +- const INT frameSize); +- +-static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc); +- +-/** +- * \brief Get the number of QMF bands from the sampling frequency (in Hz) +- **/ +-static int mpegSurroundDecoder_GetNrOfQmfBands( +- const SPATIAL_SPECIFIC_CONFIG *pSsc, UINT sampleRate) { +- UINT samplingFrequency = sampleRate; +- int qmfBands = 64; +- +- if (pSsc != NULL) { +- switch (pSsc->coreCodec) { +- case AOT_USAC: +- if ((pSsc->stereoConfigIndex == 3)) { +- static const UCHAR mapIdx2QmfBands[3] = {24, 32, 16}; +- FDK_ASSERT((pSsc->coreSbrFrameLengthIndex >= 2) && +- (pSsc->coreSbrFrameLengthIndex <= 4)); +- qmfBands = mapIdx2QmfBands[pSsc->coreSbrFrameLengthIndex - 2]; +- } +- return qmfBands; +- default: +- samplingFrequency = pSsc->samplingFreq; +- break; +- } +- } +- +- /* number of QMF bands depend on sampling frequency, see FDIS 23003-1:2006 +- * Chapter 6.3.3 */ +- if (samplingFrequency < 27713) { +- qmfBands = 32; +- } +- if (samplingFrequency > 55426) { +- qmfBands = 128; +- } +- +- return qmfBands; +-} +- +-/** +- * \brief Analyse init flags +- **/ +-static int mpegSurroundDecoder_CalcInitFlags(SPATIAL_SPECIFIC_CONFIG *pSsc1, +- SPATIAL_SPECIFIC_CONFIG *pSsc2, +- int upmixTypeFlag, +- int binauralQualityFlag, +- int partiallyComplexFlag, +- int *ctrlFlags) { +- /* Analyse core coder */ +- if (pSsc1->coreCodec != pSsc2->coreCodec) { +- *ctrlFlags |= MASK_MPEGS_INIT_ALL_STATES; +- *ctrlFlags |= MASK_MPEGS_INIT_ALL_PARAMS; +- } else { +- /* Analyse elements for initialization of space analysis qmf filterbank */ +- if ((partiallyComplexFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || +- (pSsc1->samplingFreq != pSsc2->samplingFreq)) { +- *ctrlFlags |= MPEGS_INIT_STATES_ANA_QMF_FILTER; +- *ctrlFlags |= MPEGS_INIT_STATES_ANA_HYB_FILTER; +- } +- +- /* Analyse elements for initialization of space synthesis qmf filterbank */ +- if ((upmixTypeFlag) || (partiallyComplexFlag) || +- (pSsc1->treeConfig != pSsc2->treeConfig) || +- (pSsc1->samplingFreq != pSsc2->samplingFreq) || +- (pSsc1->bsFixedGainDMX != pSsc2->bsFixedGainDMX)) { +- *ctrlFlags |= MPEGS_INIT_STATES_SYN_QMF_FILTER; +- } +- +- /* Analyse elements for initialization of decorrelator */ +- if ((upmixTypeFlag) || (partiallyComplexFlag) || +- (pSsc1->treeConfig != pSsc2->treeConfig) || +- (pSsc1->samplingFreq != pSsc2->samplingFreq) || +- (pSsc1->decorrConfig != pSsc2->decorrConfig)) { +- *ctrlFlags |= MPEGS_INIT_STATES_DECORRELATOR; +- } +- +- /* Analyse elements for initialization of m1 and m2 calculation */ +- if ((upmixTypeFlag) || (binauralQualityFlag) || +- (pSsc1->treeConfig != pSsc2->treeConfig) || +- (pSsc1->samplingFreq != pSsc2->samplingFreq)) +- +- { +- *ctrlFlags |= MPEGS_INIT_STATES_M1M2; +- } +- +- /* Analyse elements for initialization of GES */ +- if ((upmixTypeFlag) || (pSsc1->treeConfig != pSsc2->treeConfig) || +- (pSsc1->tempShapeConfig != pSsc2->tempShapeConfig)) { +- *ctrlFlags |= MPEGS_INIT_STATES_GES; +- } +- +- /* Analyse elements for initialization of FDreverb */ +- if ((upmixTypeFlag) || (binauralQualityFlag) || (partiallyComplexFlag) || +- (pSsc1->samplingFreq != pSsc2->samplingFreq) || +- (pSsc1->nTimeSlots != pSsc2->nTimeSlots)) { +- *ctrlFlags |= MPEGS_INIT_STATES_REVERB; +- } +- +- /* Reset previous frame data whenever the config changes */ +- if (*ctrlFlags & MPEGS_INIT_CONFIG) { +- *ctrlFlags |= MPEGS_INIT_STATES_PARAM; +- } +- } +- +- return MPS_OK; +-} +- +-/** +- * \brief Reset MPEG Surround status info +- **/ +-static void updateMpegSurroundDecoderStatus( +- CMpegSurroundDecoder *pMpegSurroundDecoder, int initFlags, +- MPEGS_SYNCSTATE fOnSync, MPEGS_ANCSTARTSTOP ancStartStopPrev) { +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- initFlags; +- if ((pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg != 0) && +- (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] >= +- MPEGS_SYNC_FOUND) && +- (fOnSync < MPEGS_SYNC_FOUND)) { +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- MPEGS_SYNC_FOUND; +- } else { +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- fOnSync; +- } +- pMpegSurroundDecoder->ancStartStopPrev = ancStartStopPrev; +-} +- +-static SACDEC_ERROR mpegSurroundDecoder_Create( +- CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain); +- +-SAC_INSTANCE_AVAIL +-mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( +- CMpegSurroundDecoder *pMpegSurroundDecoder) { +- SAC_INSTANCE_AVAIL instanceAvailable = SAC_INSTANCE_NOT_FULL_AVAILABLE; +- +- if (pMpegSurroundDecoder->pSpatialDec != NULL) { +- instanceAvailable = SAC_INSTANCE_FULL_AVAILABLE; +- } +- +- return instanceAvailable; +-} +- +-SACDEC_ERROR mpegSurroundDecoder_Open( +- CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain) { +- SACDEC_ERROR error; +- +- error = mpegSurroundDecoder_Create(pMpegSurroundDecoder, stereoConfigIndex, +- pQmfDomain); +- +- return error; +-} +- +-/** +- * \brief Renamed function from getUpmixType to check_UParam_Build_DecConfig. +- * This function checks if user params, decoder config and SSC are valid +- * and if the decoder build can handle all this settings. +- * The upmix type may be modified by this function. +- * It is called in initMpegSurroundDecoder() after the ssc parse check, +- * to have all checks in one place and to ensure these checks are always +- * performed if config changes (inband and out-of-band). +- * +- * \param pUserParams User data handle. +- * \param pDecConfig decoder config handle. +- * \param pSsc spatial specific config handle. +- * \param pUpmixType upmix type which is set by this function +- * +- * \return MPS_OK on sucess, and else on failure. +- */ +-static SACDEC_ERROR check_UParam_Build_DecConfig( +- SPATIALDEC_PARAM const *pUserParams, SPATIAL_DEC_CONFIG const *pDecConfig, +- const SPATIAL_SPECIFIC_CONFIG *pSsc, SPATIAL_DEC_UPMIX_TYPE *pUpmixType) { +- int dmxChannels, outChannels, maxNumOutChannels; +- +- FDK_ASSERT(pUserParams != NULL); +- FDK_ASSERT(pUpmixType != NULL); +- +- /* checks if implementation can handle the Ssc */ +- +- switch (pSsc->treeConfig) { +- case SPATIALDEC_MODE_RSVD7: /* 212 */ +- dmxChannels = 1; +- outChannels = 2; +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- +- /* ------------------------------------------- */ +- +- /* Analyse pDecConfig params */ +- switch (pDecConfig->binauralMode) { +- case BINAURAL_NONE: +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- +- switch (pDecConfig->decoderMode) { +- case EXT_HQ_ONLY: +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- +- switch (pDecConfig->maxNumOutputChannels) { +- case OUTPUT_CHANNELS_DEFAULT: +- /* No special restrictions -> Get the level restriction: */ +- switch (pDecConfig->decoderLevel) { +- case DECODER_LEVEL_0: +- maxNumOutChannels = 2; +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- break; +- case OUTPUT_CHANNELS_2_0: +- maxNumOutChannels = 2; +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- /* ------------------------- */ +- +- /* check if we can handle user params */ +- if (pUserParams->blindEnable == 1) { +- return MPS_UNSUPPORTED_CONFIG; +- } +- { +- switch ((SAC_DEC_OUTPUT_MODE)pUserParams->outputMode) { +- case SACDEC_OUT_MODE_NORMAL: +- if (maxNumOutChannels >= outChannels) { +- *pUpmixType = UPMIX_TYPE_NORMAL; +- } else { +- { *pUpmixType = UPMIX_TYPE_BYPASS; } +- } +- break; +- case SACDEC_OUT_MODE_STEREO: +- if (dmxChannels == 1) { +- if (outChannels == 2) { +- *pUpmixType = UPMIX_TYPE_NORMAL; +- } +- } else { +- *pUpmixType = UPMIX_TYPE_BYPASS; +- } +- break; +- case SACDEC_OUT_MODE_6CHANNEL: +- if (outChannels > 6) { +- { *pUpmixType = UPMIX_TYPE_BYPASS; } +- } else { +- *pUpmixType = UPMIX_TYPE_NORMAL; +- } +- break; +- default: +- return MPS_UNSUPPORTED_CONFIG; +- } +- } +- +- return MPS_OK; +-} +- +-/** +- * \brief Init MPEG Surround decoder. +- **/ +-static SACDEC_ERROR initMpegSurroundDecoder( +- CMpegSurroundDecoder *pMpegSurroundDecoder) { +- SACDEC_ERROR err; +- int initFlags = MPEGS_INIT_NONE, initFlagsDec; +- int upmixTypeCurr = pMpegSurroundDecoder->upmixType; +- +- FDK_ASSERT(pMpegSurroundDecoder != NULL); +- +- SPATIAL_SPECIFIC_CONFIG *const pSSCinput = +- &pMpegSurroundDecoder->spatialSpecificConfigBackup; +- SPATIAL_SPECIFIC_CONFIG *const pSSCtarget = +- &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; +- initFlagsDec = +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]; +- +- if (pSSCinput->coreCodec != AOT_USAC) { +- /* here we check if we have a valid Ssc */ +- err = sscParseCheck(pSSCinput); +- if (err != MPS_OK) goto bail; +- } +- +- /* here we check if Ssc matches build; also check UParams and DecConfig */ +- /* if desired upmixType is changes */ +- err = check_UParam_Build_DecConfig( +- &pMpegSurroundDecoder->mpegSurroundUserParams, +- &pMpegSurroundDecoder->decConfig, pSSCinput, +- &pMpegSurroundDecoder->upmixType); +- if (err != MPS_OK) goto bail; +- +- /* init config */ +- if (initFlagsDec & MPEGS_INIT_CHANGE_HEADER) { +- initFlags |= MPEGS_INIT_CONFIG; +- } +- /* init all states */ +- if (initFlagsDec & MPEGS_INIT_CLEAR_HISTORY) { +- initFlags |= MASK_MPEGS_INIT_ALL_STATES; +- } +- if (initFlagsDec & MPEGS_INIT_CHANGE_CONCEAL_PARAMS) { +- initFlags |= MPEGS_INIT_PARAMS_ERROR_CONCEALMENT; +- } +- +- if (initFlagsDec & MPEGS_INIT_ENFORCE_REINIT) { +- /* init all states */ +- initFlags |= MASK_MPEGS_INIT_ALL_STATES; +- initFlags |= MASK_MPEGS_INIT_ALL_PARAMS; +- } else { +- /* analyse states which have to be initialized */ +- mpegSurroundDecoder_CalcInitFlags( +- pSSCtarget, pSSCinput, +- (upmixTypeCurr != +- pMpegSurroundDecoder->upmixType), /* upmixType changed */ +- 0, (initFlagsDec & MPEGS_INIT_CHANGE_PARTIALLY_COMPLEX) ? 1 : 0, +- &initFlags); +- } +- +- { +- int nrOfQmfBands; +- FDKmemcpy(pSSCtarget, pSSCinput, sizeof(SPATIAL_SPECIFIC_CONFIG)); +- +- nrOfQmfBands = mpegSurroundDecoder_GetNrOfQmfBands( +- pSSCtarget, pSSCtarget->samplingFreq); +- err = FDK_SpatialDecInit( +- pMpegSurroundDecoder->pSpatialDec, +- &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], +- pSSCtarget, nrOfQmfBands, pMpegSurroundDecoder->upmixType, +- &pMpegSurroundDecoder->mpegSurroundUserParams, initFlags); +- +- if (err != MPS_OK) goto bail; +- +- /* Signal that we got a header and can go on decoding */ +- if (err == MPS_OK) { +- initFlagsDec = MPEGS_INIT_OK; +- { +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- MPEGS_SYNC_FOUND; +- } +- } +- } +- +-bail: +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] = +- initFlagsDec; +- return err; +-} +- +-/** +- * \brief Init MPEG Surround decoder. +- **/ +-SACDEC_ERROR mpegSurroundDecoder_Init( +- CMpegSurroundDecoder *pMpegSurroundDecoder) { +- SACDEC_ERROR err = MPS_OK; +- +- if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { +- err = initMpegSurroundDecoder(pMpegSurroundDecoder); +- } +- return err; +-} +- +-/** +- * \brief Open MPEG Surround decoder. +- **/ +-static SACDEC_ERROR mpegSurroundDecoder_Create( +- CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, +- HANDLE_FDK_QMF_DOMAIN pQmfDomain) { +- SACDEC_ERROR err = MPS_OK; +- CMpegSurroundDecoder *sacDec = NULL; +- spatialDec *self = NULL; +- +- /* decoderLevel decoderMode maxNumOutputChannels binauralMode */ +- static const SPATIAL_DEC_CONFIG decConfig = { +- (CFG_LEVEL)(0), EXT_HQ_ONLY, OUTPUT_CHANNELS_DEFAULT, BINAURAL_NONE}; +- +- if (*pMpegSurroundDecoder == NULL) { +- FDK_ALLOCATE_MEMORY_1D(*pMpegSurroundDecoder, 1, CMpegSurroundDecoder) +- +- for (int i = 0; i < 1; i++) { +- err = SpatialDecCreateBsFrame(&(*pMpegSurroundDecoder)->bsFrames[i], +- &(*pMpegSurroundDecoder)->llState); +- if (err != MPS_OK) { +- sacDec = *pMpegSurroundDecoder; +- goto bail; +- } +- } +- (*pMpegSurroundDecoder)->pQmfDomain = pQmfDomain; +- +- (*pMpegSurroundDecoder)->bsFrameDelay = 1; +- (*pMpegSurroundDecoder)->bsFrameParse = 0; +- (*pMpegSurroundDecoder)->bsFrameDecode = 0; +- +- return err; +- } else { +- sacDec = *pMpegSurroundDecoder; +- } +- +- if (sacDec->pSpatialDec == NULL) { +- if ((self = FDK_SpatialDecOpen(&decConfig, stereoConfigIndex)) == NULL) { +- err = MPS_OUTOFMEMORY; +- goto bail; +- } +- } else { +- self = sacDec->pSpatialDec; +- } +- +- self->pQmfDomain = sacDec->pQmfDomain; +- +- sacDec->pSpatialDec = self; +- +- /* default parameter set */ +- sacDec->mpegSurroundUserParams.outputMode = SACDEC_OUT_MODE_NORMAL; +- sacDec->mpegSurroundUserParams.blindEnable = 0; +- sacDec->mpegSurroundUserParams.bypassMode = 0; +- sacDec->mpegSurroundUserParams.concealMethod = 1; +- sacDec->mpegSurroundUserParams.concealNumKeepFrames = 10; +- sacDec->mpegSurroundUserParams.concealFadeOutSlopeLength = 5; +- sacDec->mpegSurroundUserParams.concealFadeInSlopeLength = 5; +- sacDec->mpegSurroundUserParams.concealNumReleaseFrames = 3; +- sacDec->mpegSurroundSscIsGlobalCfg = 0; +- sacDec->mpegSurroundUseTimeInterface = 1; +- sacDec->mpegSurroundDecoderLevel = decConfig.decoderLevel; +- +- sacDec->upmixType = UPMIX_TYPE_NORMAL; +- +- /* signalize spatial decoder re-initalization */ +- updateMpegSurroundDecoderStatus(sacDec, MPEGS_INIT_ENFORCE_REINIT, +- MPEGS_SYNC_LOST, MPEGS_STOP); +- +- /* return decoder instance */ +- *pMpegSurroundDecoder = sacDec; +- sacDec->decConfig = decConfig; +- +- SpatialDecInitParserContext(sacDec->pSpatialDec); +- +- return err; +- +-bail: +- if (sacDec != NULL) { +- mpegSurroundDecoder_Close(sacDec); +- } +- *pMpegSurroundDecoder = NULL; +- if (err == MPS_OK) { +- return MPS_OUTOFMEMORY; +- } else { +- return err; +- } +-} +- +-/** +- * \brief Config MPEG Surround decoder. +- **/ +-SACDEC_ERROR mpegSurroundDecoder_Config( +- CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, +- AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, +- INT stereoConfigIndex, INT coreSbrFrameLengthIndex, INT configBytes, +- const UCHAR configMode, UCHAR *configChanged) { +- SACDEC_ERROR err = MPS_OK; +- SPATIAL_SPECIFIC_CONFIG spatialSpecificConfig; +- SPATIAL_SPECIFIC_CONFIG *pSsc = +- &pMpegSurroundDecoder->spatialSpecificConfigBackup; +- +- switch (coreCodec) { +- case AOT_DRM_USAC: +- case AOT_USAC: +- if (configMode == AC_CM_DET_CFG_CHANGE) { +- /* In config detection mode write spatial specific config parameters +- * into temporarily allocated structure */ +- err = SpatialDecParseMps212Config( +- hBs, &spatialSpecificConfig, samplingRate, coreCodec, +- stereoConfigIndex, coreSbrFrameLengthIndex); +- pSsc = &spatialSpecificConfig; +- } else { +- err = SpatialDecParseMps212Config( +- hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- samplingRate, coreCodec, stereoConfigIndex, +- coreSbrFrameLengthIndex); +- } +- break; +- case AOT_ER_AAC_ELD: +- case AOT_ER_AAC_LD: +- if (configMode == AC_CM_DET_CFG_CHANGE) { +- /* In config detection mode write spatial specific config parameters +- * into temporarily allocated structure */ +- err = SpatialDecParseSpecificConfig(hBs, &spatialSpecificConfig, +- configBytes, coreCodec); +- pSsc = &spatialSpecificConfig; +- } else { +- err = SpatialDecParseSpecificConfig( +- hBs, &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- configBytes, coreCodec); +- } +- break; +- default: +- err = MPS_UNSUPPORTED_FORMAT; +- break; +- } +- +- if (err != MPS_OK) { +- goto bail; +- } +- +- err = sscCheckOutOfBand(pSsc, coreCodec, samplingRate, frameSize); +- +- if (err != MPS_OK) { +- goto bail; +- } +- +- if (configMode & AC_CM_DET_CFG_CHANGE) { +- return err; +- } +- +- if (configMode & AC_CM_ALLOC_MEM) { +- if (*configChanged) { +- err = mpegSurroundDecoder_Open(&pMpegSurroundDecoder, stereoConfigIndex, +- NULL); +- if (err) { +- return err; +- } +- } +- } +- +- { +- SPATIAL_SPECIFIC_CONFIG *sscParse = +- &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; +- +- if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, sscParse)) { +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse] |= +- MPEGS_INIT_CHANGE_HEADER; +- /* Error resilience code */ +- if (pMpegSurroundDecoder->pSpatialDec == NULL) { +- err = MPS_NOTOK; +- goto bail; +- } +- SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); +- pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = +- &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; +- } +- } +- +- if (err == MPS_OK) { +- /* We got a valid out-of-band configuration so label it accordingly. */ +- pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 1; +- } +- +-bail: +- return err; +-} +- +-/** +- * \brief Determine MPEG Surround operation mode. +- **/ +-static MPEGS_OPMODE mpegSurroundOperationMode( +- CMpegSurroundDecoder *pMpegSurroundDecoder, int mpsDataBits) { +- MPEGS_OPMODE mode; +- +- { +- if ((mpsDataBits > 0) && +- (pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable == 0)) { +- mode = MPEGS_OPMODE_MPS_PAYLOAD; /* Mode: Normal, Stereo or Binaural */ +- } else { +- mode = MPEGS_OPMODE_NO_MPS_PAYLOAD; /* Mode: No MPEG Surround Payload */ +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, +- MPEGS_STOP); +- } +- } +- +- return (mode); +-} +- +-/** +- * \brief Check ssc for parse errors. +- * This one is called in initMpegSurroundDecoder() +- * to ensure checking of inband and out-of-band mps configs. +- * Only parse errors checked here! Check for valid config is done +- * in check_UParam_Build_DecConfig()! +- * +- * \param pSsc spatial specific config handle. +- * +- * \return MPS_OK on sucess, and else on parse error. +- */ +-static SACDEC_ERROR sscParseCheck(const SPATIAL_SPECIFIC_CONFIG *pSsc) { +- if (pSsc->samplingFreq > 96000) return MPS_PARSE_ERROR; +- if (pSsc->samplingFreq < 8000) return MPS_PARSE_ERROR; +- +- if ((pSsc->treeConfig < 0) || (pSsc->treeConfig > 7)) { +- return MPS_PARSE_ERROR; +- } +- +- if ((pSsc->quantMode < 0) || (pSsc->quantMode > 2)) { +- return MPS_PARSE_ERROR; +- } +- +- /* now we are sure there were no parsing errors */ +- +- return MPS_OK; +-} +- +-/** +- * \brief Check number of time slots +- * +- * Basically the mps frame length must be a multiple of the core coder frame +- * length. The below table shows all valid configurations in detail. See ISO/IEC +- * 23003-1: "Table 4A - Allowed values for bsFrameLength in the Baseline MPEG +- * Surround Profile" +- * +- * Downmix Coder Downmix Code Allowed values for bsFrameLength +- * Allowed frame sizes for normal, downsampled and upsampled MPS Framelength +- * (QMF Samples) +- * +- * AAC 1024 16 15, 31, 47, 63 1024 2048 3072 4096 +- * downsampled MPS 32 31, 63 1024 2048 upsampled MPS +- * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 +- * 5120 6144 7168 8192 9216 +- * +- * AAC 960 15 14, 29, 44, 59 960 1920 2880 3840 +- * downsampled MPS 30 29, 59 960 1920 upsampled MPS +- * 7,5 14, 29, 44, 59 1920 3840 5760 7680 +- * +- * HE-AAC 1024/2048 32 31, 63 2048 4096 downsampled MPS +- * 64 63 2048 upsampled MPS +- * 16 15, 31, 47, 63 2048 4096 6144 8192 +- * +- * HE-AAC 960/1920 30 29, 59 1920 3840 downsampled MPS +- * 60 59 1920 upsampled MPS +- * 15 14, 29, 44, 59 1920 3840 5760 7680 +- * +- * BSAC 16 15, 31, 47, 63 1024 2048 3072 4096 +- * downsampled MPS 32 31, 63 1024 2048 upsampled MPS +- * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 +- * 5120 6144 7168 8192 9216 +- * +- * BSAC with SBR 32 31, 63 2048 4096 downsampled MPS +- * 64 63 2048 upsampled MPS +- * 16 15, 31, 47, 63 2048 4096 6144 8192 +- * +- * AAC LD 512 8 7, 15, 23, 31, 39, 47, 55, 63, 71 +- * 512 1024 1536 2048 2560 3072 3584 4096 4608 downsampled MPS +- * 16 15, 31, 47, 63 512 1024 1536 2048 +- * +- * AAC ELD 512 8 7, 15, 23, 31, 39, 47, 55, 63, 71 +- * 512 1024 1536 2048 2560 3072 3584 4096 4608 downsampled MPS +- * 16 15, 31, 47, 63 512 1024 1536 2048 +- * +- * AAC ELD with SBR 512/1024 16 15, 31, 47, 63 1024 2048 3072 4096 +- * downsampled MPS 32 31, 63 1024 2048 upsampled MPS +- * 8 7, 15, 23, 31, 39, 47, 55, 63, 71 1024 2048 3072 4096 +- * 5120 6144 7168 8192 9216 +- * +- * MPEG1/2 Layer II 18 17, 35, 53, 71 1152 2304 3456 4608 +- * downsampled MPS 36 35, 71 1152 2304 +- * +- * MPEG1/2 Layer III 18 17, 35, 53, 71 1152 2304 3456 4608 +- * downsampled MPS 36 35, 71 1152 2304 +- * +- * \param frameLength +- * \param qmfBands +- * \param timeSlots +- * +- * \return error code +- */ +-SACDEC_ERROR checkTimeSlots(int frameLength, int qmfBands, int timeSlots) { +- int len; +- int maxFrameLength; +- +- if (qmfBands == 64) { +- /* normal MPEG Surround */ +- switch (frameLength) { +- case 960: +- case 1920: +- maxFrameLength = 3840; +- break; +- case 1024: +- case 2048: +- maxFrameLength = 4096; +- break; +- case 512: +- case 1152: +- maxFrameLength = 4608; +- break; +- default: +- return MPS_PARSE_ERROR; +- } +- } else if (qmfBands == 32) { +- /* downsampled MPEG Surround */ +- switch (frameLength) { +- case 960: +- case 1920: +- maxFrameLength = 1920; +- break; +- case 512: +- case 1024: +- case 2048: +- maxFrameLength = 2048; +- break; +- case 1152: +- maxFrameLength = 2304; +- break; +- default: +- return MPS_PARSE_ERROR; +- } +- } else if (qmfBands == 128) { +- /* upsampled MPEG Surround */ +- switch (frameLength) { +- case 1920: +- maxFrameLength = 7680; +- break; +- case 1024: +- maxFrameLength = 9216; +- break; +- case 2048: +- maxFrameLength = 8192; +- break; +- case 512: +- case 960: +- case 1152: +- /* no break, no support for upsampled MPEG Surround */ +- default: +- return MPS_PARSE_ERROR; +- } +- } else { +- return MPS_PARSE_ERROR; +- } +- +- len = frameLength; +- +- while (len <= maxFrameLength) { +- if (len == timeSlots * qmfBands) { +- return MPS_OK; +- } +- len += frameLength; +- } +- return MPS_PARSE_ERROR; +-} +- +-/** +- * \brief Check ssc for consistency (e.g. bit errors could cause trouble) +- * First of currently two ssc-checks. +- * This (old) one is called in mpegSurroundDecoder_Apply() +- * only if inband mps config is contained in stream. +- * +- * New ssc check is split in two functions sscParseCheck() and +- * check_UParam_Build_DecConfig(). sscParseCheck() checks only for correct +- * parsing. check_UParam_Build_DecConfig() is used to check if we have a +- * valid config. Both are called in initMpegSurroundDecoder() to ensure +- * checking of inband and out-of-band mps configs. +- * +- * If this function can be integrated into the new functions. +- * We can remove this one. +- * +- * \param pSsc spatial specific config handle. +- * \param frameLength +- * \param sampleRate +- * +- * \return MPS_OK on sucess, and else on failure. +- */ +-static SACDEC_ERROR sscCheckInBand(SPATIAL_SPECIFIC_CONFIG *pSsc, +- int frameLength, int sampleRate) { +- SACDEC_ERROR err = MPS_OK; +- int qmfBands; +- +- FDK_ASSERT(pSsc != NULL); +- +- /* check ssc for parse errors */ +- if (sscParseCheck(pSsc) != MPS_OK) { +- err = MPS_PARSE_ERROR; +- } +- +- /* core fs and mps fs must match */ +- if (pSsc->samplingFreq != sampleRate) { +- err = MPS_PARSE_ERROR /* MPEGSDEC_SSC_PARSE_ERROR */; +- } +- +- qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); +- +- if (checkTimeSlots(frameLength, qmfBands, pSsc->nTimeSlots) != MPS_OK) { +- err = MPS_PARSE_ERROR; +- } +- +- return err; +-} +- +-SACDEC_ERROR +-mpegSurroundDecoder_ConfigureQmfDomain( +- CMpegSurroundDecoder *pMpegSurroundDecoder, +- SAC_INPUT_CONFIG sac_dec_interface, UINT coreSamplingRate, +- AUDIO_OBJECT_TYPE coreCodec) { +- SACDEC_ERROR err = MPS_OK; +- FDK_QMF_DOMAIN_GC *pGC = NULL; +- +- if (pMpegSurroundDecoder == NULL) { +- return MPS_INVALID_HANDLE; +- } +- +- FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); +- +- pGC = &pMpegSurroundDecoder->pQmfDomain->globalConf; +- if (pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg) { +- SPATIAL_SPECIFIC_CONFIG *pSSC = +- &pMpegSurroundDecoder->spatialSpecificConfigBackup; +- if (sac_dec_interface == SAC_INTERFACE_TIME) { +- /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ +- pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( +- pSSC, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for +- SAC_INTERFACE_TIME */ +- pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; +- pGC->nInputChannels_requested = +- fMax((UINT)pSSC->nInputChannels, (UINT)pGC->nInputChannels_requested); +- } +- pGC->nOutputChannels_requested = +- fMax((UINT)pSSC->nOutputChannels, (UINT)pGC->nOutputChannels_requested); +- } else { +- if (sac_dec_interface == SAC_INTERFACE_TIME) { +- /* For SAC_INTERFACE_QMF these parameters are set by SBR. */ +- pGC->nBandsAnalysis_requested = mpegSurroundDecoder_GetNrOfQmfBands( +- NULL, coreSamplingRate); /* coreSamplingRate == outputSamplingRate for +- SAC_INTERFACE_TIME */ +- pGC->nBandsSynthesis_requested = pGC->nBandsAnalysis_requested; +- pGC->nInputChannels_requested = +- pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels; +- } +- pGC->nOutputChannels_requested = +- pMpegSurroundDecoder->pSpatialDec->createParams.maxNumOutputChannels; +- } +- pGC->nQmfProcBands_requested = 64; +- pGC->nQmfProcChannels_requested = +- fMin((INT)pGC->nInputChannels_requested, +- pMpegSurroundDecoder->pSpatialDec->createParams.maxNumInputChannels); +- +- if (coreCodec == AOT_ER_AAC_ELD) { +- pGC->flags_requested |= QMF_FLAG_MPSLDFB; +- pGC->flags_requested &= ~QMF_FLAG_CLDFB; +- } +- +- return err; +-} +- +-/** +- * \brief Check out-of-band config +- * +- * \param pSsc spatial specific config handle. +- * \param coreCodec core codec. +- * \param sampleRate sampling frequency. +- * +- * \return errorStatus +- */ +-SACDEC_ERROR +-sscCheckOutOfBand(const SPATIAL_SPECIFIC_CONFIG *pSsc, const INT coreCodec, +- const INT sampleRate, const INT frameSize) { +- FDK_ASSERT(pSsc != NULL); +- int qmfBands = 0; +- +- /* check ssc for parse errors */ +- if (sscParseCheck(pSsc) != MPS_OK) { +- return MPS_PARSE_ERROR; +- } +- +- switch (coreCodec) { +- case AOT_USAC: +- case AOT_DRM_USAC: +- /* ISO/IEC 23003-1:2007(E), Chapter 6.3.3, Support for lower and higher +- * sampling frequencies */ +- if (pSsc->samplingFreq >= 55426) { +- return MPS_PARSE_ERROR; +- } +- break; +- case AOT_ER_AAC_LD: +- case AOT_ER_AAC_ELD: +- /* core fs and mps fs must match */ +- if (pSsc->samplingFreq != sampleRate) { +- return MPS_PARSE_ERROR; +- } +- +- /* ISO/IEC 14496-3:2009 FDAM 3: Chapter 1.5.2.3, Levels for the Low Delay +- * AAC v2 profile */ +- if (pSsc->samplingFreq > 48000) { +- return MPS_PARSE_ERROR; +- } +- +- qmfBands = mpegSurroundDecoder_GetNrOfQmfBands(pSsc, pSsc->samplingFreq); +- switch (frameSize) { +- case 480: +- if (!((qmfBands == 32) && (pSsc->nTimeSlots == 15))) { +- return MPS_PARSE_ERROR; +- } +- break; +- case 960: +- if (!((qmfBands == 64) && (pSsc->nTimeSlots == 15))) { +- return MPS_PARSE_ERROR; +- } +- break; +- case 512: +- if (!(((qmfBands == 32) && (pSsc->nTimeSlots == 16)) || +- ((qmfBands == 64) && (pSsc->nTimeSlots == 8)))) { +- return MPS_PARSE_ERROR; +- } +- break; +- case 1024: +- if (!((qmfBands == 64) && (pSsc->nTimeSlots == 16))) { +- return MPS_PARSE_ERROR; +- } +- break; +- default: +- return MPS_PARSE_ERROR; +- } +- break; +- default: +- return MPS_PARSE_ERROR; +- break; +- } +- +- return MPS_OK; +-} +- +-/** +- * \brief Decode MPEG Surround frame. +- **/ +-int mpegSurroundDecoder_ParseNoHeader( +- CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, +- int *pMpsDataBits, int fGlobalIndependencyFlag) { +- SACDEC_ERROR err = MPS_OK; +- SPATIAL_SPECIFIC_CONFIG *sscParse; +- int bitsAvail, numSacBits; +- +- if (pMpegSurroundDecoder == NULL || hBs == NULL) { +- return MPS_INVALID_HANDLE; +- } +- +- sscParse = &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; +- +- bitsAvail = FDKgetValidBits(hBs); +- +- /* First spatial specific config is parsed into spatialSpecificConfigBackup, +- * second spatialSpecificConfigBackup is copied into +- * spatialSpecificConfig[bsFrameDecode] */ +- if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameParse]) { +- FDKmemcpy(sscParse, &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- sizeof(SPATIAL_SPECIFIC_CONFIG)); +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameParse] = +- MPEGS_SYNC_FOUND; +- } +- +- if (bitsAvail <= 0) { +- err = MPS_PARSE_ERROR; +- } else { +- err = SpatialDecParseFrameData( +- pMpegSurroundDecoder->pSpatialDec, +- &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse], +- hBs, sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, +- fGlobalIndependencyFlag); +- if (err == MPS_OK) { +- pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] +- .newBsData = 1; +- } +- } +- +- numSacBits = bitsAvail - (INT)FDKgetValidBits(hBs); +- +- if (numSacBits > bitsAvail) { +- pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] +- .newBsData = 0; +- err = MPS_PARSE_ERROR; +- } +- +- *pMpsDataBits -= numSacBits; +- +- return err; +-} +- +-/** +- * \brief Check, if ancType is valid. +- **/ +-static int isValidAncType(CMpegSurroundDecoder *pMpegSurroundDecoder, +- int ancType) { +- int ret = 1; +- +- if ((ancType != MPEGS_ANCTYPE_HEADER_AND_FRAME) && +- (ancType != MPEGS_ANCTYPE_FRAME)) { +- ret = 0; +- } +- +- if (ret == 0) { +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, +- MPEGS_STOP); +- } +- +- return (ret); +-} +- +-/** +- * \brief Check, if ancStartStop is valid. +- **/ +-static int isValidAncStartStop(CMpegSurroundDecoder *pMpegSurroundDecoder, +- int ancStartStop) { +- int ret = 1; +- +- switch (ancStartStop) { +- case MPEGS_START: +- /* Sequence start - start and continue - start not allowed */ +- if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START) || +- (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_CONTINUE)) { +- ret = 0; +- } +- break; +- +- case MPEGS_STOP: +- /* MPS payload of the previous frame must be valid if current type is stop +- Sequence startstop - stop and stop - stop not allowed +- Sequence startstop - continue and stop - continue are allowed */ +- if ((pMpegSurroundDecoder->ancStartStopPrev == MPEGS_STOP) || +- (pMpegSurroundDecoder->ancStartStopPrev == MPEGS_START_STOP)) { +- ret = 0; +- } +- break; +- +- case MPEGS_CONTINUE: +- case MPEGS_START_STOP: +- /* No error detection possible for this states */ +- break; +- } +- +- if (ret == 0) { +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, +- MPEGS_STOP); +- } else { +- pMpegSurroundDecoder->ancStartStopPrev = (MPEGS_ANCSTARTSTOP)ancStartStop; +- } +- +- return (ret); +-} +- +-int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, +- HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, +- AUDIO_OBJECT_TYPE coreCodec, int sampleRate, +- int frameSize, int fGlobalIndependencyFlag) { +- SACDEC_ERROR err = MPS_OK; +- SPATIAL_SPECIFIC_CONFIG *sscParse; +- SPATIAL_BS_FRAME *bsFrame; +- HANDLE_FDK_BITSTREAM hMpsBsData = NULL; +- FDK_BITSTREAM mpsBsData; +- int mpsDataBits = *pMpsDataBits; +- int mpsBsBits; +- MPEGS_ANCTYPE ancType; +- MPEGS_ANCSTARTSTOP ancStartStop; +- +- if (pMpegSurroundDecoder == NULL) { +- return MPS_INVALID_HANDLE; +- } +- +- FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); +- +- mpsBsBits = (INT)FDKgetValidBits(hBs); +- +- sscParse = &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameParse]; +- bsFrame = &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse]; +- +- /* +- Find operation mode of mpeg surround decoder: +- - MPEGS_OPMODE_EMM: Mode: Enhanced Matrix Mode (Blind) +- - MPEGS_OPMODE_MPS_PAYLOAD: Mode: Normal, Stereo or Binaural +- - MPEGS_OPMODE_NO_MPS_PAYLOAD: Mode: No MpegSurround Payload +- */ +- { +- /* Parse ancType and ancStartStop */ +- ancType = (MPEGS_ANCTYPE)FDKreadBits(hBs, 2); +- ancStartStop = (MPEGS_ANCSTARTSTOP)FDKreadBits(hBs, 2); +- mpsDataBits -= 4; +- +- /* Set valid anc type flag, if ancType signals a payload with either header +- * and frame or frame */ +- if (isValidAncType(pMpegSurroundDecoder, ancType)) { +- /* Set valid anc startstop flag, if transmitted sequence is not illegal */ +- if (isValidAncStartStop(pMpegSurroundDecoder, ancStartStop)) { +- switch (ancStartStop) { +- case MPEGS_START: +- /* Assuming that core coder frame size (AAC) is smaller than MPS +- coder frame size. Save audio data for next frame. */ +- if (mpsDataBits > MPS_DATA_BUFFER_SIZE * 8) { +- err = MPS_NOTOK; +- goto bail; +- } +- for (int i = 0; i < mpsDataBits / 8; i++) { +- pMpegSurroundDecoder->mpsData[i] = FDKreadBits(hBs, 8); +- } +- pMpegSurroundDecoder->mpsDataBits = mpsDataBits; +- break; +- +- case MPEGS_CONTINUE: +- case MPEGS_STOP: +- /* Assuming that core coder frame size (AAC) is smaller than MPS +- coder frame size. Save audio data for next frame. */ +- if ((pMpegSurroundDecoder->mpsDataBits + mpsDataBits) > +- MPS_DATA_BUFFER_SIZE * 8) { +- err = MPS_NOTOK; +- goto bail; +- } +- for (int i = 0; i < mpsDataBits / 8; i++) { +- pMpegSurroundDecoder +- ->mpsData[(pMpegSurroundDecoder->mpsDataBits / 8) + i] = +- FDKreadBits(hBs, 8); +- } +- pMpegSurroundDecoder->mpsDataBits += mpsDataBits; +- FDKinitBitStream(&mpsBsData, pMpegSurroundDecoder->mpsData, +- MAX_BUFSIZE_BYTES, +- pMpegSurroundDecoder->mpsDataBits, BS_READER); +- hMpsBsData = &mpsBsData; +- break; +- +- case MPEGS_START_STOP: +- pMpegSurroundDecoder->mpsDataBits = mpsDataBits; +- hMpsBsData = hBs; +- break; +- +- default: +- FDK_ASSERT(0); +- } +- +- if ((ancStartStop == MPEGS_STOP) || +- (ancStartStop == MPEGS_START_STOP)) { +- switch (ancType) { +- case MPEGS_ANCTYPE_HEADER_AND_FRAME: { +- int parseResult, bitsRead; +- SPATIAL_SPECIFIC_CONFIG spatialSpecificConfigTmp = +- pMpegSurroundDecoder->spatialSpecificConfigBackup; +- +- /* Parse spatial specific config */ +- bitsRead = (INT)FDKgetValidBits(hMpsBsData); +- +- err = SpatialDecParseSpecificConfigHeader( +- hMpsBsData, +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, +- pMpegSurroundDecoder->upmixType); +- +- bitsRead = (bitsRead - (INT)FDKgetValidBits(hMpsBsData)); +- parseResult = ((err == MPS_OK) ? bitsRead : -bitsRead); +- +- if (parseResult < 0) { +- parseResult = -parseResult; +- err = MPS_PARSE_ERROR; +- } else if (err == MPS_OK) { +- /* Check SSC for consistency (e.g. bit errors could cause +- * trouble) */ +- err = sscCheckInBand( +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- frameSize, sampleRate); +- } +- if (err != MPS_OK) { +- pMpegSurroundDecoder->spatialSpecificConfigBackup = +- spatialSpecificConfigTmp; +- break; +- } +- +- pMpegSurroundDecoder->mpsDataBits -= parseResult; +- +- /* Initiate re-initialization, if header has changed */ +- if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- sscParse) == MPS_UNEQUAL_SSC) { +- pMpegSurroundDecoder +- ->initFlags[pMpegSurroundDecoder->bsFrameParse] |= +- MPEGS_INIT_CHANGE_HEADER; +- SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); +- /* We found a valid in-band configuration. Therefore any +- * previous config is invalid now. */ +- pMpegSurroundDecoder->mpegSurroundSscIsGlobalCfg = 0; +- } +- } +- FDK_FALLTHROUGH; +- case MPEGS_ANCTYPE_FRAME: +- +- if (pMpegSurroundDecoder +- ->initFlags[pMpegSurroundDecoder->bsFrameParse] & +- MPEGS_INIT_ERROR_PAYLOAD) { +- err = MPS_PARSE_ERROR; +- break; +- } +- +- /* First spatial specific config is parsed into +- * spatialSpecificConfigBackup, second spatialSpecificConfigBackup +- * is copied into spatialSpecificConfig[bsFrameDecode] */ +- if (pMpegSurroundDecoder +- ->initFlags[pMpegSurroundDecoder->bsFrameParse]) { +- FDKmemcpy(sscParse, +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- sizeof(SPATIAL_SPECIFIC_CONFIG)); +- pMpegSurroundDecoder +- ->fOnSync[pMpegSurroundDecoder->bsFrameParse] = +- MPEGS_SYNC_FOUND; +- } +- +- if (pMpegSurroundDecoder +- ->fOnSync[pMpegSurroundDecoder->bsFrameParse] >= +- MPEGS_SYNC_FOUND) { +- int nbits = 0, bitsAvail; +- +- if (err != MPS_OK) { +- break; +- } +- +- bitsAvail = FDKgetValidBits(hMpsBsData); +- +- if (bitsAvail <= 0) { +- err = MPS_PARSE_ERROR; +- } else { +- err = SpatialDecParseFrameData( +- pMpegSurroundDecoder->pSpatialDec, bsFrame, hMpsBsData, +- sscParse, (UPMIXTYPE)pMpegSurroundDecoder->upmixType, +- fGlobalIndependencyFlag); +- if (err == MPS_OK) { +- bsFrame->newBsData = 1; +- } +- } +- +- nbits = bitsAvail - (INT)FDKgetValidBits(hMpsBsData); +- +- if ((nbits > bitsAvail) || +- (nbits > pMpegSurroundDecoder->mpsDataBits) || +- (pMpegSurroundDecoder->mpsDataBits > nbits + 7 && +- !IS_LOWDELAY(coreCodec))) { +- bsFrame->newBsData = 0; +- err = MPS_PARSE_ERROR; +- break; +- } +- pMpegSurroundDecoder->mpsDataBits -= nbits; +- } +- break; +- +- default: /* added to avoid compiler warning */ +- err = MPS_NOTOK; +- break; /* added to avoid compiler warning */ +- } /* switch (ancType) */ +- +- if (err == MPS_OK) { +- pMpegSurroundDecoder->ancStartStopPrev = ancStartStop; +- } else { +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ERROR_PAYLOAD, +- MPEGS_SYNC_LOST, MPEGS_STOP); +- pMpegSurroundDecoder->mpsDataBits = 0; +- } +- } /* (ancStartStop == MPEGS_STOP) || (ancStartStop == MPEGS_START_STOP) +- */ +- } /* validAncStartStop */ +- } /* validAncType */ +- } +- +-bail: +- +- *pMpsDataBits -= (mpsBsBits - (INT)FDKgetValidBits(hBs)); +- +- return err; +-} +- +-int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, +- INT_PCM *input, PCM_MPS *pTimeData, +- const int timeDataSize, int timeDataFrameSize, +- int *nChannels, int *frameSize, int sampleRate, +- AUDIO_OBJECT_TYPE coreCodec, +- AUDIO_CHANNEL_TYPE channelType[], +- UCHAR channelIndices[], +- const FDK_channelMapDescr *const mapDescr) { +- SACDEC_ERROR err = MPS_OK; +- PCM_MPS *pTimeOut = pTimeData; +- UINT initControlFlags = 0, controlFlags = 0; +- int timeDataRequiredSize = 0; +- int newData; +- +- if (pMpegSurroundDecoder == NULL) { +- return MPS_INVALID_HANDLE; +- } +- +- FDK_ASSERT(pMpegSurroundDecoder->pSpatialDec); +- +- if (!FDK_chMapDescr_isValid(mapDescr)) { +- return MPS_INVALID_HANDLE; +- } +- +- if ((*nChannels <= 0) || (*nChannels > 2)) { +- return MPS_NOTOK; +- } +- +- pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = +- &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; +- newData = pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameParse] +- .newBsData; +- +- switch (mpegSurroundOperationMode(pMpegSurroundDecoder, 1000)) { +- case MPEGS_OPMODE_MPS_PAYLOAD: +- if (pMpegSurroundDecoder +- ->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { +- err = initMpegSurroundDecoder(pMpegSurroundDecoder); +- } +- +- if (err == MPS_OK) { +- if ((pMpegSurroundDecoder +- ->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != +- MPEGS_SYNC_COMPLETE) && +- (pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] +- .bsIndependencyFlag == 1)) { +- /* We got a valid header and independently decodeable frame data. +- -> Go to the next sync level and start processing. */ +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- MPEGS_SYNC_COMPLETE; +- } +- } else { +- /* We got a valid config header but found an error while parsing the +- bitstream. Wait for the next independent frame and apply error +- conealment in the meantime. */ +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- MPEGS_SYNC_FOUND; +- controlFlags |= MPEGS_CONCEAL; +- err = MPS_OK; +- } +- /* +- Concealment: +- - Bitstream is available, no sync found during bitstream processing +- - Bitstream is available, sync lost due to corrupted bitstream +- - Bitstream is available, sync found but no independent frame +- */ +- if (pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] != +- MPEGS_SYNC_COMPLETE) { +- controlFlags |= MPEGS_CONCEAL; +- } +- break; +- +- case MPEGS_OPMODE_NO_MPS_PAYLOAD: +- /* Concealment: No bitstream is available */ +- controlFlags |= MPEGS_CONCEAL; +- break; +- +- default: +- err = MPS_NOTOK; +- } +- +- if (err != MPS_OK) { +- goto bail; +- } +- +- /* +- * Force BypassMode if choosen by user +- */ +- if (pMpegSurroundDecoder->mpegSurroundUserParams.bypassMode) { +- controlFlags |= MPEGS_BYPASSMODE; +- } +- +- if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode]) { +- int startWithDfltCfg = 0; +- /* +- * Init with a default configuration if we came here and are still not +- * initialized. +- */ +- if (pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] & +- MPEGS_INIT_ENFORCE_REINIT) { +- /* Get default spatial specific config */ +- if (FDK_SpatialDecInitDefaultSpatialSpecificConfig( +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, coreCodec, +- *nChannels, sampleRate, +- *frameSize / +- mpegSurroundDecoder_GetNrOfQmfBands(NULL, sampleRate), +- pMpegSurroundDecoder->mpegSurroundDecoderLevel, +- pMpegSurroundDecoder->mpegSurroundUserParams.blindEnable)) { +- err = MPS_NOTOK; +- goto bail; +- } +- +- /* Initiate re-initialization, if header has changed */ +- if (FDK_SpatialDecCompareSpatialSpecificConfigHeader( +- &pMpegSurroundDecoder->spatialSpecificConfigBackup, +- &pMpegSurroundDecoder->spatialSpecificConfig +- [pMpegSurroundDecoder->bsFrameDecode]) == MPS_UNEQUAL_SSC) { +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_HEADER; +- SpatialDecInitParserContext(pMpegSurroundDecoder->pSpatialDec); +- } +- +- startWithDfltCfg = 1; +- } +- +- /* First spatial specific config is parsed into spatialSpecificConfigBackup, +- * second spatialSpecificConfigBackup is copied into spatialSpecificConfig +- */ +- err = initMpegSurroundDecoder(pMpegSurroundDecoder); +- +- if (startWithDfltCfg) { +- /* initialized with default config, but no sync found */ +- /* maybe use updateMpegSurroundDecoderStatus later on */ +- pMpegSurroundDecoder->fOnSync[pMpegSurroundDecoder->bsFrameDecode] = +- MPEGS_SYNC_LOST; +- } +- +- /* Since we do not have state MPEGS_SYNC_COMPLETE apply concealment */ +- controlFlags |= MPEGS_CONCEAL; +- +- if (err != MPS_OK) { +- goto bail; +- } +- } +- +- /* +- * Process MPEG Surround Audio +- */ +- initControlFlags = controlFlags; +- +- /* Check that provided output buffer is large enough. */ +- if (pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis == 0) { +- err = MPS_UNSUPPORTED_FORMAT; +- goto bail; +- } +- timeDataRequiredSize = +- (timeDataFrameSize * +- pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT * +- pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / +- pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; +- if (timeDataSize < timeDataRequiredSize) { +- err = MPS_OUTPUT_BUFFER_TOO_SMALL; +- goto bail; +- } +- +- if ((pMpegSurroundDecoder->pSpatialDec->pConfigCurrent->syntaxFlags & +- SACDEC_SYNTAX_USAC) && +- (pMpegSurroundDecoder->pSpatialDec->stereoConfigIndex > 1)) { +- FDK_ASSERT(timeDataRequiredSize >= timeDataFrameSize * *nChannels); +- /* Place samples comprising QMF time slots spaced at QMF output Band raster +- * to allow slot wise processing */ +- int timeDataFrameSizeOut = +- (timeDataFrameSize * +- pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / +- pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; +- pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput = +- pTimeData + timeDataFrameSizeOut - timeDataFrameSize; +- for (int i = *nChannels - 1; i >= 0; i--) { +- FDKmemmove(pTimeData + (i + 1) * timeDataFrameSizeOut - timeDataFrameSize, +- pTimeData + timeDataFrameSize * i, +- sizeof(PCM_MPS) * timeDataFrameSize); +- FDKmemclear(pTimeData + i * timeDataFrameSizeOut, +- sizeof(PCM_MPS) * (timeDataFrameSizeOut - timeDataFrameSize)); +- } +- } else { +- if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface) { +- FDKmemcpy(input, pTimeData, +- sizeof(INT_PCM) * (*nChannels) * (*frameSize)); +- pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput = input; +- } +- } +- +- /* +- * Process MPEG Surround Audio +- */ +- err = SpatialDecApplyFrame( +- pMpegSurroundDecoder->pSpatialDec, +- &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], +- pMpegSurroundDecoder->mpegSurroundUseTimeInterface ? INPUTMODE_TIME +- : INPUTMODE_QMF_SBR, +- pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput, NULL, NULL, +- pTimeOut, *frameSize, &controlFlags, *nChannels, mapDescr); +- *nChannels = pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT; +- +- if (err != +- MPS_OK) { /* A fatal error occured. Go back to start and try again: */ +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ENFORCE_REINIT, MPEGS_SYNC_LOST, +- MPEGS_STOP); +- *frameSize = +- 0; /* Declare that framework can not use the data in pTimeOut. */ +- } else { +- if (((controlFlags & MPEGS_CONCEAL) && +- !(initControlFlags & MPEGS_CONCEAL)) || +- (pMpegSurroundDecoder->pSpatialDec->errInt != +- MPS_OK)) { /* Account for errors that occured in +- SpatialDecApplyFrame(): */ +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_ERROR_PAYLOAD, MPEGS_SYNC_LOST, +- MPEGS_STOP); +- } +- } +- +- if ((err == MPS_OK) && !(controlFlags & MPEGS_BYPASSMODE) && +- !(pMpegSurroundDecoder->upmixType == UPMIX_TYPE_BYPASS)) { +- SpatialDecChannelProperties(pMpegSurroundDecoder->pSpatialDec, channelType, +- channelIndices, mapDescr); +- } +- +-bail: +- +- if (newData) { +- /* numParameterSetsPrev shall only be read in the decode process, because of +- that we can update this state variable here */ +- pMpegSurroundDecoder->pSpatialDec->numParameterSetsPrev = +- pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode] +- .numParameterSets; +- } +- +- return (err); +-} +- +-/** +- * \brief Free config dependent MPEG Surround memory. +- **/ +-SACDEC_ERROR mpegSurroundDecoder_FreeMem( +- CMpegSurroundDecoder *pMpegSurroundDecoder) { +- SACDEC_ERROR err = MPS_OK; +- +- if (pMpegSurroundDecoder != NULL) { +- FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); +- pMpegSurroundDecoder->pSpatialDec = NULL; +- } +- +- return err; +-} +- +-/** +- * \brief Close MPEG Surround decoder. +- **/ +-void mpegSurroundDecoder_Close(CMpegSurroundDecoder *pMpegSurroundDecoder) { +- if (pMpegSurroundDecoder != NULL) { +- FDK_SpatialDecClose(pMpegSurroundDecoder->pSpatialDec); +- pMpegSurroundDecoder->pSpatialDec = NULL; +- +- for (int i = 0; i < 1; i++) { +- SpatialDecCloseBsFrame(&pMpegSurroundDecoder->bsFrames[i]); +- } +- +- FDK_FREE_MEMORY_1D(pMpegSurroundDecoder); +- } +-} +- +-#define SACDEC_VL0 2 +-#define SACDEC_VL1 0 +-#define SACDEC_VL2 0 +- +-int mpegSurroundDecoder_GetLibInfo(LIB_INFO *info) { +- int i; +- +- if (info == NULL) { +- return -1; +- } +- +- /* search for next free tab */ +- for (i = 0; i < FDK_MODULE_LAST; i++) { +- if (info[i].module_id == FDK_NONE) break; +- } +- if (i == FDK_MODULE_LAST) return -1; +- +- info += i; +- +- info->module_id = FDK_MPSDEC; +-#ifdef __ANDROID__ +- info->build_date = ""; +- info->build_time = ""; +-#else +- info->build_date = __DATE__; +- info->build_time = __TIME__; +-#endif +- info->title = "MPEG Surround Decoder"; +- info->version = LIB_VERSION(SACDEC_VL0, SACDEC_VL1, SACDEC_VL2); +- LIB_VERSION_STRING(info); +- info->flags = 0 | CAPF_MPS_LD | CAPF_MPS_USAC | CAPF_MPS_HQ | +- CAPF_MPS_1CH_IN | CAPF_MPS_2CH_OUT; /* end flags */ +- +- return 0; +-} +- +-SACDEC_ERROR mpegSurroundDecoder_SetParam( +- CMpegSurroundDecoder *pMpegSurroundDecoder, const SACDEC_PARAM param, +- const INT value) { +- SACDEC_ERROR err = MPS_OK; +- SPATIALDEC_PARAM *pUserParams = NULL; +- +- /* check decoder handle */ +- if (pMpegSurroundDecoder != NULL) { +- /* init local shortcuts */ +- pUserParams = &pMpegSurroundDecoder->mpegSurroundUserParams; +- } else { +- err = MPS_INVALID_HANDLE; +- /* check the parameter values before exiting. */ +- } +- +- /* apply param value */ +- switch (param) { +- case SACDEC_OUTPUT_MODE: +- switch ((SAC_DEC_OUTPUT_MODE)value) { +- case SACDEC_OUT_MODE_NORMAL: +- case SACDEC_OUT_MODE_STEREO: +- break; +- default: +- err = MPS_INVALID_PARAMETER; +- } +- if (err == MPS_OK) { +- if (0) { +- err = MPS_INVALID_PARAMETER; +- } else if (pUserParams->outputMode != (UCHAR)value) { +- pUserParams->outputMode = (UCHAR)value; +- pMpegSurroundDecoder +- ->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_OUTPUT_MODE; +- } +- } +- break; +- +- case SACDEC_INTERFACE: +- if (value < 0 || value > 1) { +- err = MPS_INVALID_PARAMETER; +- } +- if (err != MPS_OK) { +- goto bail; +- } +- if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface != (UCHAR)value) { +- pMpegSurroundDecoder->mpegSurroundUseTimeInterface = (UCHAR)value; +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_TIME_FREQ_INTERFACE; +- } +- break; +- +- case SACDEC_BS_INTERRUPTION: +- if ((err == MPS_OK) && (value != 0)) { +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_BS_INTERRUPTION, +- MPEGS_SYNC_LOST, MPEGS_STOP); +- } +- break; +- +- case SACDEC_CLEAR_HISTORY: +- if ((err == MPS_OK) && (value != 0)) { +- /* Just reset the states and go on. */ +- updateMpegSurroundDecoderStatus(pMpegSurroundDecoder, +- MPEGS_INIT_CLEAR_HISTORY, +- MPEGS_SYNC_LOST, MPEGS_STOP); +- } +- break; +- +- case SACDEC_CONCEAL_NUM_KEEP_FRAMES: +- if (value < 0) { /* Check valid value range */ +- err = MPS_INVALID_PARAMETER; +- } +- if (err != MPS_OK) { +- goto bail; +- } +- if (pUserParams->concealNumKeepFrames != (UINT)value) { +- pUserParams->concealNumKeepFrames = (UINT)value; +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_CONCEAL_PARAMS; +- } +- break; +- +- case SACDEC_CONCEAL_FADE_OUT_SLOPE_LENGTH: +- if (value < 0) { /* Check valid value range */ +- err = MPS_INVALID_PARAMETER; +- } +- if (err != MPS_OK) { +- goto bail; +- } +- if (pUserParams->concealFadeOutSlopeLength != (UINT)value) { +- pUserParams->concealFadeOutSlopeLength = (UINT)value; +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_CONCEAL_PARAMS; +- } +- break; +- +- case SACDEC_CONCEAL_FADE_IN_SLOPE_LENGTH: +- if (value < 0) { /* Check valid value range */ +- err = MPS_INVALID_PARAMETER; +- } +- if (err != MPS_OK) { +- goto bail; +- } +- if (pUserParams->concealFadeInSlopeLength != (UINT)value) { +- pUserParams->concealFadeInSlopeLength = (UINT)value; +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_CONCEAL_PARAMS; +- } +- break; +- +- case SACDEC_CONCEAL_NUM_RELEASE_FRAMES: +- if (value < 0) { /* Check valid value range */ +- err = MPS_INVALID_PARAMETER; +- } +- if (err != MPS_OK) { +- goto bail; +- } +- if (pUserParams->concealNumReleaseFrames != (UINT)value) { +- pUserParams->concealNumReleaseFrames = (UINT)value; +- pMpegSurroundDecoder->initFlags[pMpegSurroundDecoder->bsFrameDecode] |= +- MPEGS_INIT_CHANGE_CONCEAL_PARAMS; +- } +- break; +- +- default: +- err = MPS_INVALID_PARAMETER; +- break; +- } /* switch(param) */ +- +-bail: +- return err; +-} +- +-SACDEC_ERROR mpegSurroundDecoder_IsPseudoLR( +- CMpegSurroundDecoder *pMpegSurroundDecoder, int *bsPseudoLr) { +- if (pMpegSurroundDecoder != NULL) { +- const SPATIAL_SPECIFIC_CONFIG *sscDecode = +- &pMpegSurroundDecoder +- ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; +- *bsPseudoLr = (int)sscDecode->bsPseudoLr; +- return MPS_OK; +- } else +- return MPS_INVALID_HANDLE; +-} +- +-/** +- * \brief Get the signal delay caused by the MPEG Surround decoder module. +- **/ +-UINT mpegSurroundDecoder_GetDelay(const CMpegSurroundDecoder *self) { +- INT outputDelay = 0; +- +- if (self != NULL) { +- const SPATIAL_SPECIFIC_CONFIG *sscDecode = +- &self->spatialSpecificConfig[self->bsFrameDecode]; +- AUDIO_OBJECT_TYPE coreCodec = sscDecode->coreCodec; +- +- /* See chapter 4.5 (delay and synchronization) of ISO/IEC FDIS 23003-1 and +- chapter 5.4.3 of ISO/IEC FDIS 23003-2 for details on the following +- figures. */ +- +- if (coreCodec > AOT_NULL_OBJECT) { +- if (IS_LOWDELAY(coreCodec)) { +- /* All low delay variants (ER-AAC-(E)LD): */ +- outputDelay += 256; +- } else if (!IS_USAC(coreCodec)) { +- /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) +- * branch: */ +- outputDelay += 320 + 257; /* cos to exp delay + QMF synthesis */ +- if (self->mpegSurroundUseTimeInterface) { +- outputDelay += 320 + 384; /* QMF and hybrid analysis */ +- } +- } +- } +- } +- +- return (outputDelay); +-} +diff --git a/libSACdec/src/sac_dec_ssc_struct.h b/libSACdec/src/sac_dec_ssc_struct.h +deleted file mode 100644 +index b67b465..0000000 +--- a/libSACdec/src/sac_dec_ssc_struct.h ++++ /dev/null +@@ -1,283 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: interface - spatial specific config struct +- +-*******************************************************************************/ +- +-#ifndef SAC_DEC_SSC_STRUCT_H +-#define SAC_DEC_SSC_STRUCT_H +- +-#include "FDK_audio.h" +- +-#define MAX_NUM_QMF_BANDS (128) +-#define MAX_TIME_SLOTS 64 +-#define MAX_INPUT_CHANNELS 1 +-#define MAX_OUTPUT_CHANNELS \ +- 2 /* CAUTION: This does NOT restrict the number of \ +- output channels exclusively! In addition it \ +- affects the max number of bitstream and residual channels! */ +-#define MAX_NUM_OTT (5) +-#define MAX_NUM_TTT (0) +-#define MAX_NUM_EXT_TYPES (8) +-#define MAX_PARAMETER_BANDS (28) +-#define MAX_PARAMETER_BANDS_LD (23) +- +-#define MAX_NUM_XCHANNELS (6) +- +-#define MAX_ARBITRARY_TREE_LEVELS (0) +- +-typedef enum { +- /* CAUTION: Do not change enum values! */ +- SPATIALDEC_FREQ_RES_40 = 40, +- SPATIALDEC_FREQ_RES_28 = 28, +- SPATIALDEC_FREQ_RES_23 = 23, +- SPATIALDEC_FREQ_RES_20 = 20, +- SPATIALDEC_FREQ_RES_15 = 15, +- SPATIALDEC_FREQ_RES_14 = 14, +- SPATIALDEC_FREQ_RES_12 = 12, +- SPATIALDEC_FREQ_RES_10 = 10, +- SPATIALDEC_FREQ_RES_9 = 9, +- SPATIALDEC_FREQ_RES_7 = 7, +- SPATIALDEC_FREQ_RES_5 = 5, +- SPATIALDEC_FREQ_RES_4 = 4 +- +-} SPATIALDEC_FREQ_RES; +- +-typedef enum { +- +- SPATIALDEC_QUANT_FINE_DEF = 0, +- SPATIALDEC_QUANT_EDQ1 = 1, +- SPATIALDEC_QUANT_EDQ2 = 2, +- SPATIALDEC_QUANT_RSVD3 = 3, +- SPATIALDEC_QUANT_RSVD4 = 4, +- SPATIALDEC_QUANT_RSVD5 = 5, +- SPATIALDEC_QUANT_RSVD6 = 6, +- SPATIALDEC_QUANT_RSVD7 = 7 +- +-} SPATIALDEC_QUANT_MODE; +- +-typedef enum { SPATIALDEC_MODE_RSVD7 = 7 } SPATIALDEC_TREE_CONFIG; +- +-typedef enum { +- +- SPATIALDEC_GAIN_MODE0 = 0, +- SPATIALDEC_GAIN_RSVD1 = 1, +- SPATIALDEC_GAIN_RSVD2 = 2, +- SPATIALDEC_GAIN_RSVD3 = 3, +- SPATIALDEC_GAIN_RSVD4 = 4, +- SPATIALDEC_GAIN_RSVD5 = 5, +- SPATIALDEC_GAIN_RSVD6 = 6, +- SPATIALDEC_GAIN_RSVD7 = 7, +- SPATIALDEC_GAIN_RSVD8 = 8, +- SPATIALDEC_GAIN_RSVD9 = 9, +- SPATIALDEC_GAIN_RSVD10 = 10, +- SPATIALDEC_GAIN_RSVD11 = 11, +- SPATIALDEC_GAIN_RSVD12 = 12, +- SPATIALDEC_GAIN_RSVD13 = 13, +- SPATIALDEC_GAIN_RSVD14 = 14, +- SPATIALDEC_GAIN_RSVD15 = 15 +- +-} SPATIALDEC_FIXED_GAINS; +- +-typedef enum { +- +- SPATIALDEC_TS_TPNOWHITE = 0, +- SPATIALDEC_TS_TPWHITE = 1, +- SPATIALDEC_TS_TES = 2, +- SPATIALDEC_TS_NOTS = 3, +- SPATIALDEC_TS_RSVD4 = 4, +- SPATIALDEC_TS_RSVD5 = 5, +- SPATIALDEC_TS_RSVD6 = 6, +- SPATIALDEC_TS_RSVD7 = 7, +- SPATIALDEC_TS_RSVD8 = 8, +- SPATIALDEC_TS_RSVD9 = 9, +- SPATIALDEC_TS_RSVD10 = 10, +- SPATIALDEC_TS_RSVD11 = 11, +- SPATIALDEC_TS_RSVD12 = 12, +- SPATIALDEC_TS_RSVD13 = 13, +- SPATIALDEC_TS_RSVD14 = 14, +- SPATIALDEC_TS_RSVD15 = 15 +- +-} SPATIALDEC_TS_CONF; +- +-typedef enum { +- +- SPATIALDEC_DECORR_MODE0 = 0, +- SPATIALDEC_DECORR_MODE1 = 1, +- SPATIALDEC_DECORR_MODE2 = 2, +- SPATIALDEC_DECORR_RSVD3 = 3, +- SPATIALDEC_DECORR_RSVD4 = 4, +- SPATIALDEC_DECORR_RSVD5 = 5, +- SPATIALDEC_DECORR_RSVD6 = 6, +- SPATIALDEC_DECORR_RSVD7 = 7, +- SPATIALDEC_DECORR_RSVD8 = 8, +- SPATIALDEC_DECORR_RSVD9 = 9, +- SPATIALDEC_DECORR_RSVD10 = 10, +- SPATIALDEC_DECORR_RSVD11 = 11, +- SPATIALDEC_DECORR_RSVD12 = 12, +- SPATIALDEC_DECORR_RSVD13 = 13, +- SPATIALDEC_DECORR_RSVD14 = 14, +- SPATIALDEC_DECORR_RSVD15 = 15 +- +-} SPATIALDEC_DECORR_CONF; +- +-typedef struct T_SPATIALDEC_OTT_CONF { +- int nOttBands; +- +-} SPATIALDEC_OTT_CONF; +- +-typedef struct T_SPATIALDEC_RESIDUAL_CONF { +- int bResidualPresent; +- int nResidualBands; +- +-} SPATIALDEC_RESIDUAL_CONF; +- +-typedef struct T_SPATIAL_SPECIFIC_CONFIG { +- UINT syntaxFlags; +- int samplingFreq; +- int nTimeSlots; +- SPATIALDEC_FREQ_RES freqRes; +- SPATIALDEC_TREE_CONFIG treeConfig; +- SPATIALDEC_QUANT_MODE quantMode; +- int bArbitraryDownmix; +- +- int bResidualCoding; +- SPATIALDEC_FIXED_GAINS bsFixedGainDMX; +- +- SPATIALDEC_TS_CONF tempShapeConfig; +- SPATIALDEC_DECORR_CONF decorrConfig; +- +- int nInputChannels; /* derived from treeConfig */ +- int nOutputChannels; /* derived from treeConfig */ +- +- /* ott config */ +- int nOttBoxes; /* derived from treeConfig */ +- SPATIALDEC_OTT_CONF OttConfig[MAX_NUM_OTT]; /* dimension nOttBoxes */ +- +- /* ttt config */ +- int nTttBoxes; /* derived from treeConfig */ +- +- /* residual config */ +- SPATIALDEC_RESIDUAL_CONF +- ResidualConfig[MAX_NUM_OTT + +- MAX_NUM_TTT]; /* dimension (nOttBoxes + nTttBoxes) */ +- +- int sacExtCnt; +- int sacExtType[MAX_NUM_EXT_TYPES]; +- int envQuantMode; +- +- AUDIO_OBJECT_TYPE coreCodec; +- +- UCHAR stereoConfigIndex; +- UCHAR coreSbrFrameLengthIndex; /* Table 70 in ISO/IEC FDIS 23003-3:2011 */ +- UCHAR bsHighRateMode; +- UCHAR bsDecorrType; +- UCHAR bsPseudoLr; +- UCHAR bsPhaseCoding; +- UCHAR bsOttBandsPhasePresent; +- int bsOttBandsPhase; +- +- SCHAR ottCLDdefault[MAX_NUM_OTT]; +- UCHAR numOttBandsIPD; +- UCHAR bitstreamOttBands[MAX_NUM_OTT]; +- UCHAR numOttBands[MAX_NUM_OTT]; +- +-} SPATIAL_SPECIFIC_CONFIG; +- +-#endif +diff --git a/libSACdec/src/sac_process.cpp b/libSACdec/src/sac_process.cpp +deleted file mode 100644 +index 56c72ad..0000000 +--- a/libSACdec/src/sac_process.cpp ++++ /dev/null +@@ -1,1066 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Processing +- +-*******************************************************************************/ +- +-/* data structures and interfaces for spatial audio reference software */ +-#include "sac_process.h" +- +-#include "sac_bitdec.h" +-#include "sac_calcM1andM2.h" +-#include "sac_smoothing.h" +-#include "sac_rom.h" +- +-#include "sac_dec_errorcodes.h" +- +-#include "FDK_trigFcts.h" +-#include "FDK_decorrelate.h" +- +-/** +- * \brief Linear interpolation between two parameter values. +- * a*alpha + b*(1-alpha) +- * = a*alpha + b - b*alpha +- * +- * \param alpha Weighting factor. +- * \param a Parameter a. +- * \param b Parameter b. +- * +- * \return Interpolated parameter value. +- */ +-FDK_INLINE FIXP_DBL interpolateParameter(const FIXP_SGL alpha, const FIXP_DBL a, +- const FIXP_DBL b) { +- return (b - fMult(alpha, b) + fMult(alpha, a)); +-} +- +-/** +- * \brief Map MPEG Surround channel indices to MPEG 4 PCE like channel indices. +- * \param self Spatial decoder handle. +- * \param ch MPEG Surround channel index. +- * \return MPEG 4 PCE style channel index, corresponding to the given MPEG +- * Surround channel index. +- */ +-static UINT mapChannel(spatialDec *self, UINT ch) { +- static const UCHAR chanelIdx[][8] = { +- {0, 1, 2, 3, 4, 5, 6, 7}, /* binaural, TREE_212, arbitrary tree */ +- }; +- +- int idx = 0; +- +- return (chanelIdx[idx][ch]); +-} +- +-FIXP_DBL getChGain(spatialDec *self, UINT ch, INT *scale) { +- /* init no gain modifier */ +- FIXP_DBL gain = 0x80000000; +- *scale = 0; +- +- if ((!isTwoChMode(self->upmixType)) && +- (self->upmixType != UPMIXTYPE_BYPASS)) { +- if ((ch == 0) || (ch == 1) || (ch == 2)) { +- /* no modifier */ +- } +- } +- +- return gain; +-} +- +-SACDEC_ERROR SpatialDecQMFAnalysis(spatialDec *self, const PCM_MPS *inData, +- const INT ts, const INT bypassMode, +- FIXP_DBL **qmfReal, FIXP_DBL **qmfImag, +- const int numInputChannels) { +- SACDEC_ERROR err = MPS_OK; +- int ch, offset; +- +- offset = self->pQmfDomain->globalConf.nBandsSynthesis * +- self->pQmfDomain->globalConf.nQmfTimeSlots; +- +- { +- for (ch = 0; ch < numInputChannels; ch++) { +- const PCM_MPS *inSamples = +- &inData[ts * self->pQmfDomain->globalConf.nBandsAnalysis]; +- FIXP_DBL *pQmfRealAnalysis = qmfReal[ch]; /* no delay in blind mode */ +- FIXP_DBL *pQmfImagAnalysis = qmfImag[ch]; +- +- CalculateSpaceAnalysisQmf(&self->pQmfDomain->QmfDomainIn[ch].fb, +- inSamples + (ch * offset), pQmfRealAnalysis, +- pQmfImagAnalysis); +- +- if (!isTwoChMode(self->upmixType) && !bypassMode) { +- int i; +- for (i = 0; i < self->qmfBands; i++) { +- qmfReal[ch][i] = fMult(qmfReal[ch][i], self->clipProtectGain__FDK); +- qmfImag[ch][i] = fMult(qmfImag[ch][i], self->clipProtectGain__FDK); +- } +- } +- } +- } +- +- self->qmfInputDelayBufPos = +- (self->qmfInputDelayBufPos + 1) % self->pc_filterdelay; +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecFeedQMF(spatialDec *self, FIXP_DBL **qmfInDataReal, +- FIXP_DBL **qmfInDataImag, const INT ts, +- const INT bypassMode, FIXP_DBL **qmfReal__FDK, +- FIXP_DBL **qmfImag__FDK, +- const INT numInputChannels) { +- SACDEC_ERROR err = MPS_OK; +- int ch; +- +- { +- for (ch = 0; ch < numInputChannels; ch++) { +- FIXP_DBL *pQmfRealAnalysis = +- qmfReal__FDK[ch]; /* no delay in blind mode */ +- FIXP_DBL *pQmfImagAnalysis = qmfImag__FDK[ch]; +- +- /* Write Input data to pQmfRealAnalysis. */ +- if (self->bShareDelayWithSBR) { +- FDK_QmfDomain_GetSlot( +- &self->pQmfDomain->QmfDomainIn[ch], ts + HYBRID_FILTER_DELAY, 0, +- MAX_QMF_BANDS_TO_HYBRID, pQmfRealAnalysis, pQmfImagAnalysis, 15); +- FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts, +- MAX_QMF_BANDS_TO_HYBRID, self->qmfBands, +- pQmfRealAnalysis, pQmfImagAnalysis, 15); +- } else { +- FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts, 0, +- self->qmfBands, pQmfRealAnalysis, +- pQmfImagAnalysis, 15); +- } +- if (ts == self->pQmfDomain->globalConf.nQmfTimeSlots - 1) { +- /* Is currently also needed in case we dont have any overlap. We need to +- * save lb_scale to ov_lb_scale */ +- FDK_QmfDomain_SaveOverlap(&self->pQmfDomain->QmfDomainIn[ch], 0); +- } +- +- /* Apply clip protection to output. */ +- if (!isTwoChMode(self->upmixType) && !bypassMode) { +- int i; +- for (i = 0; i < self->qmfBands; i++) { +- qmfReal__FDK[ch][i] = +- fMult(qmfReal__FDK[ch][i], self->clipProtectGain__FDK); +- qmfImag__FDK[ch][i] = +- fMult(qmfImag__FDK[ch][i], self->clipProtectGain__FDK); +- } +- } +- +- } /* End of loop over numInputChannels */ +- } +- +- self->qmfInputDelayBufPos = +- (self->qmfInputDelayBufPos + 1) % self->pc_filterdelay; +- +- return err; +-} +- +-/******************************************************************************* +- Functionname: SpatialDecHybridAnalysis +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- float** pointers[4] leftReal, leftIm, rightReal, rightIm +- +- Output: +- float self->qmfInputReal[MAX_INPUT_CHANNELS][MAX_TIME_SLOTS][MAX_QMF_BANDS]; +- float self->qmfInputImag[MAX_INPUT_CHANNELS][MAX_TIME_SLOTS][MAX_QMF_BANDS]; +- +- float +-self->hybInputReal[MAX_INPUT_CHANNELS][MAX_TIME_SLOTS][MAX_HYBRID_BANDS]; float +-self->hybInputImag[MAX_INPUT_CHANNELS][MAX_TIME_SLOTS][MAX_HYBRID_BANDS]; +- +- +-*******************************************************************************/ +-SACDEC_ERROR SpatialDecHybridAnalysis(spatialDec *self, FIXP_DBL **qmfInputReal, +- FIXP_DBL **qmfInputImag, +- FIXP_DBL **hybOutputReal, +- FIXP_DBL **hybOutputImag, const INT ts, +- const INT numInputChannels) { +- SACDEC_ERROR err = MPS_OK; +- int ch; +- +- for (ch = 0; ch < numInputChannels; +- ch++) /* hybrid filtering for down-mix signals */ +- { +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) { +- int k; +- /* No hybrid filtering. Just copy the QMF data. */ +- for (k = 0; k < self->hybridBands; k += 1) { +- hybOutputReal[ch][k] = qmfInputReal[ch][k]; +- hybOutputImag[ch][k] = qmfInputImag[ch][k]; +- } +- } else { +- self->hybridAnalysis[ch].hfMode = self->bShareDelayWithSBR; +- +- if (self->stereoConfigIndex == 3) +- FDK_ASSERT(self->hybridAnalysis[ch].hfMode == 0); +- FDKhybridAnalysisApply(&self->hybridAnalysis[ch], qmfInputReal[ch], +- qmfInputImag[ch], hybOutputReal[ch], +- hybOutputImag[ch]); +- } +- } +- +- if ((self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_USAC) && +- self->residualCoding) { +- self->hybridAnalysis[numInputChannels].hfMode = 0; +- FDKhybridAnalysisApply( +- &self->hybridAnalysis[numInputChannels], +- self->qmfResidualReal__FDK[0][0], self->qmfResidualImag__FDK[0][0], +- self->hybResidualReal__FDK[0], self->hybResidualImag__FDK[0]); +- } +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecCreateX(spatialDec *self, FIXP_DBL **hybInputReal, +- FIXP_DBL **hybInputImag, FIXP_DBL **pxReal, +- FIXP_DBL **pxImag) { +- SACDEC_ERROR err = MPS_OK; +- int row; +- +- /* Creating wDry */ +- for (row = 0; row < self->numInputChannels; row++) { +- /* pointer to direct signals */ +- pxReal[row] = hybInputReal[row]; +- pxImag[row] = hybInputImag[row]; +- } +- +- return err; +-} +- +-static void M2ParamToKernelMult(FIXP_SGL *RESTRICT pKernel, +- FIXP_DBL *RESTRICT Mparam, +- FIXP_DBL *RESTRICT MparamPrev, +- int *RESTRICT pWidth, FIXP_SGL alpha__FDK, +- int nBands) { +- int pb; +- +- for (pb = 0; pb < nBands; pb++) { +- FIXP_SGL tmp = FX_DBL2FX_SGL( +- interpolateParameter(alpha__FDK, Mparam[pb], MparamPrev[pb])); +- +- int i = pWidth[pb]; +- if (i & 1) *pKernel++ = tmp; +- if (i & 2) { +- *pKernel++ = tmp; +- *pKernel++ = tmp; +- } +- for (i >>= 2; i--;) { +- *pKernel++ = tmp; +- *pKernel++ = tmp; +- *pKernel++ = tmp; +- *pKernel++ = tmp; +- } +- } +-} +- +-SACDEC_ERROR SpatialDecApplyM1_CreateW_Mode212( +- spatialDec *self, const SPATIAL_BS_FRAME *frame, FIXP_DBL **xReal, +- FIXP_DBL **xImag, FIXP_DBL **vReal, FIXP_DBL **vImag) { +- SACDEC_ERROR err = MPS_OK; +- int res; +- FIXP_DBL *decorrInReal = vReal[0]; +- FIXP_DBL *decorrInImag = vImag[0]; +- +- /* M1 does not do anything in 212 mode, so use simplified processing */ +- FDK_ASSERT(self->numVChannels == 2); +- FDK_ASSERT(self->numDirektSignals == 1); +- FDK_ASSERT(self->numDecorSignals == 1); +- FDKmemcpy(vReal[0], xReal[0], self->hybridBands * sizeof(FIXP_DBL)); +- FDKmemcpy(vImag[0], xImag[0], self->hybridBands * sizeof(FIXP_DBL)); +- +- if (isTsdActive(frame->TsdData)) { +- /* Generate v_{x,nonTr} as input for allpass based decorrelator */ +- TsdGenerateNonTr(self->hybridBands, frame->TsdData, self->TsdTs, vReal[0], +- vImag[0], vReal[1], vImag[1], &decorrInReal, +- &decorrInImag); +- } +- /* - Decorrelate */ +- res = SpatialDecGetResidualIndex(self, 1); +- if (FDKdecorrelateApply(&self->apDecor[0], decorrInReal, decorrInImag, +- vReal[1], vImag[1], +- self->param2hyb[self->residualBands[res]])) { +- return MPS_NOTOK; +- } +- if (isTsdActive(frame->TsdData)) { +- /* Generate v_{x,Tr}, apply transient decorrelator and add to allpass based +- * decorrelator output */ +- TsdApply(self->hybridBands, frame->TsdData, &self->TsdTs, +- vReal[0], /* input: v_x */ +- vImag[0], +- vReal[1], /* input: d_{x,nonTr}; output: d_{x,nonTr} + d_{x,Tr} */ +- vImag[1]); +- } +- +- /* Write residual signal in approriate parameter bands */ +- if (self->residualBands[res] > 0) { +- int stopBand = self->param2hyb[self->residualBands[res]]; +- FDKmemcpy(vReal[1], self->hybResidualReal__FDK[res], +- fixMin(stopBand, self->hybridBands) * sizeof(FIXP_DBL)); +- FDKmemcpy(vImag[1], self->hybResidualImag__FDK[res], +- fixMin(stopBand, self->hybridBands) * sizeof(FIXP_DBL)); +- } /* (self->residualBands[res]>0) */ +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecApplyM2_Mode212(spatialDec *self, INT ps, +- const FIXP_SGL alpha, FIXP_DBL **wReal, +- FIXP_DBL **wImag, +- FIXP_DBL **hybOutputRealDry, +- FIXP_DBL **hybOutputImagDry) { +- SACDEC_ERROR err = MPS_OK; +- INT row; +- +- INT *pWidth = self->kernels_width; +- /* for stereoConfigIndex == 3 case hybridBands is < 71 */ +- INT pb_max = self->kernels[self->hybridBands - 1] + 1; +- INT max_row = self->numOutputChannels; +- +- INT M2_exp = 0; +- if (self->residualCoding) M2_exp = 3; +- +- for (row = 0; row < max_row; row++) // 2 times +- { +- FIXP_DBL *Mparam0 = self->M2Real__FDK[row][0]; +- FIXP_DBL *Mparam1 = self->M2Real__FDK[row][1]; +- FIXP_DBL *MparamPrev0 = self->M2RealPrev__FDK[row][0]; +- FIXP_DBL *MparamPrev1 = self->M2RealPrev__FDK[row][1]; +- +- FIXP_DBL *RESTRICT pHybOutRealDry = hybOutputRealDry[row]; +- FIXP_DBL *RESTRICT pHybOutImagDry = hybOutputImagDry[row]; +- +- FIXP_DBL *RESTRICT pWReal0 = wReal[0]; +- FIXP_DBL *RESTRICT pWReal1 = wReal[1]; +- FIXP_DBL *RESTRICT pWImag0 = wImag[0]; +- FIXP_DBL *RESTRICT pWImag1 = wImag[1]; +- for (INT pb = 0; pb < pb_max; pb++) { +- FIXP_DBL tmp0, tmp1; +- +- tmp0 = interpolateParameter(alpha, Mparam0[pb], MparamPrev0[pb]); +- tmp1 = interpolateParameter(alpha, Mparam1[pb], MparamPrev1[pb]); +- +- INT i = pWidth[pb]; +- +- do // about 3-4 times +- { +- FIXP_DBL var0, var1, real, imag; +- +- var0 = *pWReal0++; +- var1 = *pWReal1++; +- real = fMultDiv2(var0, tmp0); +- var0 = *pWImag0++; +- real = fMultAddDiv2(real, var1, tmp1); +- var1 = *pWImag1++; +- imag = fMultDiv2(var0, tmp0); +- *pHybOutRealDry++ = real << (1 + M2_exp); +- imag = fMultAddDiv2(imag, var1, tmp1); +- *pHybOutImagDry++ = imag << (1 + M2_exp); +- } while (--i != 0); +- } +- } +- return err; +-} +- +-SACDEC_ERROR SpatialDecApplyM2_Mode212_ResidualsPlusPhaseCoding( +- spatialDec *self, INT ps, const FIXP_SGL alpha, FIXP_DBL **wReal, +- FIXP_DBL **wImag, FIXP_DBL **hybOutputRealDry, +- FIXP_DBL **hybOutputImagDry) { +- SACDEC_ERROR err = MPS_OK; +- INT row; +- INT scale_param_m2; +- INT *pWidth = self->kernels_width; +- INT pb_max = self->kernels[self->hybridBands - 1] + 1; +- +- scale_param_m2 = SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2; +- +- for (row = 0; row < self->numM2rows; row++) { +- INT qs, pb; +- +- FIXP_DBL *RESTRICT pWReal0 = wReal[0]; +- FIXP_DBL *RESTRICT pWImag0 = wImag[0]; +- FIXP_DBL *RESTRICT pWReal1 = wReal[1]; +- FIXP_DBL *RESTRICT pWImag1 = wImag[1]; +- +- FIXP_DBL *MReal0 = self->M2Real__FDK[row][0]; +- FIXP_DBL *MImag0 = self->M2Imag__FDK[row][0]; +- FIXP_DBL *MReal1 = self->M2Real__FDK[row][1]; +- FIXP_DBL *MRealPrev0 = self->M2RealPrev__FDK[row][0]; +- FIXP_DBL *MImagPrev0 = self->M2ImagPrev__FDK[row][0]; +- FIXP_DBL *MRealPrev1 = self->M2RealPrev__FDK[row][1]; +- +- FIXP_DBL *RESTRICT pHybOutRealDry = hybOutputRealDry[row]; +- FIXP_DBL *RESTRICT pHybOutImagDry = hybOutputImagDry[row]; +- +- FDK_ASSERT(!(self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD)); +- FDK_ASSERT((pWidth[0] + pWidth[1]) >= 3); +- +- for (pb = 0, qs = 3; pb < 2; pb++) { +- INT s; +- FIXP_DBL maxVal; +- FIXP_SGL mReal1; +- FIXP_SGL mReal0, mImag0; +- FIXP_DBL iReal0, iImag0, iReal1; +- +- iReal0 = interpolateParameter(alpha, MReal0[pb], MRealPrev0[pb]); +- iImag0 = -interpolateParameter(alpha, MImag0[pb], MImagPrev0[pb]); +- iReal1 = interpolateParameter(alpha, MReal1[pb], MRealPrev1[pb]); +- +- maxVal = fAbs(iReal0) | fAbs(iImag0); +- maxVal |= fAbs(iReal1); +- +- s = fMax(CntLeadingZeros(maxVal) - 1, 0); +- s = fMin(s, scale_param_m2); +- +- mReal0 = FX_DBL2FX_SGL(iReal0 << s); +- mImag0 = FX_DBL2FX_SGL(iImag0 << s); +- mReal1 = FX_DBL2FX_SGL(iReal1 << s); +- +- s = scale_param_m2 - s; +- +- INT i = pWidth[pb]; +- +- do { +- FIXP_DBL real, imag, wReal0, wImag0, wReal1, wImag1; +- +- wReal0 = *pWReal0++; +- wImag0 = *pWImag0++; +- wReal1 = *pWReal1++; +- wImag1 = *pWImag1++; +- +- cplxMultDiv2(&real, &imag, wReal0, wImag0, mReal0, mImag0); +- +- *pHybOutRealDry++ = fMultAddDiv2(real, wReal1, mReal1) << s; +- *pHybOutImagDry++ = fMultAddDiv2(imag, wImag1, mReal1) << s; +- +- if (qs > 0) { +- mImag0 = -mImag0; +- qs--; +- } +- } while (--i != 0); +- } +- +- for (; pb < pb_max; pb++) { +- INT s; +- FIXP_DBL maxVal; +- FIXP_SGL mReal1; +- FIXP_SGL mReal0, mImag0; +- FIXP_DBL iReal0, iImag0, iReal1; +- +- iReal0 = interpolateParameter(alpha, MReal0[pb], MRealPrev0[pb]); +- iImag0 = interpolateParameter(alpha, MImag0[pb], MImagPrev0[pb]); +- iReal1 = interpolateParameter(alpha, MReal1[pb], MRealPrev1[pb]); +- +- maxVal = fAbs(iReal0) | fAbs(iImag0); +- maxVal |= fAbs(iReal1); +- +- s = fMax(CntLeadingZeros(maxVal) - 1, 0); +- s = fMin(s, scale_param_m2); +- +- mReal0 = FX_DBL2FX_SGL(iReal0 << s); +- mImag0 = FX_DBL2FX_SGL(iImag0 << s); +- mReal1 = FX_DBL2FX_SGL(iReal1 << s); +- +- s = scale_param_m2 - s; +- +- INT i = pWidth[pb]; +- +- do { +- FIXP_DBL real, imag, wReal0, wImag0, wReal1, wImag1; +- +- wReal0 = *pWReal0++; +- wImag0 = *pWImag0++; +- wReal1 = *pWReal1++; +- wImag1 = *pWImag1++; +- +- cplxMultDiv2(&real, &imag, wReal0, wImag0, mReal0, mImag0); +- +- *pHybOutRealDry++ = fMultAddDiv2(real, wReal1, mReal1) << s; +- *pHybOutImagDry++ = fMultAddDiv2(imag, wImag1, mReal1) << s; +- } while (--i != 0); +- } +- } +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecApplyM2(spatialDec *self, INT ps, const FIXP_SGL alpha, +- FIXP_DBL **wReal, FIXP_DBL **wImag, +- FIXP_DBL **hybOutputRealDry, +- FIXP_DBL **hybOutputImagDry, +- FIXP_DBL **hybOutputRealWet, +- FIXP_DBL **hybOutputImagWet) { +- SACDEC_ERROR err = MPS_OK; +- +- { +- int qs, row, col; +- int complexHybBands; +- int complexParBands; +- int scale_param_m2 = 0; +- int toolsDisabled; +- +- UCHAR activParamBands; +- FIXP_DBL *RESTRICT pWReal, *RESTRICT pWImag, *RESTRICT pHybOutRealDry, +- *RESTRICT pHybOutImagDry, *RESTRICT pHybOutRealWet, +- *RESTRICT pHybOutImagWet; +- C_ALLOC_SCRATCH_START(pKernel, FIXP_SGL, MAX_HYBRID_BANDS); +- +- /* The wet signal is added to the dry signal directly in applyM2 if GES and +- * STP are disabled */ +- toolsDisabled = +- ((self->tempShapeConfig == 1) || (self->tempShapeConfig == 2)) ? 0 : 1; +- +- { +- complexHybBands = self->hybridBands; +- complexParBands = self->numParameterBands; +- } +- +- FDKmemclear(hybOutputImagDry[0], +- self->createParams.maxNumOutputChannels * +- self->createParams.maxNumCmplxHybBands * sizeof(FIXP_DBL)); +- FDKmemclear(hybOutputRealDry[0], self->createParams.maxNumOutputChannels * +- self->createParams.maxNumHybridBands * +- sizeof(FIXP_DBL)); +- +- if (!toolsDisabled) { +- FDKmemclear(hybOutputRealWet[0], +- self->createParams.maxNumOutputChannels * +- self->createParams.maxNumHybridBands * sizeof(FIXP_DBL)); +- FDKmemclear(hybOutputImagWet[0], +- self->createParams.maxNumOutputChannels * +- self->createParams.maxNumCmplxHybBands * +- sizeof(FIXP_DBL)); +- } +- +- if (self->phaseCoding == 3) { +- /* + SCALE_DATA_APPLY_M2 to compensate for Div2 below ?! */ +- scale_param_m2 = SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2; +- } +- +- for (row = 0; row < self->numM2rows; row++) { +- pHybOutRealDry = hybOutputRealDry[row]; +- pHybOutImagDry = hybOutputImagDry[row]; +- +- if (toolsDisabled) { +- pHybOutRealWet = hybOutputRealDry[row]; +- pHybOutImagWet = hybOutputImagDry[row]; +- } else { +- pHybOutRealWet = hybOutputRealWet[row]; +- pHybOutImagWet = hybOutputImagWet[row]; +- } +- +- for (col = 0; col < self->numDirektSignals; col++) { +- if (self->pActivM2ParamBands == +- 0) { /* default setting, calculate all rows and columns */ +- activParamBands = 1; +- } else { +- if (self->pActivM2ParamBands[MAX_M2_INPUT * row + +- col]) /* table with activ and inactiv +- bands exists for current +- configuration */ +- activParamBands = 1; +- else +- activParamBands = 0; +- } +- if (activParamBands) { +- pWReal = wReal[col]; +- pWImag = wImag[col]; +- +- M2ParamToKernelMult(pKernel, self->M2Real__FDK[row][col], +- self->M2RealPrev__FDK[row][col], +- self->kernels_width, alpha, +- self->numParameterBands); +- +- if (1 && (self->phaseCoding != 3)) { +- /* direct signals */ +- { +- /* only one sample will be assigned to each row, hence +- * accumulation is not neccessary; that is valid for all +- * configurations */ +- for (qs = 0; qs < complexHybBands; qs++) { +- pHybOutRealDry[qs] = fMult(pWReal[qs], pKernel[qs]); +- pHybOutImagDry[qs] = fMult(pWImag[qs], pKernel[qs]); +- } +- } +- } else { /* isBinauralMode(self->upmixType) */ +- +- for (qs = 0; qs < complexHybBands; qs++) { +- pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- +- M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col], +- self->M2ImagPrev__FDK[row][col], +- self->kernels_width, alpha, complexParBands); +- +- /* direct signals sign is -1 for qs = 0,2 */ +- pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0]) +- << (scale_param_m2); +- pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0]) +- << (scale_param_m2); +- +- pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2]) +- << (scale_param_m2); +- pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2]) +- << (scale_param_m2); +- +- /* direct signals sign is +1 for qs = 1,3,4,5,...,complexHybBands */ +- pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1]) +- << (scale_param_m2); +- pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1]) +- << (scale_param_m2); +- +- for (qs = 3; qs < complexHybBands; qs++) { +- pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- } /* self->upmixType */ +- } /* if (activParamBands) */ +- } /* self->numDirektSignals */ +- +- for (; col < self->numVChannels; col++) { +- if (self->pActivM2ParamBands == +- 0) { /* default setting, calculate all rows and columns */ +- activParamBands = 1; +- } else { +- if (self->pActivM2ParamBands[MAX_M2_INPUT * row + +- col]) /* table with activ and inactiv +- bands exists for current +- configuration */ +- activParamBands = 1; +- else +- activParamBands = 0; +- } +- +- if (activParamBands) { +- int resBandIndex; +- int resHybIndex; +- +- resBandIndex = +- self->residualBands[SpatialDecGetResidualIndex(self, col)]; +- resHybIndex = self->param2hyb[resBandIndex]; +- +- pWReal = wReal[col]; +- pWImag = wImag[col]; +- +- M2ParamToKernelMult(pKernel, self->M2Real__FDK[row][col], +- self->M2RealPrev__FDK[row][col], +- self->kernels_width, alpha, +- self->numParameterBands); +- +- if (1 && (self->phaseCoding != 3)) { +- /* residual signals */ +- for (qs = 0; qs < resHybIndex; qs++) { +- pHybOutRealDry[qs] += fMult(pWReal[qs], pKernel[qs]); +- pHybOutImagDry[qs] += fMult(pWImag[qs], pKernel[qs]); +- } +- /* decor signals */ +- for (; qs < complexHybBands; qs++) { +- pHybOutRealWet[qs] += fMult(pWReal[qs], pKernel[qs]); +- pHybOutImagWet[qs] += fMult(pWImag[qs], pKernel[qs]); +- } +- } else { /* self->upmixType */ +- /* residual signals */ +- FIXP_DBL *RESTRICT pHybOutReal; +- FIXP_DBL *RESTRICT pHybOutImag; +- +- for (qs = 0; qs < resHybIndex; qs++) { +- pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- /* decor signals */ +- for (; qs < complexHybBands; qs++) { +- pHybOutRealWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagWet[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- +- M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col], +- self->M2ImagPrev__FDK[row][col], +- self->kernels_width, alpha, complexParBands); +- +- /* direct signals sign is -1 for qs = 0,2 */ +- /* direct signals sign is +1 for qs = 1,3.. */ +- if (toolsDisabled) { +- pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0]) +- << (scale_param_m2); +- pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0]) +- << (scale_param_m2); +- +- pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1]) +- << (scale_param_m2); +- pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1]) +- << (scale_param_m2); +- +- pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2]) +- << (scale_param_m2); +- pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2]) +- << (scale_param_m2); +- } else { +- pHybOutReal = &pHybOutRealDry[0]; +- pHybOutImag = &pHybOutImagDry[0]; +- if (0 == resHybIndex) { +- pHybOutReal = &pHybOutRealWet[0]; +- pHybOutImag = &pHybOutImagWet[0]; +- } +- pHybOutReal[0] += fMultDiv2(pWImag[0], pKernel[0]) +- << (scale_param_m2); +- pHybOutImag[0] -= fMultDiv2(pWReal[0], pKernel[0]) +- << (scale_param_m2); +- +- if (1 == resHybIndex) { +- pHybOutReal = &pHybOutRealWet[0]; +- pHybOutImag = &pHybOutImagWet[0]; +- } +- pHybOutReal[1] -= fMultDiv2(pWImag[1], pKernel[1]) +- << (scale_param_m2); +- pHybOutImag[1] += fMultDiv2(pWReal[1], pKernel[1]) +- << (scale_param_m2); +- +- if (2 == resHybIndex) { +- pHybOutReal = &pHybOutRealWet[0]; +- pHybOutImag = &pHybOutImagWet[0]; +- } +- pHybOutReal[2] += fMultDiv2(pWImag[2], pKernel[2]) +- << (scale_param_m2); +- pHybOutImag[2] -= fMultDiv2(pWReal[2], pKernel[2]) +- << (scale_param_m2); +- } +- +- for (qs = 3; qs < resHybIndex; qs++) { +- pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- /* decor signals */ +- for (; qs < complexHybBands; qs++) { +- pHybOutRealWet[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) +- << (scale_param_m2); +- pHybOutImagWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) +- << (scale_param_m2); +- } +- } /* self->upmixType */ +- } /* if (activParamBands) { */ +- } /* self->numVChannels */ +- } +- +- C_ALLOC_SCRATCH_END(pKernel, FIXP_SGL, MAX_HYBRID_BANDS); +- } +- +- return err; +-} +- +-SACDEC_ERROR SpatialDecSynthesis(spatialDec *self, const INT ts, +- FIXP_DBL **hybOutputReal, +- FIXP_DBL **hybOutputImag, PCM_MPS *timeOut, +- const INT numInputChannels, +- const FDK_channelMapDescr *const mapDescr) { +- SACDEC_ERROR err = MPS_OK; +- +- int ch; +- int stride, offset; +- +- stride = self->numOutputChannelsAT; +- offset = 1; +- +- PCM_MPS *pTimeOut__FDK = +- &timeOut[stride * self->pQmfDomain->globalConf.nBandsSynthesis * ts]; +- C_ALLOC_SCRATCH_START(pQmfReal, FIXP_DBL, QMF_MAX_SYNTHESIS_BANDS); +- C_ALLOC_SCRATCH_START(pQmfImag, FIXP_DBL, QMF_MAX_SYNTHESIS_BANDS); +- +- for (ch = 0; ch < self->numOutputChannelsAT; ch++) { +- if (self->pConfigCurrent->syntaxFlags & SACDEC_SYNTAX_LD) { +- int k; +- /* No hybrid filtering. Just copy the QMF data. */ +- for (k = 0; k < self->hybridBands; k += 1) { +- pQmfReal[k] = hybOutputReal[ch][k]; +- pQmfImag[k] = hybOutputImag[ch][k]; +- } +- } else { +- FDKhybridSynthesisApply(&self->hybridSynthesis[ch], hybOutputReal[ch], +- hybOutputImag[ch], pQmfReal, pQmfImag); +- } +- +- /* Map channel indices from MPEG Surround -> PCE style -> channelMapping[] +- */ +- FDK_ASSERT(self->numOutputChannelsAT <= 6); +- int outCh = FDK_chMapDescr_getMapValue(mapDescr, mapChannel(self, ch), +- self->numOutputChannelsAT); +- +- { +- if (self->stereoConfigIndex == 3) { +- /* MPS -> SBR */ +- int i; +- FIXP_DBL *pWorkBufReal, *pWorkBufImag; +- FDK_ASSERT((self->pQmfDomain->QmfDomainOut[outCh].fb.outGain_m == +- (FIXP_DBL)0x80000000) && +- (self->pQmfDomain->QmfDomainOut[outCh].fb.outGain_e == 0)); +- FDK_QmfDomain_GetWorkBuffer(&self->pQmfDomain->QmfDomainIn[outCh], ts, +- &pWorkBufReal, &pWorkBufImag); +- FDK_ASSERT(self->qmfBands <= +- self->pQmfDomain->QmfDomainIn[outCh].workBuf_nBands); +- for (i = 0; i < self->qmfBands; i++) { +- pWorkBufReal[i] = pQmfReal[i]; +- pWorkBufImag[i] = pQmfImag[i]; +- } +- self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale = +- -7; /*-ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK;*/ +- self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -= +- self->pQmfDomain->QmfDomainIn[outCh].fb.filterScale; +- self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -= +- self->clipProtectGainSF__FDK; +- +- } else { +- /* Call the QMF synthesis for dry. */ +- err = CalculateSpaceSynthesisQmf(&self->pQmfDomain->QmfDomainOut[outCh], +- pQmfReal, pQmfImag, stride, +- pTimeOut__FDK + (offset * outCh)); +- } +- if (err != MPS_OK) goto bail; +- } +- } /* ch loop */ +- +-bail: +- C_ALLOC_SCRATCH_END(pQmfImag, FIXP_DBL, QMF_MAX_SYNTHESIS_BANDS); +- C_ALLOC_SCRATCH_END(pQmfReal, FIXP_DBL, QMF_MAX_SYNTHESIS_BANDS); +- +- return err; +-} +- +-void SpatialDecBufferMatrices(spatialDec *self) { +- int row, col; +- int complexParBands; +- complexParBands = self->numParameterBands; +- +- /* +- buffer matrices M2 +- */ +- for (row = 0; row < self->numM2rows; row++) { +- for (col = 0; col < self->numVChannels; col++) { +- FDKmemcpy(self->M2RealPrev__FDK[row][col], self->M2Real__FDK[row][col], +- self->numParameterBands * sizeof(FIXP_DBL)); +- if (0 || (self->phaseCoding == 3)) { +- FDKmemcpy(self->M2ImagPrev__FDK[row][col], self->M2Imag__FDK[row][col], +- complexParBands * sizeof(FIXP_DBL)); +- } +- } +- } +- +- /* buffer phase */ +- FDKmemcpy(self->PhasePrevLeft__FDK, self->PhaseLeft__FDK, +- self->numParameterBands * sizeof(FIXP_DBL)); +- FDKmemcpy(self->PhasePrevRight__FDK, self->PhaseRight__FDK, +- self->numParameterBands * sizeof(FIXP_DBL)); +-} +- +-#define PHASE_SCALE 2 +- +-#ifndef P_PI +-#define P_PI 3.1415926535897932 +-#endif +- +-/* For better precision, PI (pi_x2) is already doubled */ +-static FIXP_DBL interp_angle__FDK(FIXP_DBL angle1, FIXP_DBL angle2, +- FIXP_SGL alpha, FIXP_DBL pi_x2) { +- if (angle2 - angle1 > (pi_x2 >> 1)) angle2 -= pi_x2; +- +- if (angle1 - angle2 > (pi_x2 >> 1)) angle1 -= pi_x2; +- +- return interpolateParameter(alpha, angle2, angle1); +-} +- +-/* +- * +- */ +-void SpatialDecApplyPhase(spatialDec *self, FIXP_SGL alpha__FDK, +- int lastSlotOfParamSet) { +- int pb, qs; +- FIXP_DBL ppb[MAX_PARAMETER_BANDS * +- 4]; /* left real, imag - right real, imag interleaved */ +- +- const FIXP_DBL pi_x2 = PIx2__IPD; +- for (pb = 0; pb < self->numParameterBands; pb++) { +- FIXP_DBL pl, pr; +- +- pl = interp_angle__FDK(self->PhasePrevLeft__FDK[pb], +- self->PhaseLeft__FDK[pb], alpha__FDK, pi_x2); +- pr = interp_angle__FDK(self->PhasePrevRight__FDK[pb], +- self->PhaseRight__FDK[pb], alpha__FDK, pi_x2); +- +- inline_fixp_cos_sin(pl, pr, IPD_SCALE, &ppb[4 * pb]); +- } +- +- /* sign is -1 for qs = 0,2 and +1 for qs = 1 */ +- +- const SCHAR *kernels = &self->kernels[0]; +- +- FIXP_DBL *Dry_real0 = &self->hybOutputRealDry__FDK[0][0]; +- FIXP_DBL *Dry_imag0 = &self->hybOutputImagDry__FDK[0][0]; +- FIXP_DBL *Dry_real1 = &self->hybOutputRealDry__FDK[1][0]; +- FIXP_DBL *Dry_imag1 = &self->hybOutputImagDry__FDK[1][0]; +- +- for (qs = 2; qs >= 0; qs--) { +- FIXP_DBL out_re, out_im; +- +- pb = *kernels++; +- if (qs == 1) /* sign[qs] >= 0 */ +- { +- cplxMultDiv2(&out_re, &out_im, *Dry_real0, *Dry_imag0, ppb[4 * pb + 0], +- ppb[4 * pb + 1]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real0++ = out_re; +- *Dry_imag0++ = out_im; +- +- cplxMultDiv2(&out_re, &out_im, *Dry_real1, *Dry_imag1, ppb[4 * pb + 2], +- ppb[4 * pb + 3]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real1++ = out_re; +- *Dry_imag1++ = out_im; +- } else { +- cplxMultDiv2(&out_re, &out_im, *Dry_real0, *Dry_imag0, ppb[4 * pb + 0], +- -ppb[4 * pb + 1]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real0++ = out_re; +- *Dry_imag0++ = out_im; +- +- cplxMultDiv2(&out_re, &out_im, *Dry_real1, *Dry_imag1, ppb[4 * pb + 2], +- -ppb[4 * pb + 3]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real1++ = out_re; +- *Dry_imag1++ = out_im; +- } +- } +- +- /* sign is +1 for qs >=3 */ +- for (qs = self->hybridBands - 3; qs--;) { +- FIXP_DBL out_re, out_im; +- +- pb = *kernels++; +- cplxMultDiv2(&out_re, &out_im, *Dry_real0, *Dry_imag0, ppb[4 * pb + 0], +- ppb[4 * pb + 1]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real0++ = out_re; +- *Dry_imag0++ = out_im; +- +- cplxMultDiv2(&out_re, &out_im, *Dry_real1, *Dry_imag1, ppb[4 * pb + 2], +- ppb[4 * pb + 3]); +- out_re <<= PHASE_SCALE - 1; +- out_im <<= PHASE_SCALE - 1; +- *Dry_real1++ = out_re; +- *Dry_imag1++ = out_im; +- } +-} +diff --git a/libSACdec/src/sac_process.h b/libSACdec/src/sac_process.h +deleted file mode 100644 +index ee2f2fe..0000000 +--- a/libSACdec/src/sac_process.h ++++ /dev/null +@@ -1,297 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Processing +- +-*******************************************************************************/ +- +-/*! +- \file +- \brief Polyphase Filterbank +-*/ +- +-#ifndef SAC_PROCESS_H +-#define SAC_PROCESS_H +- +-#include "sac_dec.h" +- +-void SpatialDecApplyPhase(spatialDec *self, FIXP_SGL alpha, +- int lastSlotOfParamSet); +- +-/** +- * \brief Apply QMF Analysis Filterbank. +- * +- * Calculates qmf data on downmix input time data. +- * Delaylines will be applied if necessaray. +- * +- * \param self A spatial decoder handle. +- * \param inData Downmix channel time data as input. +- * \param ts Signals time slot offset for input buffer. +- * \param qmfReal Downmix channel qmf output data. +- * \param qmfImag Downmix channel qmf output data. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecQMFAnalysis(spatialDec *self, const PCM_MPS *inData, +- const INT ts, const INT bypassMode, +- FIXP_DBL **qmfReal, FIXP_DBL **qmfImag, +- const int numInputChannels); +- +-/** +- * \brief Feed spatial decoder with external qmf data. +- * +- * \param self A spatial decoder handle. +- * \param qmfInDataReal External qmf downmix data as input. +- * \param qmfInDataImag External qmf downmix data as input. +- * \param ts Signals time slot in input buffer to process. +- * \param qmfReal Downmix channel qmf output data. +- * \param qmfImag Downmix channel qmf output data. +- * \param numInputChannels Number of input channels. Might differ from +- * self->numInputChannels. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecFeedQMF(spatialDec *self, FIXP_DBL **qmfInDataReal, +- FIXP_DBL **qmfInDataImag, const INT ts, +- const INT bypassMode, FIXP_DBL **qmfReal, +- FIXP_DBL **qmfImag, const INT numInputChannels); +- +-/** +- * \brief Apply Hybrdid Analysis Filterbank. +- * +- * Calculates hybrid data on downmix input data. +- * Residual hybrid signals will also be calculated on current slot if available. +- * +- * \param self A spatial decoder handle. +- * \param qmfInputReal Downmix channel qmf data as input. +- * \param qmfInputImag Downmix channel qmf data as input. +- * \param hybOutputReal Downmix channel hybrid output data. +- * \param hybOutputImag Downmix channel hybrid output data. +- * \param ts Signals time slot in spatial frame to process. +- * \param numInputChannels Number of input channels. Might differ from +- * self->numInputChannels. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecHybridAnalysis(spatialDec *self, FIXP_DBL **qmfInputReal, +- FIXP_DBL **qmfInputImag, +- FIXP_DBL **hybOutputReal, +- FIXP_DBL **hybOutputImag, const INT ts, +- const INT numInputChannels); +- +-/** +- * \brief Create X data. +- * +- * Returns a pointer list over Xchannels pointing to downmix input channels +- * and to residual channels when provided. +- * +- * \param self A spatial decoder handle. +- * \param hybInputReal Downmix channel hybrid data as input. +- * \param hybInputImag Downmix channel hybrid data as input. +- * \param pxReal Pointer to hybrid and residual data as output. +- * \param pxImag Pointer to hybrid and residual data as output. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecCreateX(spatialDec *self, FIXP_DBL **hybInputReal, +- FIXP_DBL **hybInputImag, FIXP_DBL **pxReal, +- FIXP_DBL **pxImag); +- +-/** +- * \brief MPS212 combined version of apply M1 parameters and create wet signal +- * +- * \param self A spatial decoder handle. +- * \param xReal Downmix and residual X data as input. +- * \param xImag Downmix and residual X data as input. +- * \param vReal output data: [0] direct signal (V); [1] wet signal +- * (W). +- * \param vImag output data: [0] direct signal (V); [1] wet signal +- * (W). +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecApplyM1_CreateW_Mode212( +- spatialDec *self, const SPATIAL_BS_FRAME *frame, FIXP_DBL **xReal, +- FIXP_DBL **xImag, FIXP_DBL **vReal, FIXP_DBL **vImag); +- +-/** +- * \brief Apply M2 parameters. +- * +- * \param self A spatial decoder handle. +- * \param ps Signals parameter band from where M2 parameter to +- * use. +- * \param alpha Smoothing factor between current and previous +- * parameter band. Rangeability between 0.f and 1.f. +- * \param wReal Wet input data. +- * \param wImag Wet input data. +- * \param hybOutputRealDry Dry output data. +- * \param hybOutputImagDry Dry output data. +- * \param hybOutputRealWet Wet output data. +- * \param hybOutputImagWet Wet output data. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecApplyM2(spatialDec *self, INT ps, const FIXP_SGL alpha, +- FIXP_DBL **wReal, FIXP_DBL **wImag, +- FIXP_DBL **hybOutputRealDry, +- FIXP_DBL **hybOutputImagDry, +- FIXP_DBL **hybOutputRealWet, +- FIXP_DBL **hybOutputImagWet); +- +-/** +- * \brief Apply M2 parameter for 212 mode with residualCoding and phaseCoding. +- * +- * \param self [i] A spatial decoder handle. +- * \param ps [i] Signals parameter band from where M2 parameter +- * to use. +- * \param alpha [i] Smoothing factor between current and previous +- * parameter band. Rangeability between 0.f and 1.f. +- * \param wReal [i] Wet input data. +- * \param wImag [i] Wet input data. +- * \param hybOutputRealDry [o] Dry output data. +- * \param hybOutputImagDry [o] Dry output data. +- * +- * \return error +- */ +-SACDEC_ERROR SpatialDecApplyM2_Mode212_ResidualsPlusPhaseCoding( +- spatialDec *self, INT ps, const FIXP_SGL alpha, FIXP_DBL **wReal, +- FIXP_DBL **wImag, FIXP_DBL **hybOutputRealDry, FIXP_DBL **hybOutputImagDry); +- +-/** +- * \brief Apply M2 parameter for 212 mode, upmix from mono to stereo. +- * +- * \param self [i] A spatial decoder handle. +- * \param ps [i] Signals parameter band from where M2 parameter +- * to use. +- * \param alpha [i] Smoothing factor between current and previous +- * parameter band. Rangeability between 0.f and 1.f. +- * \param wReal [i] Wet input data. +- * \param wImag [i] Wet input data. +- * \param hybOutputRealDry [o] Dry output data. +- * \param hybOutputImagDry [o] Dry output data. +- * +- * \return error +- */ +-SACDEC_ERROR SpatialDecApplyM2_Mode212(spatialDec *self, INT ps, +- const FIXP_SGL alpha, FIXP_DBL **wReal, +- FIXP_DBL **wImag, +- FIXP_DBL **hybOutputRealDry, +- FIXP_DBL **hybOutputImagDry); +- +-/** +- * \brief Convert Hybrid input to output audio data. +- * +- * \param hSpaceSynthesisQmf A spatial decoder handle. +- * \param ts Signals time slot in spatial frame to process. +- * \param hybOutputReal Hybrid data as input. +- * \param hybOutputImag Hybrid data as input. +- * \param timeOut audio output data. +- * +- * \return Error status. +- */ +-SACDEC_ERROR SpatialDecSynthesis(spatialDec *self, const INT ts, +- FIXP_DBL **hybOutputReal, +- FIXP_DBL **hybOutputImag, PCM_MPS *timeOut, +- const INT numInputChannels, +- const FDK_channelMapDescr *const mapDescr); +- +-void SpatialDecBufferMatrices(spatialDec *self); +- +-FIXP_DBL getChGain(spatialDec *self, UINT ch, INT *scale); +- +-#endif +diff --git a/libSACdec/src/sac_qmf.cpp b/libSACdec/src/sac_qmf.cpp +deleted file mode 100644 +index a075490..0000000 +--- a/libSACdec/src/sac_qmf.cpp ++++ /dev/null +@@ -1,156 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec QMF processing +- +-*******************************************************************************/ +- +-#include "sac_qmf.h" +- +-#include "FDK_matrixCalloc.h" +-#include "sac_dec_interface.h" +-#include "sac_rom.h" +- +-#include "qmf.h" +- +-SACDEC_ERROR CalculateSpaceSynthesisQmf( +- const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr, +- const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig) { +- SACDEC_ERROR err = MPS_OK; +- +- if (hQmfDomainOutCh == NULL) { +- err = MPS_INVALID_HANDLE; +- } else { +- HANDLE_SPACE_SYNTHESIS_QMF hSpaceSynthesisQmf = &hQmfDomainOutCh->fb; +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, +- (QMF_MAX_SYNTHESIS_BANDS << 1)); +-#else +- C_AALLOC_STACK_START(pWorkBuffer, FIXP_DBL, (QMF_MAX_SYNTHESIS_BANDS << 1)); +-#endif +- +- qmfSynthesisFilteringSlot(hSpaceSynthesisQmf, Sr, Si, 0, 0, timeSig, stride, +- pWorkBuffer); +- +-#if (QMF_MAX_SYNTHESIS_BANDS <= 64) +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (QMF_MAX_SYNTHESIS_BANDS << 1)); +-#else +- C_AALLOC_STACK_END(pWorkBuffer, FIXP_DBL, (QMF_MAX_SYNTHESIS_BANDS << 1)); +-#endif +- } +- +- return err; +-} +- +-SACDEC_ERROR CalculateSpaceAnalysisQmf( +- HANDLE_SPACE_ANALYSIS_QMF hSpaceAnalysisQmf, const PCM_MPS *timeSig, +- FIXP_DBL *Sr, FIXP_DBL *Si) { +- SACDEC_ERROR err = MPS_OK; +- +- if (hSpaceAnalysisQmf == NULL) { +- err = MPS_INVALID_HANDLE; +- } else { +- C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (64 << 1)); +- +- qmfAnalysisFilteringSlot(hSpaceAnalysisQmf, Sr, Si, timeSig, 1, +- pWorkBuffer); +- C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (64 << 1)); +- } +- +- return err; +-} +diff --git a/libSACdec/src/sac_qmf.h b/libSACdec/src/sac_qmf.h +deleted file mode 100644 +index d1dc837..0000000 +--- a/libSACdec/src/sac_qmf.h ++++ /dev/null +@@ -1,143 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec QMF processing +- +-*******************************************************************************/ +- +-#ifndef SAC_QMF_H +-#define SAC_QMF_H +- +-#include "common_fix.h" +- +-#include "sac_dec_interface.h" +- +-#include "FDK_qmf_domain.h" +-#define HANDLE_SPACE_ANALYSIS_QMF HANDLE_QMF_FILTER_BANK +-#define HANDLE_SPACE_SYNTHESIS_QMF HANDLE_QMF_FILTER_BANK +- +-/** +- * \brief Convert Qmf input to output audio data. +- * +- * \param hSpaceSynthesisQmf A Qmf Synthesis Filterbank handle. +- * \param Sr Pointer to Qmf input buffer. +- * \param Si Pointer to Qmf input buffer. +- * \param stride Stride factor for output data, 1 if none. +- * \param timeSig (None-)Interleaved audio output data. +- * +- * \return Error status. +- */ +-SACDEC_ERROR CalculateSpaceSynthesisQmf( +- const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr, +- const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig); +- +-/** +- * \brief Convert audio input data to qmf representation. +- * +- * \param hSpaceAnalysisQmf A Qmf Analysis Filterbank handle. +- * \param timeSig (None-)Interleavd audio input data. +- * \param Sr Pointer to Qmf output buffer. +- * \param Si Pointer to Qmf output buffer. +- * +- * \return Error status. +- */ +-SACDEC_ERROR CalculateSpaceAnalysisQmf( +- HANDLE_SPACE_ANALYSIS_QMF hSpaceAnalysisQmf, const PCM_MPS *timeSig, +- FIXP_DBL *Sr, FIXP_DBL *Si); +- +-#endif /* SAC_QMF_H */ +diff --git a/libSACdec/src/sac_reshapeBBEnv.cpp b/libSACdec/src/sac_reshapeBBEnv.cpp +deleted file mode 100644 +index 87c0ac6..0000000 +--- a/libSACdec/src/sac_reshapeBBEnv.cpp ++++ /dev/null +@@ -1,680 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec guided envelope shaping +- +-*******************************************************************************/ +- +-#include "sac_reshapeBBEnv.h" +- +-#include "sac_dec.h" +-#include "sac_bitdec.h" +-#include "sac_calcM1andM2.h" +-#include "sac_reshapeBBEnv.h" +-#include "sac_rom.h" +- +-#define INP_DRY_WET 0 +-#define INP_DMX 1 +- +-#define SF_SHAPE 1 +-#define SF_DIV32 6 +-#define SF_FACTOR_SLOT 5 +- +-#define START_BB_ENV 0 /* 10 */ +-#define END_BB_ENV 9 /* 18 */ +- +-#define SF_ALPHA1 8 +-#define SF_BETA1 4 +- +-void initBBEnv(spatialDec *self, int initStatesFlag) { +- INT ch, k; +- +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- k = row2channelGES[self->treeConfig][ch]; +- self->row2channelDmxGES[ch] = k; +- if (k == -1) continue; +- +- switch (self->treeConfig) { +- case TREE_212: +- self->row2channelDmxGES[ch] = 0; +- break; +- default:; +- } +- } +- +- if (initStatesFlag) { +- for (k = 0; k < 2 * MAX_OUTPUT_CHANNELS + MAX_INPUT_CHANNELS; k++) { +- self->reshapeBBEnvState->normNrgPrev__FDK[k] = +- FL2FXCONST_DBL(0.5f); /* 32768.f*32768.f */ +- self->reshapeBBEnvState->normNrgPrevSF[k] = DFRACT_BITS - 1; +- self->reshapeBBEnvState->partNrgPrevSF[k] = 0; +- self->reshapeBBEnvState->partNrgPrev2SF[k] = 0; +- self->reshapeBBEnvState->frameNrgPrevSF[k] = 0; +- } +- } +- +- self->reshapeBBEnvState->alpha__FDK = +- FL2FXCONST_DBL(0.99637845575f); /* FDKexp(-64 / (0.4f * 44100)) */ +- self->reshapeBBEnvState->beta__FDK = +- FL2FXCONST_DBL(0.96436909488f); /* FDKexp(-64 / (0.04f * 44100)) */ +-} +- +-static inline void getSlotNrgHQ(FIXP_DBL *RESTRICT pReal, +- FIXP_DBL *RESTRICT pImag, +- FIXP_DBL *RESTRICT slotNrg, INT maxValSF, +- INT hybBands) { +- INT qs; +- FIXP_DBL nrg; +- +- /* qs = 12, 13, 14 */ +- slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 15 */ +- slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 16, 17 */ +- nrg = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[4] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 18, 19, 20 */ +- nrg = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- nrg += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[5] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 21, 22 */ +- nrg = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[6] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 23, 24 */ +- if (hybBands > 23) { +- slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 25, 26, 29, 28, 29 */ +- nrg = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- nrg += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- nrg += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- nrg += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- slotNrg[7] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- /* qs = 30 ... min(41,hybBands-1) */ +- nrg = ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- for (qs = 31; qs < hybBands; qs++) { +- nrg += ((fPow2Div2((*pReal++) << maxValSF) + +- fPow2Div2((*pImag++) << maxValSF)) >> +- (SF_FACTOR_SLOT - 1)); +- } +- slotNrg[8] = nrg; +- } else { +- slotNrg[7] = (FIXP_DBL)0; +- slotNrg[8] = (FIXP_DBL)0; +- } +-} +- +-static inline INT getMaxValDmx(FIXP_DBL *RESTRICT pReal, +- FIXP_DBL *RESTRICT pImag, INT cplxBands, +- INT hybBands) { +- INT qs, clz; +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- +- for (qs = 12; qs < cplxBands; qs++) { +- maxVal |= fAbs(pReal[qs]); +- maxVal |= fAbs(pImag[qs]); +- } +- for (; qs < hybBands; qs++) { +- maxVal |= fAbs(pReal[qs]); +- } +- +- clz = fixMax(0, CntLeadingZeros(maxVal) - 1); +- +- return (clz); +-} +- +-static inline INT getMaxValDryWet(FIXP_DBL *RESTRICT pReal, +- FIXP_DBL *RESTRICT pImag, +- FIXP_DBL *RESTRICT pHybOutputRealDry, +- FIXP_DBL *RESTRICT pHybOutputImagDry, +- FIXP_DBL *RESTRICT pHybOutputRealWet, +- FIXP_DBL *RESTRICT pHybOutputImagWet, +- INT cplxBands, INT hybBands) { +- INT qs, clz; +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- +- for (qs = 12; qs < cplxBands; qs++) { +- pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs]; +- maxVal |= fAbs(pReal[qs]); +- pImag[qs] = pHybOutputImagDry[qs] + pHybOutputImagWet[qs]; +- maxVal |= fAbs(pImag[qs]); +- } +- for (; qs < hybBands; qs++) { +- pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs]; +- maxVal |= fAbs(pReal[qs]); +- } +- +- clz = fixMax(0, CntLeadingZeros(maxVal) - 1); +- +- return (clz); +-} +- +-static inline void slotAmp(FIXP_DBL *RESTRICT slotAmp_dry, +- FIXP_DBL *RESTRICT slotAmp_wet, +- FIXP_DBL *RESTRICT pHybOutputRealDry, +- FIXP_DBL *RESTRICT pHybOutputImagDry, +- FIXP_DBL *RESTRICT pHybOutputRealWet, +- FIXP_DBL *RESTRICT pHybOutputImagWet, INT cplxBands, +- INT hybBands) { +- INT qs; +- FIXP_DBL dry, wet; +- +- dry = wet = FL2FXCONST_DBL(0.0f); +- for (qs = 0; qs < cplxBands; qs++) { +- dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs]) + +- fPow2Div2(pHybOutputImagDry[qs])); +- wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs]) + +- fPow2Div2(pHybOutputImagWet[qs])); +- } +- for (; qs < hybBands; qs++) { +- dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs])); +- wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs])); +- } +- *slotAmp_dry = dry; +- *slotAmp_wet = wet; +-} +- +-#if defined(__aarch64__) +-__attribute__((noinline)) +-#endif +-static void +-shapeBBEnv(FIXP_DBL *pHybOutputRealDry, FIXP_DBL *pHybOutputImagDry, +- FIXP_DBL dryFac, INT scale, INT cplxBands, INT hybBands) { +- INT qs; +- +- if (scale == 0) { +- for (qs = 0; qs < cplxBands; qs++) { +- pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac); +- pHybOutputImagDry[qs] = fMultDiv2(pHybOutputImagDry[qs], dryFac); +- } +- for (; qs < hybBands; qs++) { +- pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac); +- } +- } else { +- for (qs = 0; qs < cplxBands; qs++) { +- pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; +- pHybOutputImagDry[qs] = fMultDiv2(pHybOutputImagDry[qs], dryFac) << scale; +- } +- for (; qs < hybBands; qs++) { +- pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; +- } +- } +-} +- +-static void extractBBEnv(spatialDec *self, INT inp, INT start, INT channels, +- FIXP_DBL *pEnv, const SPATIAL_BS_FRAME *frame) { +- INT ch, pb, prevChOffs; +- INT clz, scale, scale_min, envSF; +- INT scaleCur, scalePrev, commonScale; +- INT slotNrgSF, partNrgSF, frameNrgSF; +- INT *pPartNrgPrevSF, *pFrameNrgPrevSF; +- INT *pNormNrgPrevSF, *pPartNrgPrev2SF; +- +- FIXP_DBL maxVal, env, frameNrg, normNrg; +- FIXP_DBL *pReal, *pImag; +- FIXP_DBL *partNrg, *partNrgPrev; +- +- C_ALLOC_SCRATCH_START(pScratchBuffer, FIXP_DBL, +- (2 * 42 + MAX_PARAMETER_BANDS)); +- C_ALLOC_SCRATCH_START(resPb, FIXP_DBL, (END_BB_ENV - START_BB_ENV)); +- C_ALLOC_SCRATCH_START(resPbSF, INT, (END_BB_ENV - START_BB_ENV)); +- +- FIXP_DBL *slotNrg = pScratchBuffer + (2 * 42); +- +- RESHAPE_BBENV_STATE *pBBEnvState = self->reshapeBBEnvState; +- +- FIXP_DBL alpha = pBBEnvState->alpha__FDK; +- /*FIXP_DBL alpha1 = (FL2FXCONST_DBL(1.0f) - alpha) << SF_ALPHA1;*/ +- FIXP_DBL alpha1 = ((FIXP_DBL)MAXVAL_DBL - alpha) << SF_ALPHA1; +- FIXP_DBL beta = pBBEnvState->beta__FDK; +- /*FIXP_DBL beta1 = (FL2FXCONST_DBL(1.0f) - beta) << SF_BETA1;*/ +- FIXP_DBL beta1 = ((FIXP_DBL)MAXVAL_DBL - beta) << SF_BETA1; +- +- INT shapeActiv = 1; +- INT hybBands = fixMin(42, self->hybridBands); +- INT staticScale = self->staticDecScale; +- INT cplxBands; +- cplxBands = fixMin(42, self->hybridBands); +- +- for (ch = start; ch < channels; ch++) { +- if (inp == INP_DRY_WET) { +- INT ch2 = row2channelGES[self->treeConfig][ch]; +- if (ch2 == -1) { +- continue; +- } else { +- if (frame->tempShapeEnableChannelGES[ch2]) { +- shapeActiv = 1; +- } else { +- shapeActiv = 0; +- } +- } +- prevChOffs = ch; +- pReal = pScratchBuffer; +- pImag = pScratchBuffer + 42; +- clz = getMaxValDryWet( +- pReal, pImag, self->hybOutputRealDry__FDK[ch], +- self->hybOutputImagDry__FDK[ch], self->hybOutputRealWet__FDK[ch], +- self->hybOutputImagWet__FDK[ch], cplxBands, hybBands); +- } else { +- prevChOffs = ch + self->numOutputChannels; +- pReal = self->hybInputReal__FDK[ch]; +- pImag = self->hybInputImag__FDK[ch]; +- clz = getMaxValDmx(pReal, pImag, cplxBands, hybBands); +- } +- +- partNrg = partNrgPrev = pBBEnvState->partNrgPrev__FDK[prevChOffs]; +- pPartNrgPrevSF = &pBBEnvState->partNrgPrevSF[prevChOffs]; +- pFrameNrgPrevSF = &pBBEnvState->frameNrgPrevSF[prevChOffs]; +- pNormNrgPrevSF = &pBBEnvState->normNrgPrevSF[prevChOffs]; +- pPartNrgPrev2SF = &pBBEnvState->partNrgPrev2SF[prevChOffs]; +- +- /* calculate slot energy */ +- { +- getSlotNrgHQ(&pReal[12], &pImag[12], slotNrg, clz, +- fixMin(42, self->hybridBands)); /* scale slotNrg: +- 2*(staticScale-clz) + +- SF_FACTOR_SLOT */ +- } +- +- slotNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT; +- frameNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT; +- +- partNrgSF = fixMax(slotNrgSF - SF_ALPHA1 + 1, +- pPartNrgPrevSF[0] - pPartNrgPrev2SF[0] + 1); +- scalePrev = fixMax(fixMin(partNrgSF - pPartNrgPrevSF[0], DFRACT_BITS - 1), +- -(DFRACT_BITS - 1)); +- scaleCur = +- fixMax(fixMin(partNrgSF - slotNrgSF + SF_ALPHA1, DFRACT_BITS - 1), +- -(DFRACT_BITS - 1)); +- +- maxVal = FL2FXCONST_DBL(0.0f); +- frameNrg = FL2FXCONST_DBL(0.0f); +- if ((scaleCur < 0) && (scalePrev < 0)) { +- scaleCur = -scaleCur; +- scalePrev = -scalePrev; +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- partNrg[pb] = ((fMultDiv2(alpha1, slotNrg[pb]) << scaleCur) + +- (fMultDiv2(alpha, partNrgPrev[pb]) << scalePrev)) +- << 1; +- maxVal |= partNrg[pb]; +- frameNrg += slotNrg[pb] >> 3; +- } +- } else if ((scaleCur >= 0) && (scalePrev >= 0)) { +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- partNrg[pb] = ((fMultDiv2(alpha1, slotNrg[pb]) >> scaleCur) + +- (fMultDiv2(alpha, partNrgPrev[pb]) >> scalePrev)) +- << 1; +- maxVal |= partNrg[pb]; +- frameNrg += slotNrg[pb] >> 3; +- } +- } else if ((scaleCur < 0) && (scalePrev >= 0)) { +- scaleCur = -scaleCur; +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- partNrg[pb] = ((fMultDiv2(alpha1, slotNrg[pb]) << scaleCur) + +- (fMultDiv2(alpha, partNrgPrev[pb]) >> scalePrev)) +- << 1; +- maxVal |= partNrg[pb]; +- frameNrg += slotNrg[pb] >> 3; +- } +- } else { /* if ( (scaleCur >= 0) && (scalePrev < 0) ) */ +- scalePrev = -scalePrev; +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- partNrg[pb] = ((fMultDiv2(alpha1, slotNrg[pb]) >> scaleCur) + +- (fMultDiv2(alpha, partNrgPrev[pb]) << scalePrev)) +- << 1; +- maxVal |= partNrg[pb]; +- frameNrg += slotNrg[pb] >> 3; +- } +- } +- +- /* frameNrg /= (END_BB_ENV - START_BB_ENV); 0.88888888888f = +- * (1/(END_BB_ENV-START_BB_ENV)<<3; shift with 3 is compensated in loop +- * above */ +- frameNrg = fMult(frameNrg, FL2FXCONST_DBL(0.88888888888f)); +- +- /* store scalefactor and headroom for part nrg prev */ +- pPartNrgPrevSF[0] = partNrgSF; +- pPartNrgPrev2SF[0] = fixMax(0, CntLeadingZeros(maxVal) - 1); +- +- commonScale = fixMax(frameNrgSF - SF_ALPHA1 + 1, pFrameNrgPrevSF[0] + 1); +- scalePrev = fixMin(commonScale - pFrameNrgPrevSF[0], DFRACT_BITS - 1); +- scaleCur = fixMin(commonScale - frameNrgSF + SF_ALPHA1, DFRACT_BITS - 1); +- frameNrgSF = commonScale; +- +- frameNrg = ((fMultDiv2(alpha1, frameNrg) >> scaleCur) + +- (fMultDiv2(alpha, pBBEnvState->frameNrgPrev__FDK[prevChOffs]) >> +- scalePrev)) +- << 1; +- +- clz = fixMax(0, CntLeadingZeros(frameNrg) - 1); +- pBBEnvState->frameNrgPrev__FDK[prevChOffs] = frameNrg << clz; +- pFrameNrgPrevSF[0] = frameNrgSF - clz; +- +- env = FL2FXCONST_DBL(0.0f); +- scale = clz + partNrgSF - frameNrgSF; +- scale_min = DFRACT_BITS - 1; +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- if ((partNrg[pb] | slotNrg[pb]) != FL2FXCONST_DBL(0.0f)) { +- INT s; +- INT sc = 0; +- INT sn = fixMax(0, CntLeadingZeros(slotNrg[pb]) - 1); +- FIXP_DBL inv_sqrt = invSqrtNorm2(partNrg[pb], &sc); +- FIXP_DBL res = fMult(slotNrg[pb] << sn, fPow2(inv_sqrt)); +- +- s = fixMax(0, CntLeadingZeros(res) - 1); +- res = res << s; +- +- sc = scale - (2 * sc - sn - s); +- scale_min = fixMin(scale_min, sc); +- +- resPb[pb] = res; +- resPbSF[pb] = sc; +- } else { +- resPb[pb] = (FIXP_DBL)0; +- resPbSF[pb] = 0; +- } +- } +- +- scale_min = 4 - scale_min; +- +- for (pb = START_BB_ENV; pb < END_BB_ENV; pb++) { +- INT sc = fixMax(fixMin(resPbSF[pb] + scale_min, DFRACT_BITS - 1), +- -(DFRACT_BITS - 1)); +- +- if (sc < 0) { +- env += resPb[pb] << (-sc); +- } else { +- env += resPb[pb] >> (sc); +- } +- } +- +- env = fMultDiv2(env, pBBEnvState->frameNrgPrev__FDK[prevChOffs]); +- envSF = slotNrgSF + scale_min + 1; +- +- commonScale = fixMax(envSF - SF_BETA1 + 1, pNormNrgPrevSF[0] + 1); +- scalePrev = fixMin(commonScale - pNormNrgPrevSF[0], DFRACT_BITS - 1); +- scaleCur = fixMin(commonScale - envSF + SF_BETA1, DFRACT_BITS - 1); +- +- normNrg = ((fMultDiv2(beta1, env) >> scaleCur) + +- (fMultDiv2(beta, pBBEnvState->normNrgPrev__FDK[prevChOffs]) >> +- scalePrev)) +- << 1; +- +- clz = fixMax(0, CntLeadingZeros(normNrg) - 1); +- pBBEnvState->normNrgPrev__FDK[prevChOffs] = normNrg << clz; +- pNormNrgPrevSF[0] = commonScale - clz; +- +- if (shapeActiv) { +- if ((env | normNrg) != FL2FXCONST_DBL(0.0f)) { +- INT sc, se, sn; +- se = fixMax(0, CntLeadingZeros(env) - 1); +- sc = commonScale + SF_DIV32 - envSF + se; +- env = fMult(sqrtFixp((env << se) >> (sc & 0x1)), +- invSqrtNorm2(normNrg, &sn)); +- +- sc = fixMin((sc >> 1) - sn, DFRACT_BITS - 1); +- if (sc < 0) { +- env <<= (-sc); +- } else { +- env >>= (sc); +- } +- } +- /* env is scaled by SF_DIV32/2 bits */ +- } +- pEnv[ch] = env; +- } +- +- C_ALLOC_SCRATCH_END(resPbSF, INT, (END_BB_ENV - START_BB_ENV)); +- C_ALLOC_SCRATCH_END(resPb, FIXP_DBL, (END_BB_ENV - START_BB_ENV)); +- C_ALLOC_SCRATCH_END(pScratchBuffer, FIXP_DBL, (2 * 42 + MAX_PARAMETER_BANDS)); +-} +- +-void SpatialDecReshapeBBEnv(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- INT ts) { +- INT ch, scale; +- INT dryFacSF, slotAmpSF; +- FIXP_DBL tmp, dryFac, envShape; +- FIXP_DBL slotAmp_dry, slotAmp_wet, slotAmp_ratio; +- FIXP_DBL envDry[MAX_OUTPUT_CHANNELS], envDmx[2]; +- +- INT cplxBands; +- INT hybBands = self->hybridBands - 6; +- +- cplxBands = self->hybridBands - 6; +- +- /* extract downmix envelope(s) */ +- switch (self->treeConfig) { +- default: +- extractBBEnv(self, INP_DMX, 0, fMin(self->numInputChannels, 2), envDmx, +- frame); +- } +- +- /* extract dry and wet envelopes */ +- extractBBEnv(self, INP_DRY_WET, 0, self->numOutputChannels, envDry, frame); +- +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- INT ch2; +- +- ch2 = row2channelGES[self->treeConfig][ch]; +- +- if (ch2 == -1) continue; +- +- if (frame->tempShapeEnableChannelGES[ch2]) { +- INT sc; +- +- /* reshape dry and wet signals according to transmitted envelope */ +- +- /* De-quantize GES data */ +- FDK_ASSERT((frame->bsEnvShapeData[ch2][ts] >= 0) && +- (frame->bsEnvShapeData[ch2][ts] <= 4)); +- FDK_ASSERT((self->envQuantMode == 0) || (self->envQuantMode == 1)); +- envShape = +- FX_CFG2FX_DBL(envShapeDataTable__FDK[frame->bsEnvShapeData[ch2][ts]] +- [self->envQuantMode]); +- +- /* get downmix channel */ +- ch2 = self->row2channelDmxGES[ch]; +- +- /* multiply ratio with dmx envelope; tmp is scaled by SF_DIV32/2+SF_SHAPE +- * bits */ +- if (ch2 == 2) { +- tmp = fMultDiv2(envShape, envDmx[0]) + fMultDiv2(envShape, envDmx[1]); +- } else { +- tmp = fMult(envShape, envDmx[ch2]); +- } +- +- /* weighting factors */ +- dryFacSF = slotAmpSF = 0; +- dryFac = slotAmp_ratio = FL2FXCONST_DBL(0.0f); +- +- /* dryFac will be scaled by dryFacSF bits */ +- if (envDry[ch] != FL2FXCONST_DBL(0.0f)) { +- envDry[ch] = invSqrtNorm2(envDry[ch], &dryFacSF); +- dryFac = fMultDiv2(tmp, fPow2Div2(envDry[ch])) << 2; +- dryFacSF = SF_SHAPE + 2 * dryFacSF; +- } +- +- /* calculate slotAmp_dry and slotAmp_wet */ +- slotAmp(&slotAmp_dry, &slotAmp_wet, &self->hybOutputRealDry__FDK[ch][6], +- &self->hybOutputImagDry__FDK[ch][6], +- &self->hybOutputRealWet__FDK[ch][6], +- &self->hybOutputImagWet__FDK[ch][6], cplxBands, hybBands); +- +- /* slotAmp_ratio will be scaled by slotAmpSF bits */ +- if (slotAmp_dry != FL2FXCONST_DBL(0.0f)) { +- sc = fixMax(0, CntLeadingZeros(slotAmp_wet) - 1); +- sc = sc - (sc & 1); +- +- slotAmp_wet = sqrtFixp(slotAmp_wet << sc); +- slotAmp_dry = invSqrtNorm2(slotAmp_dry, &slotAmpSF); +- +- slotAmp_ratio = fMult(slotAmp_wet, slotAmp_dry); +- slotAmpSF = slotAmpSF - (sc >> 1); +- } +- +- /* calculate common scale factor */ +- scale = +- fixMax(3, fixMax(dryFacSF, slotAmpSF)); /* scale is at least with 3 +- bits to avoid overflows +- when calculating dryFac */ +- dryFac = dryFac >> (scale - dryFacSF); +- slotAmp_ratio = slotAmp_ratio >> (scale - slotAmpSF); +- +- /* limit dryFac */ +- dryFac = fixMax( +- FL2FXCONST_DBL(0.25f) >> (INT)fixMin(2 * scale, DFRACT_BITS - 1), +- fMult(dryFac, slotAmp_ratio) - (slotAmp_ratio >> scale) + +- (dryFac >> scale)); +- dryFac = fixMin( +- FL2FXCONST_DBL(0.50f) >> (INT)fixMin(2 * scale - 3, DFRACT_BITS - 1), +- dryFac); /* reduce shift bits by 3, because upper +- limit 4.0 is scaled with 3 bits */ +- scale = 2 * scale + 1; +- +- /* improve precision for dryFac */ +- sc = fixMax(0, CntLeadingZeros(dryFac) - 1); +- dryFac = dryFac << (INT)fixMin(scale, sc); +- scale = scale - fixMin(scale, sc); +- +- /* shaping */ +- shapeBBEnv(&self->hybOutputRealDry__FDK[ch][6], +- &self->hybOutputImagDry__FDK[ch][6], dryFac, scale, cplxBands, +- hybBands); +- } +- } +-} +diff --git a/libSACdec/src/sac_reshapeBBEnv.h b/libSACdec/src/sac_reshapeBBEnv.h +deleted file mode 100644 +index 1658530..0000000 +--- a/libSACdec/src/sac_reshapeBBEnv.h ++++ /dev/null +@@ -1,114 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec guided envelope shaping +- +-*******************************************************************************/ +- +-#ifndef SAC_RESHAPEBBENV_H +-#define SAC_RESHAPEBBENV_H +- +-#include "sac_dec_interface.h" +- +-#define BB_ENV_SIZE 9 /* END_BB_ENV - START_BB_ENV */ +- +-void initBBEnv(spatialDec *self, int initStatesFlag); +-void SpatialDecReshapeBBEnv(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- int ts); +- +-#endif +diff --git a/libSACdec/src/sac_rom.cpp b/libSACdec/src/sac_rom.cpp +deleted file mode 100644 +index 4285b65..0000000 +--- a/libSACdec/src/sac_rom.cpp ++++ /dev/null +@@ -1,709 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec tables +- +-*******************************************************************************/ +- +-#include "sac_rom.h" +-#include "sac_calcM1andM2.h" +- +-#define SCALE_CPC(a) (FL2FXCONST_CFG(a / (float)(1 << SCALE_PARAM_M1))) +-const FIXP_CFG dequantCPC__FDK[] = { +- SCALE_CPC(-2.0f), SCALE_CPC(-1.9f), SCALE_CPC(-1.8f), SCALE_CPC(-1.7f), +- SCALE_CPC(-1.6f), SCALE_CPC(-1.5f), SCALE_CPC(-1.4f), SCALE_CPC(-1.3f), +- SCALE_CPC(-1.2f), SCALE_CPC(-1.1f), SCALE_CPC(-1.0f), SCALE_CPC(-0.9f), +- SCALE_CPC(-0.8f), SCALE_CPC(-0.7f), SCALE_CPC(-0.6f), SCALE_CPC(-0.5f), +- SCALE_CPC(-0.4f), SCALE_CPC(-0.3f), SCALE_CPC(-0.2f), SCALE_CPC(-0.1f), +- SCALE_CPC(0.0f), SCALE_CPC(0.1f), SCALE_CPC(0.2f), SCALE_CPC(0.3f), +- SCALE_CPC(0.4f), SCALE_CPC(0.5f), SCALE_CPC(0.6f), SCALE_CPC(0.7f), +- SCALE_CPC(0.8f), SCALE_CPC(0.9f), SCALE_CPC(1.0f), SCALE_CPC(1.1f), +- SCALE_CPC(1.2f), SCALE_CPC(1.3f), SCALE_CPC(1.4f), SCALE_CPC(1.5f), +- SCALE_CPC(1.6f), SCALE_CPC(1.7f), SCALE_CPC(1.8f), SCALE_CPC(1.9f), +- SCALE_CPC(2.0f), SCALE_CPC(2.1f), SCALE_CPC(2.2f), SCALE_CPC(2.3f), +- SCALE_CPC(2.4f), SCALE_CPC(2.5f), SCALE_CPC(2.6f), SCALE_CPC(2.7f), +- SCALE_CPC(2.8f), SCALE_CPC(2.9f), SCALE_CPC(3.0f)}; +- +-#define SCALE_ICC(a) (FL2FXCONST_CFG(a)) +-const FIXP_CFG dequantICC__FDK[8] = { +- /*SCALE_ICC(1.00000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL), +- SCALE_ICC(0.9370f), +- SCALE_ICC(0.84118f), +- SCALE_ICC(0.60092f), +- SCALE_ICC(0.36764f), +- SCALE_ICC(0.0000f), +- SCALE_ICC(-0.58900f), +- SCALE_ICC(-0.9900f)}; +- +-#define SCALE_CLD2(a) (FL2FXCONST_CFG(a / (float)(1 << 8))) +-const FIXP_CFG dequantCLD__FDK[31] = { +- SCALE_CLD2(-150.0f), SCALE_CLD2(-45.0f), SCALE_CLD2(-40.0f), +- SCALE_CLD2(-35.0f), SCALE_CLD2(-30.0f), SCALE_CLD2(-25.0f), +- SCALE_CLD2(-22.0f), SCALE_CLD2(-19.0f), SCALE_CLD2(-16.0f), +- SCALE_CLD2(-13.0f), SCALE_CLD2(-10.0f), SCALE_CLD2(-8.0f), +- SCALE_CLD2(-6.0f), SCALE_CLD2(-4.0f), SCALE_CLD2(-2.0f), +- SCALE_CLD2(0.0f), SCALE_CLD2(2.0f), SCALE_CLD2(4.0f), +- SCALE_CLD2(6.0f), SCALE_CLD2(8.0f), SCALE_CLD2(10.0f), +- SCALE_CLD2(13.0f), SCALE_CLD2(16.0f), SCALE_CLD2(19.0f), +- SCALE_CLD2(22.0f), SCALE_CLD2(25.0f), SCALE_CLD2(30.0f), +- SCALE_CLD2(35.0f), SCALE_CLD2(40.0f), SCALE_CLD2(45.0f), +- SCALE_CLD2(150.0f)}; +- +-#define SCALE_IPD(a) (FL2FXCONST_CFG(a / (float)(1 << IPD_SCALE))) +-const FIXP_CFG dequantIPD__FDK[16] = { +- /* SCALE_IPD(0.000000000f), SCALE_IPD(0.392699082f), +- SCALE_IPD(0.785398163f), SCALE_IPD(1.178097245f), +- SCALE_IPD(1.570796327f), SCALE_IPD(1.963495408f), +- SCALE_IPD(2.356194490f), SCALE_IPD(2.748893572f), +- SCALE_IPD(3.141592654f), SCALE_IPD(3.534291735f), +- SCALE_IPD(3.926990817f), SCALE_IPD(4.319689899f), +- SCALE_IPD(4.712388980f), SCALE_IPD(5.105088062f), +- SCALE_IPD(5.497787144f), SCALE_IPD(5.890486225f) */ +- SCALE_IPD(0.00000000000000f), SCALE_IPD(0.392699082f), +- SCALE_IPD(0.78539816339745f), SCALE_IPD(1.178097245f), +- SCALE_IPD(1.57079632679490f), SCALE_IPD(1.963495408f), +- SCALE_IPD(2.35619449019234f), SCALE_IPD(2.748893572f), +- SCALE_IPD(3.14159265358979f), SCALE_IPD(3.534291735f), +- SCALE_IPD(3.92699081698724f), SCALE_IPD(4.319689899f), +- SCALE_IPD(4.71238898038469f), SCALE_IPD(5.105088062f), +- SCALE_IPD(5.49778714378214f), SCALE_IPD(5.890486225f)}; +- +-#define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_CFG(a / (float)(1 << IPD_SCALE))) +-/* +- Generate table dequantIPD_CLD_ICC_splitAngle__FDK[16][31][8]: +- +- #define ABS_THR ( 1e-9f * 32768 * 32768 ) +- +- float dequantICC[] = +- {1.0000f,0.9370f,0.84118f,0.60092f,0.36764f,0.0f,-0.5890f,-0.9900f}; float +- dequantCLD[] = +- {-150.0,-45.0,-40.0,-35.0,-30.0,-25.0,-22.0,-19.0,-16.0,-13.0,-10.0, -8.0, +- -6.0, -4.0, -2.0, 0.0, 2.0, 4.0, 6.0, 8.0, +- 10.0, 13.0, 16.0, 19.0, 22.0, 25.0, 30.0, 35.0, 40.0, 45.0, 150.0 }; float +- dequantIPD[] = +- {0.f,0.392699082f,0.785398163f,1.178097245f,1.570796327f,1.963495408f, +- 2.35619449f,2.748893572f,3.141592654f,3.534291735f,3.926990817f, +- 4.319689899f,4.71238898f,5.105088062f,5.497787144f,5.890486225f}; +- +- for (ipdIdx=0; ipdIdx<16; ipdIdx++) +- for (cldIdx=0; cldIdx<31; cldIdx++) +- for (iccIdx=0; iccIdx<8; iccIdx++) { +- ipd = dequantIPD[ipdIdx]; +- cld = dequantCLD[cldIdx]; +- icc = dequantICC[iccIdx]; +- iidLin = (float) pow(10.0f, cld / 20.0f); +- iidLin2 = iidLin * iidLin; +- iidLin21 = iidLin2 + 1.0f; +- sinIpd = (float) sin(ipd); +- cosIpd = (float) cos(ipd); +- temp1 = 2.0f * icc * iidLin; +- temp1c = temp1 * cosIpd; +- ratio = (iidLin21 + temp1c) / (iidLin21 + temp1) + ABS_THR; +- w2 = (float) pow(ratio, 0.25f); +- w1 = 2.0f - w2; +- dequantIPD_CLD_ICC_splitAngle__FDK[ipdIdx][cldIdx][iccIdx] = (float) +- atan2(w2 * sinIpd, w1 * iidLin + w2 * cosIpd); +- } +-*/ +- +-#define SCALE_CLD(a) (FL2FXCONST_CFG(a)) +- +-const FIXP_CFG dequantCLD_c_l[31] = { +- SCALE_CLD(0.0000000316f), +- SCALE_CLD(0.0056233243f), +- SCALE_CLD(0.0099994997f), +- SCALE_CLD(0.0177799836f), +- SCALE_CLD(0.0316069759f), +- SCALE_CLD(0.0561454296f), +- SCALE_CLD(0.0791834071f), +- SCALE_CLD(0.1115021780f), +- SCALE_CLD(0.1565355062f), +- SCALE_CLD(0.2184644639f), +- SCALE_CLD(0.3015113473f), +- SCALE_CLD(0.3698741496f), +- SCALE_CLD(0.4480624795f), +- SCALE_CLD(0.5336171389f), +- SCALE_CLD(0.6219832301f), +- SCALE_CLD(0.7071067691f), +- SCALE_CLD(0.7830305696f), +- SCALE_CLD(0.8457261920f), +- SCALE_CLD(0.8940021992f), +- SCALE_CLD(0.9290818572f), +- SCALE_CLD(0.9534626007f), +- SCALE_CLD(0.9758449197f), +- SCALE_CLD(0.9876723289f), +- SCALE_CLD(0.9937641621f), +- SCALE_CLD(0.9968600869f), +- SCALE_CLD(0.9984226227f), +- SCALE_CLD(0.9995003939f), +- SCALE_CLD(0.9998419285f), +- SCALE_CLD(0.9999499917f), +- SCALE_CLD(0.9999842048f), +- /*SCALE_CLD(1.0000000000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL)}; +- +-#define SC_H(a) (FL2FXCONST_CFG(a)) +-#define DATA_TYPE_H FIXP_CFG +- +-/* not correlated tables */ +-const DATA_TYPE_H H11_nc[31][8] = { +- {SC_H(0.0000000316f), SC_H(0.0000000296f), SC_H(0.0000000266f), +- SC_H(0.0000000190f), SC_H(0.0000000116f), SC_H(0.0000000000f), +- SC_H(-0.0000000186f), SC_H(-0.0000000313f)}, +- {SC_H(0.0056233243f), SC_H(0.0052728835f), SC_H(0.0047394098f), +- SC_H(0.0033992692f), SC_H(0.0020946222f), SC_H(0.0000316215f), +- SC_H(-0.0032913829f), SC_H(-0.0055664564f)}, +- {SC_H(0.0099994997f), SC_H(0.0093815643f), SC_H(0.0084402543f), +- SC_H(0.0060722125f), SC_H(0.0037622179f), SC_H(0.0000999898f), +- SC_H(-0.0058238208f), SC_H(-0.0098974844f)}, +- {SC_H(0.0177799836f), SC_H(0.0166974831f), SC_H(0.0150465844f), +- SC_H(0.0108831404f), SC_H(0.0068073822f), SC_H(0.0003161267f), +- SC_H(-0.0102626514f), SC_H(-0.0175957214f)}, +- {SC_H(0.0316069759f), SC_H(0.0297324844f), SC_H(0.0268681273f), +- SC_H(0.0196138974f), SC_H(0.0124691967f), SC_H(0.0009989988f), +- SC_H(-0.0179452803f), SC_H(-0.0312700421f)}, +- {SC_H(0.0561454296f), SC_H(0.0529650487f), SC_H(0.0480896905f), +- SC_H(0.0356564634f), SC_H(0.0232860073f), SC_H(0.0031523081f), +- SC_H(-0.0309029408f), SC_H(-0.0555154830f)}, +- {SC_H(0.0791834071f), SC_H(0.0748842582f), SC_H(0.0682762116f), +- SC_H(0.0513241664f), SC_H(0.0343080349f), SC_H(0.0062700072f), +- SC_H(-0.0422340371f), SC_H(-0.0782499388f)}, +- {SC_H(0.1115021780f), SC_H(0.1057924852f), SC_H(0.0969873071f), +- SC_H(0.0742305145f), SC_H(0.0511277616f), SC_H(0.0124327289f), +- SC_H(-0.0566596612f), SC_H(-0.1100896299f)}, +- {SC_H(0.1565355062f), SC_H(0.1491366178f), SC_H(0.1376826316f), +- SC_H(0.1078186408f), SC_H(0.0770794004f), SC_H(0.0245033558f), +- SC_H(-0.0735980421f), SC_H(-0.1543303132f)}, +- {SC_H(0.2184644639f), SC_H(0.2091979682f), SC_H(0.1947948188f), +- SC_H(0.1568822265f), SC_H(0.1172478944f), SC_H(0.0477267131f), +- SC_H(-0.0899507254f), SC_H(-0.2148526460f)}, +- {SC_H(0.3015113473f), SC_H(0.2904391289f), SC_H(0.2731673419f), +- SC_H(0.2273024023f), SC_H(0.1786239147f), SC_H(0.0909090787f), +- SC_H(-0.0964255333f), SC_H(-0.2951124907f)}, +- {SC_H(0.3698741496f), SC_H(0.3578284085f), SC_H(0.3390066922f), +- SC_H(0.2888108492f), SC_H(0.2351117432f), SC_H(0.1368068755f), +- SC_H(-0.0850296095f), SC_H(-0.3597966135f)}, +- {SC_H(0.4480624795f), SC_H(0.4354025424f), SC_H(0.4156077504f), +- SC_H(0.3627120256f), SC_H(0.3058823943f), SC_H(0.2007599771f), +- SC_H(-0.0484020934f), SC_H(-0.4304940701f)}, +- {SC_H(0.5336171389f), SC_H(0.5208471417f), SC_H(0.5008935928f), +- SC_H(0.4476420581f), SC_H(0.3905044496f), SC_H(0.2847472429f), +- SC_H(0.0276676007f), SC_H(-0.4966579080f)}, +- {SC_H(0.6219832301f), SC_H(0.6096963882f), SC_H(0.5905415416f), +- SC_H(0.5396950245f), SC_H(0.4856070578f), SC_H(0.3868631124f), +- SC_H(0.1531652957f), SC_H(-0.5045361519f)}, +- {SC_H(0.7071067691f), SC_H(0.6958807111f), SC_H(0.6784504056f), +- SC_H(0.6326373219f), SC_H(0.5847306848f), SC_H(0.4999999702f), +- SC_H(0.3205464482f), SC_H(0.0500000045f)}, +- {SC_H(0.7830305696f), SC_H(0.7733067870f), SC_H(0.7582961321f), +- SC_H(0.7194055915f), SC_H(0.6797705293f), SC_H(0.6131368876f), +- SC_H(0.4997332692f), SC_H(0.6934193969f)}, +- {SC_H(0.8457261920f), SC_H(0.8377274871f), SC_H(0.8254694939f), +- SC_H(0.7942851782f), SC_H(0.7635439038f), SC_H(0.7152527571f), +- SC_H(0.6567122936f), SC_H(0.8229061961f)}, +- {SC_H(0.8940021992f), SC_H(0.8877248168f), SC_H(0.8781855106f), +- SC_H(0.8544237614f), SC_H(0.8318918347f), SC_H(0.7992399335f), +- SC_H(0.7751275301f), SC_H(0.8853276968f)}, +- {SC_H(0.9290818572f), SC_H(0.9243524075f), SC_H(0.9172304869f), +- SC_H(0.8998877406f), SC_H(0.8841174841f), SC_H(0.8631930947f), +- SC_H(0.8565139771f), SC_H(0.9251161218f)}, +- {SC_H(0.9534626007f), SC_H(0.9500193000f), SC_H(0.9448821545f), +- SC_H(0.9326565266f), SC_H(0.9220023751f), SC_H(0.9090909362f), +- SC_H(0.9096591473f), SC_H(0.9514584541f)}, +- {SC_H(0.9758449197f), SC_H(0.9738122821f), SC_H(0.9708200693f), +- SC_H(0.9639287591f), SC_H(0.9582763910f), SC_H(0.9522733092f), +- SC_H(0.9553207159f), SC_H(0.9750427008f)}, +- {SC_H(0.9876723289f), SC_H(0.9865267277f), SC_H(0.9848603010f), +- SC_H(0.9811310172f), SC_H(0.9782302976f), SC_H(0.9754966497f), +- SC_H(0.9779621363f), SC_H(0.9873252511f)}, +- {SC_H(0.9937641621f), SC_H(0.9931397438f), SC_H(0.9922404289f), +- SC_H(0.9902750254f), SC_H(0.9888116717f), SC_H(0.9875672460f), +- SC_H(0.9891131520f), SC_H(0.9936066866f)}, +- {SC_H(0.9968600869f), SC_H(0.9965277910f), SC_H(0.9960530400f), +- SC_H(0.9950347543f), SC_H(0.9943022728f), SC_H(0.9937300086f), +- SC_H(0.9946073294f), SC_H(0.9967863560f)}, +- {SC_H(0.9984226227f), SC_H(0.9982488155f), SC_H(0.9980020523f), +- SC_H(0.9974802136f), SC_H(0.9971146584f), SC_H(0.9968476892f), +- SC_H(0.9973216057f), SC_H(0.9983873963f)}, +- {SC_H(0.9995003939f), SC_H(0.9994428754f), SC_H(0.9993617535f), +- SC_H(0.9991930723f), SC_H(0.9990783334f), SC_H(0.9990010262f), +- SC_H(0.9991616607f), SC_H(0.9994897842f)}, +- {SC_H(0.9998419285f), SC_H(0.9998232722f), SC_H(0.9997970462f), +- SC_H(0.9997430444f), SC_H(0.9997069836f), SC_H(0.9996838570f), +- SC_H(0.9997364879f), SC_H(0.9998386502f)}, +- {SC_H(0.9999499917f), SC_H(0.9999440312f), SC_H(0.9999356270f), +- SC_H(0.9999184012f), SC_H(0.9999070764f), SC_H(0.9998999834f), +- SC_H(0.9999169707f), SC_H(0.9999489784f)}, +- {SC_H(0.9999842048f), SC_H(0.9999822974f), SC_H(0.9999796152f), +- SC_H(0.9999741912f), SC_H(0.9999706149f), SC_H(0.9999684095f), +- SC_H(0.9999738336f), SC_H(0.9999839067f)}, +- /* { SC_H( 1.0000000000f), SC_H( 1.0000000000f), SC_H( 1.0000000000f), +- SC_H( 1.0000000000f), SC_H( 1.0000000000f), SC_H( 1.0000000000f), +- SC_H( 1.0000000000f), SC_H( 1.0000000000f)} */ +- {FX_DBL2FX_CFG(MAXVAL_DBL), FX_DBL2FX_CFG(MAXVAL_DBL), +- FX_DBL2FX_CFG(MAXVAL_DBL), FX_DBL2FX_CFG(MAXVAL_DBL), +- FX_DBL2FX_CFG(MAXVAL_DBL), FX_DBL2FX_CFG(MAXVAL_DBL), +- FX_DBL2FX_CFG(MAXVAL_DBL), FX_DBL2FX_CFG(MAXVAL_DBL)}}; +-const DATA_TYPE_H H12_nc[31][8] = { +- {SC_H(0.0000000000f), SC_H(0.0000000110f), SC_H(0.0000000171f), +- SC_H(0.0000000253f), SC_H(0.0000000294f), SC_H(0.0000000316f), +- SC_H(0.0000000256f), SC_H(0.0000000045f)}, +- {SC_H(0.0000000000f), SC_H(0.0019540924f), SC_H(0.0030265113f), +- SC_H(0.0044795922f), SC_H(0.0052186525f), SC_H(0.0056232354f), +- SC_H(0.0045594489f), SC_H(0.0007977085f)}, +- {SC_H(0.0000000000f), SC_H(0.0034606720f), SC_H(0.0053620986f), +- SC_H(0.0079446984f), SC_H(0.0092647560f), SC_H(0.0099989995f), +- SC_H(0.0081285369f), SC_H(0.0014247064f)}, +- {SC_H(0.0000000000f), SC_H(0.0061091618f), SC_H(0.0094724922f), +- SC_H(0.0140600521f), SC_H(0.0164252054f), SC_H(0.0177771728f), +- SC_H(0.0145191532f), SC_H(0.0025531140f)}, +- {SC_H(0.0000000000f), SC_H(0.0107228858f), SC_H(0.0166464616f), +- SC_H(0.0247849934f), SC_H(0.0290434174f), SC_H(0.0315911844f), +- SC_H(0.0260186065f), SC_H(0.0046027615f)}, +- {SC_H(0.0000000000f), SC_H(0.0186282862f), SC_H(0.0289774220f), +- SC_H(0.0433696397f), SC_H(0.0510888547f), SC_H(0.0560568646f), +- SC_H(0.0468755551f), SC_H(0.0083869267f)}, +- {SC_H(0.0000000000f), SC_H(0.0257363543f), SC_H(0.0401044972f), +- SC_H(0.0602979437f), SC_H(0.0713650510f), SC_H(0.0789347738f), +- SC_H(0.0669798329f), SC_H(0.0121226767f)}, +- {SC_H(0.0000000000f), SC_H(0.0352233723f), SC_H(0.0550108925f), +- SC_H(0.0832019597f), SC_H(0.0990892947f), SC_H(0.1108068749f), +- SC_H(0.0960334241f), SC_H(0.0176920593f)}, +- {SC_H(0.0000000000f), SC_H(0.0475566536f), SC_H(0.0744772255f), +- SC_H(0.1134835035f), SC_H(0.1362429112f), SC_H(0.1546057910f), +- SC_H(0.1381545961f), SC_H(0.0261824392f)}, +- {SC_H(0.0000000000f), SC_H(0.0629518181f), SC_H(0.0989024863f), +- SC_H(0.1520351619f), SC_H(0.1843357086f), SC_H(0.2131874412f), +- SC_H(0.1990868896f), SC_H(0.0395608991f)}, +- {SC_H(0.0000000000f), SC_H(0.0809580907f), SC_H(0.1276271492f), +- SC_H(0.1980977356f), SC_H(0.2429044843f), SC_H(0.2874797881f), +- SC_H(0.2856767476f), SC_H(0.0617875643f)}, +- {SC_H(0.0000000000f), SC_H(0.0936254337f), SC_H(0.1479234397f), +- SC_H(0.2310739607f), SC_H(0.2855334580f), SC_H(0.3436433673f), +- SC_H(0.3599678576f), SC_H(0.0857512727f)}, +- {SC_H(0.0000000000f), SC_H(0.1057573780f), SC_H(0.1674221754f), +- SC_H(0.2630588412f), SC_H(0.3274079263f), SC_H(0.4005688727f), +- SC_H(0.4454404712f), SC_H(0.1242370531f)}, +- {SC_H(0.0000000000f), SC_H(0.1160409302f), SC_H(0.1839915067f), +- SC_H(0.2904545665f), SC_H(0.3636667728f), SC_H(0.4512939751f), +- SC_H(0.5328993797f), SC_H(0.1951362640f)}, +- {SC_H(0.0000000000f), SC_H(0.1230182052f), SC_H(0.1952532977f), +- SC_H(0.3091802597f), SC_H(0.3886501491f), SC_H(0.4870318770f), +- SC_H(0.6028295755f), SC_H(0.3637395203f)}, +- {SC_H(0.0000000000f), SC_H(0.1254990250f), SC_H(0.1992611140f), +- SC_H(0.3158638775f), SC_H(0.3976053298f), SC_H(0.5000000000f), +- SC_H(0.6302776933f), SC_H(0.7053368092f)}, +- {SC_H(0.0000000000f), SC_H(0.1230182052f), SC_H(0.1952533126f), +- SC_H(0.3091802597f), SC_H(0.3886501491f), SC_H(0.4870319068f), +- SC_H(0.6028295755f), SC_H(0.3637394905f)}, +- {SC_H(0.0000000000f), SC_H(0.1160409302f), SC_H(0.1839915216f), +- SC_H(0.2904545665f), SC_H(0.3636668026f), SC_H(0.4512939751f), +- SC_H(0.5328993797f), SC_H(0.1951362044f)}, +- {SC_H(0.0000000000f), SC_H(0.1057573855f), SC_H(0.1674221754f), +- SC_H(0.2630588710f), SC_H(0.3274079263f), SC_H(0.4005688727f), +- SC_H(0.4454405010f), SC_H(0.1242370382f)}, +- {SC_H(0.0000000000f), SC_H(0.0936254337f), SC_H(0.1479234397f), +- SC_H(0.2310739607f), SC_H(0.2855334580f), SC_H(0.3436433673f), +- SC_H(0.3599678576f), SC_H(0.0857512653f)}, +- {SC_H(0.0000000000f), SC_H(0.0809580907f), SC_H(0.1276271492f), +- SC_H(0.1980977207f), SC_H(0.2429044843f), SC_H(0.2874797881f), +- SC_H(0.2856767476f), SC_H(0.0617875606f)}, +- {SC_H(0.0000000000f), SC_H(0.0629518107f), SC_H(0.0989024863f), +- SC_H(0.1520351619f), SC_H(0.1843357235f), SC_H(0.2131874412f), +- SC_H(0.1990868896f), SC_H(0.0395609401f)}, +- {SC_H(0.0000000000f), SC_H(0.0475566462f), SC_H(0.0744772255f), +- SC_H(0.1134835184f), SC_H(0.1362429112f), SC_H(0.1546057761f), +- SC_H(0.1381545961f), SC_H(0.0261824802f)}, +- {SC_H(0.0000000000f), SC_H(0.0352233797f), SC_H(0.0550108962f), +- SC_H(0.0832019448f), SC_H(0.0990892798f), SC_H(0.1108068526f), +- SC_H(0.0960334465f), SC_H(0.0176920686f)}, +- {SC_H(0.0000000000f), SC_H(0.0257363524f), SC_H(0.0401044935f), +- SC_H(0.0602979474f), SC_H(0.0713650808f), SC_H(0.0789347589f), +- SC_H(0.0669797957f), SC_H(0.0121226516f)}, +- {SC_H(0.0000000000f), SC_H(0.0186282881f), SC_H(0.0289774258f), +- SC_H(0.0433696248f), SC_H(0.0510888547f), SC_H(0.0560568906f), +- SC_H(0.0468755886f), SC_H(0.0083869714f)}, +- {SC_H(0.0000000000f), SC_H(0.0107228830f), SC_H(0.0166464727f), +- SC_H(0.0247849822f), SC_H(0.0290434249f), SC_H(0.0315911621f), +- SC_H(0.0260186475f), SC_H(0.0046027377f)}, +- {SC_H(0.0000000000f), SC_H(0.0061091576f), SC_H(0.0094724894f), +- SC_H(0.0140600465f), SC_H(0.0164251942f), SC_H(0.0177771524f), +- SC_H(0.0145191504f), SC_H(0.0025530567f)}, +- {SC_H(0.0000000000f), SC_H(0.0034606743f), SC_H(0.0053620976f), +- SC_H(0.0079446994f), SC_H(0.0092647672f), SC_H(0.0099990256f), +- SC_H(0.0081285043f), SC_H(0.0014247177f)}, +- {SC_H(0.0000000000f), SC_H(0.0019540912f), SC_H(0.0030265225f), +- SC_H(0.0044795908f), SC_H(0.0052186381f), SC_H(0.0056232223f), +- SC_H(0.0045594289f), SC_H(0.0007977359f)}, +- {SC_H(0.0000000000f), SC_H(0.0000000149f), SC_H(0.0000000298f), +- SC_H(0.0000000298f), SC_H(0.0000000000f), SC_H(0.0000000596f), +- SC_H(0.0000000000f), SC_H(0.0000000000f)}}; +- +-/* +- for (i=0; i<31; i++) { +- cld = dequantCLD[i]; +- val = (float)(FDKexp(cld/dbe)/(1+FDKexp(cld/dbe))); +- val = (float)(dbe*FDKlog(val)); +- } +-*/ +-#define SCALE_CLD_C1C2(a) (FL2FXCONST_DBL(a / (float)(1 << SF_CLD_C1C2))) +-const FIXP_DBL dequantCLD_c1[31] = {SCALE_CLD_C1C2(-1.5000000000000000e+002f), +- SCALE_CLD_C1C2(-4.5000137329101563e+001f), +- SCALE_CLD_C1C2(-4.0000434875488281e+001f), +- SCALE_CLD_C1C2(-3.5001373291015625e+001f), +- SCALE_CLD_C1C2(-3.0004341125488281e+001f), +- SCALE_CLD_C1C2(-2.5013711929321289e+001f), +- SCALE_CLD_C1C2(-2.2027315139770508e+001f), +- SCALE_CLD_C1C2(-1.9054332733154297e+001f), +- SCALE_CLD_C1C2(-1.6107742309570313e+001f), +- SCALE_CLD_C1C2(-1.3212384223937988e+001f), +- SCALE_CLD_C1C2(-1.0413927078247070e+001f), +- SCALE_CLD_C1C2(-8.6389207839965820e+000f), +- SCALE_CLD_C1C2(-6.9732279777526855e+000f), +- SCALE_CLD_C1C2(-5.4554042816162109e+000f), +- SCALE_CLD_C1C2(-4.1244258880615234e+000f), +- SCALE_CLD_C1C2(-3.0102999210357666e+000f), +- SCALE_CLD_C1C2(-2.1244258880615234e+000f), +- SCALE_CLD_C1C2(-1.4554045200347900e+000f), +- SCALE_CLD_C1C2(-9.7322785854339600e-001f), +- SCALE_CLD_C1C2(-6.3892036676406860e-001f), +- SCALE_CLD_C1C2(-4.1392669081687927e-001f), +- SCALE_CLD_C1C2(-2.1238386631011963e-001f), +- SCALE_CLD_C1C2(-1.0774217545986176e-001f), +- SCALE_CLD_C1C2(-5.4333221167325974e-002f), +- SCALE_CLD_C1C2(-2.7315950021147728e-002f), +- SCALE_CLD_C1C2(-1.3711934909224510e-002f), +- SCALE_CLD_C1C2(-4.3406565673649311e-003f), +- SCALE_CLD_C1C2(-1.3732088264077902e-003f), +- SCALE_CLD_C1C2(-4.3438826105557382e-004f), +- SCALE_CLD_C1C2(-1.3745666365139186e-004f), +- SCALE_CLD_C1C2(0.0000000000000000e+000f)}; +- +-/* sac_stp */ +-/* none scaled */ +-const FIXP_CFG BP__FDK[] = {FL2FXCONST_CFG(0.73919999599457), +- FL2FXCONST_CFG(0.97909998893738), +- FL2FXCONST_CFG(0.99930000305176)}; +- +-/* scaled with 26 bits */ +-const FIXP_CFG BP_GF__FDK[] = { +- FL2FXCONST_CFG(0.00000000643330), FL2FXCONST_CFG(0.00004396850232), +- FL2FXCONST_CFG(0.00087456948552), FL2FXCONST_CFG(0.00474648220243), +- FL2FXCONST_CFG(0.01717987244800), FL2FXCONST_CFG(0.04906742491073), +- FL2FXCONST_CFG(0.10569518656729), FL2FXCONST_CFG(0.21165767592653), +- FL2FXCONST_CFG(0.36036762478024), FL2FXCONST_CFG(0.59894182766948), +- FL2FXCONST_CFG(0.81641678929129), FL2FXCONST_CFG(0.97418481133397), +- FL2FXCONST_CFG(0.99575411610845), FL2FXCONST_CFG(0.88842666281361), +- FL2FXCONST_CFG(0.79222317063736), FL2FXCONST_CFG(0.70828604318604), +- FL2FXCONST_CFG(0.66395054816338), FL2FXCONST_CFG(0.64633739516952), +- FL2FXCONST_CFG(0.66098278185255)}; +- +-/* sac_bitdec */ +-const INT samplingFreqTable[16] = {96000, 88200, 64000, 48000, 44100, 32000, +- 24000, 22050, 16000, 12000, 11025, 8000, +- 7350, 0, 0, 0}; +- +-const UCHAR freqResTable[] = {0, 28, 20, 14, 10, 7, 5, 4}; +- +-const UCHAR freqResTable_LD[] = {0, 23, 15, 12, 9, 7, 5, 4}; +- +-const UCHAR tempShapeChanTable[][8] = {{5, 5, 4, 6, 6, 4, 4, 2}, +- {5, 5, 5, 7, 7, 4, 4, 2}}; +- +-const TREEPROPERTIES treePropertyTable[] = { +- {1, 6, 5, 0, {0, 0, 0, 0, 1}}, {1, 6, 5, 0, {0, 0, 1, 0, 0}}, +- {2, 6, 3, 1, {1, 0, 0, 0, 0}}, {2, 8, 5, 1, {1, 0, 0, 0, 0}}, +- {2, 8, 5, 1, {1, 0, 0, 0, 0}}, {6, 8, 2, 0, {0, 0, 0, 0, 0}}, +- {6, 8, 2, 0, {0, 0, 0, 0, 0}}, {1, 2, 1, 0, {0, 0, 0, 0, 0}}}; +- +-const SCHAR kernels_4_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; +- +-const SCHAR kernels_5_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; +- +-const SCHAR kernels_7_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, +- 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; +- +-const SCHAR kernels_10_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, +- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, +- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, +- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, +- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +- +-const SCHAR kernels_14_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, +- 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, +- 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}; +- +-const SCHAR kernels_20_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, +- 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, +- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}; +- +-const SCHAR kernels_28_to_71[MAX_HYBRID_BANDS] = { +- 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, +- 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, +- 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; +- +-const SCHAR kernels_4_to_64[MAX_HYBRID_BANDS] = { +- 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; +- +-const SCHAR kernels_5_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; +- +-const SCHAR kernels_7_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, +- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; +- +-const SCHAR kernels_9_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, +- 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; +- +-const SCHAR kernels_12_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, +- 9, 9, 9, 9, 10, 10, 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, 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, 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, 11, 11, 11, 11, 11, 11, 11, 11, 11}; +- +-const SCHAR kernels_15_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, +- 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}; +- +-const SCHAR kernels_23_to_64[MAX_HYBRID_BANDS] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, +- 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, +- 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, +- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, +- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, +- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, +- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}; +- +-const UCHAR mapping_15_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, +- 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14}; +- +-const UCHAR mapping_12_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11}; +- +-const UCHAR mapping_9_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8}; +- +-const UCHAR mapping_7_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6}; +- +-const UCHAR mapping_5_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4}; +- +-const UCHAR mapping_4_to_23[MAX_PARAMETER_BANDS_LD] = { +- 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}; +- +-const FIXP_CFG clipGainTable__FDK[] = { +- /*CLIP_PROTECT_GAIN_0(1.000000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL), +- CLIP_PROTECT_GAIN_1(1.189207f), +- CLIP_PROTECT_GAIN_1(1.414213f), +- CLIP_PROTECT_GAIN_1(1.681792f), +- /*CLIP_PROTECT_GAIN_1(2.000000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL), +- CLIP_PROTECT_GAIN_2(2.378414f), +- CLIP_PROTECT_GAIN_2(2.828427f), +- /*CLIP_PROTECT_GAIN_2(4.000000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL)}; +- +-const UCHAR clipGainSFTable__FDK[] = {0, 1, 1, 1, 1, 2, 2, 2}; +- +-const UCHAR pbStrideTable[] = {1, 2, 5, 28}; +- +-const int smgTimeTable[] = {64, 128, 256, 512}; +- +-/* table is scaled by factor 0.5 */ +-const FIXP_CFG envShapeDataTable__FDK[5][2] = { +- {FL2FXCONST_CFG(0.25000000000000f), FL2FXCONST_CFG(0.25000000000000f)}, +- {FL2FXCONST_CFG(0.35355339059327f), FL2FXCONST_CFG(0.31498026247372f)}, +- {FL2FXCONST_CFG(0.50000000000000f), FL2FXCONST_CFG(0.39685026299205f)}, +- {FL2FXCONST_CFG(0.70710678118655f), FL2FXCONST_CFG(0.50000000000000f)}, +- {/*FL2FXCONST_CFG( 1.00000000000000f)*/ FX_DBL2FX_CFG(MAXVAL_DBL), +- FL2FXCONST_CFG(0.62996052494744f)}}; +- +-/* sac_calcM1andM2 */ +-const SCHAR row2channelSTP[][MAX_M2_INPUT] = {{0, 1}, {0, 3}, {0, 2}, {0, 4}, +- {0, 4}, {0, 2}, {-1, 2}, {0, 1}}; +- +-const SCHAR row2channelGES[][MAX_M2_INPUT] = {{0, 1}, {0, 3}, {0, 3}, {0, 5}, +- {0, 5}, {0, 2}, {-1, 2}, {0, 1}}; +- +-const SCHAR row2residual[][MAX_M2_INPUT] = {{-1, 0}, {-1, 0}, {-1, -1}, +- {-1, -1}, {-1, -1}, {-1, -1}, +- {-1, -1}, {-1, 0}}; +- +-/******************************************************************************* +- Functionname: sac_getCLDValues +- ******************************************************************************* +- +- Description: Get CLD values from table index. +- +- Arguments: +- index: Table index +- *cu, *cl : Pointer to locations where resulting values will be written to. +- +- Return: nothing +- +-*******************************************************************************/ +-void SpatialDequantGetCLDValues(int index, FIXP_DBL* cu, FIXP_DBL* cl) { +- *cu = FX_CFG2FX_DBL(dequantCLD_c_l[index]); +- *cl = FX_CFG2FX_DBL(dequantCLD_c_l[31 - 1 - index]); +-} +- +-void SpatialDequantGetCLD2Values(int idx, FIXP_DBL* x) { +- *x = FX_CFG2FX_DBL(dequantCLD__FDK[idx]); +-} +diff --git a/libSACdec/src/sac_rom.h b/libSACdec/src/sac_rom.h +deleted file mode 100644 +index d366fb6..0000000 +--- a/libSACdec/src/sac_rom.h ++++ /dev/null +@@ -1,230 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec tables +- +-*******************************************************************************/ +- +-#ifndef SAC_ROM_H +-#define SAC_ROM_H +- +-#include "FDK_archdef.h" +-#include "sac_dec_interface.h" +- +-#include "huff_nodes.h" +-#include "sac_bitdec.h" +-#include "machine_type.h" +- +-/* Global ROM table data type: */ +-#ifndef ARCH_PREFER_MULT_32x32 +-#define FIXP_CFG FIXP_SGL +-#define FX_CFG2FX_DBL FX_SGL2FX_DBL +-#define FX_CFG2FX_SGL +-#define CFG(a) (FX_DBL2FXCONST_SGL(a)) +-#define FL2FXCONST_CFG FL2FXCONST_SGL +-#define FX_DBL2FX_CFG(x) FX_DBL2FX_SGL((FIXP_DBL)(x)) +-#else +-#define FIXP_CFG FIXP_DBL +-#define FX_CFG2FX_DBL +-#define FX_CFG2FX_SGL FX_DBL2FX_SGL +-#define CFG(a) FIXP_DBL(a) +-#define FL2FXCONST_CFG FL2FXCONST_DBL +-#define FX_DBL2FX_CFG(x) ((FIXP_DBL)(x)) +-#endif +- +-/* others */ +-#define SCALE_INV_ICC (2) +-#define G_dd_SCALE (2) +- +-#define QCC_SCALE 1 +-#define M1M2_DATA FIXP_DBL +-#ifndef ARCH_PREFER_MULT_32x32 +-#define M1M2_CDATA FIXP_SGL +-#define M1M2_CDATA2FX_DBL(a) FX_SGL2FX_DBL(a) +-#define FX_DBL2M1M2_CDATA(a) FX_DBL2FX_SGL(a) +-#else +-#define M1M2_CDATA FIXP_DBL +-#define M1M2_CDATA2FX_DBL(a) (a) +-#define FX_DBL2M1M2_CDATA(a) (a) +-#endif +- +-#define CLIP_PROTECT_GAIN_0(x) FL2FXCONST_CFG(((x) / (float)(1 << 0))) +-#define CLIP_PROTECT_GAIN_1(x) FL2FXCONST_CFG(((x) / (float)(1 << 1))) +-#define CLIP_PROTECT_GAIN_2(x) FL2FXCONST_CFG(((x) / (float)(1 << 2))) +- +-#define SF_CLD_C1C2 (8) +- +-extern const FIXP_CFG dequantCPC__FDK[]; +-extern const FIXP_CFG dequantICC__FDK[8]; +-extern const FIXP_CFG dequantCLD__FDK[31]; +- +-#define IPD_SCALE (5) +-#define PI__IPD (FL2FXCONST_DBL(3.1415926535897932f / (float)(1 << IPD_SCALE))) +-/* Define for PI*2 for better precision in SpatialDecApplyPhase() */ +-#define PIx2__IPD \ +- (FL2FXCONST_DBL(3.1415926535897932f / (float)(1 << (IPD_SCALE - 1)))) +- +-extern const FIXP_CFG dequantIPD__FDK[16]; +- +-extern const FIXP_CFG H11_nc[31][8]; +-extern const FIXP_CFG H12_nc[31][8]; +- +-extern const FIXP_DBL dequantCLD_c1[31]; +- +-extern const FIXP_CFG BP__FDK[]; +-extern const FIXP_CFG BP_GF__FDK[]; +-extern const SCHAR row2channelSTP[][MAX_M2_INPUT]; +- +-/* sac_bitdec */ +-extern const INT samplingFreqTable[16]; +-extern const UCHAR freqResTable[]; +-extern const UCHAR freqResTable_LD[]; +-extern const UCHAR tempShapeChanTable[2][8]; +-extern const TREEPROPERTIES treePropertyTable[]; +- +-extern const SCHAR kernels_4_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_5_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_7_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_10_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_14_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_20_to_71[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_28_to_71[MAX_HYBRID_BANDS]; +- +-extern const UCHAR mapping_4_to_28[MAX_PARAMETER_BANDS]; +-extern const UCHAR mapping_5_to_28[MAX_PARAMETER_BANDS]; +-extern const UCHAR mapping_7_to_28[MAX_PARAMETER_BANDS]; +-extern const UCHAR mapping_10_to_28[MAX_PARAMETER_BANDS]; +-extern const UCHAR mapping_14_to_28[MAX_PARAMETER_BANDS]; +-extern const UCHAR mapping_20_to_28[MAX_PARAMETER_BANDS]; +-extern const SCHAR kernels_4_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_5_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_7_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_9_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_12_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_15_to_64[MAX_HYBRID_BANDS]; +-extern const SCHAR kernels_23_to_64[MAX_HYBRID_BANDS]; +- +-extern const UCHAR mapping_15_to_23[MAX_PARAMETER_BANDS_LD]; +-extern const UCHAR mapping_12_to_23[MAX_PARAMETER_BANDS_LD]; +-extern const UCHAR mapping_9_to_23[MAX_PARAMETER_BANDS_LD]; +-extern const UCHAR mapping_7_to_23[MAX_PARAMETER_BANDS_LD]; +-extern const UCHAR mapping_5_to_23[MAX_PARAMETER_BANDS_LD]; +-extern const UCHAR mapping_4_to_23[MAX_PARAMETER_BANDS_LD]; +- +-extern const FIXP_CFG clipGainTable__FDK[]; +-extern const UCHAR clipGainSFTable__FDK[]; +- +-extern const UCHAR pbStrideTable[]; +-extern const int smgTimeTable[]; +- +-extern const FIXP_CFG envShapeDataTable__FDK[5][2]; +-extern const SCHAR row2channelGES[][MAX_M2_INPUT]; +- +-/* sac_calcM1andM2 */ +-extern const SCHAR row2residual[][MAX_M2_INPUT]; +- +-void SpatialDequantGetCLDValues(int index, FIXP_DBL* cu, FIXP_DBL* cl); +- +-void SpatialDequantGetCLD2Values(int index, FIXP_DBL* x); +- +-/* External helper functions */ +-static inline int SacGetHybridSubbands(int qmfSubbands) { +- return qmfSubbands - MAX_QMF_BANDS_TO_HYBRID + 10; +-} +- +-#endif /* SAC_ROM_H */ +diff --git a/libSACdec/src/sac_smoothing.cpp b/libSACdec/src/sac_smoothing.cpp +deleted file mode 100644 +index bee6551..0000000 +--- a/libSACdec/src/sac_smoothing.cpp ++++ /dev/null +@@ -1,295 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec parameter smoothing +- +-*******************************************************************************/ +- +-#include "sac_dec.h" +-#include "sac_bitdec.h" +-#include "sac_smoothing.h" +-#include "sac_rom.h" +- +-/******************************************************************************* +- Functionname: calcFilterCoeff +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- +- Output: +- +- +-*******************************************************************************/ +-static FIXP_DBL calcFilterCoeff__FDK(spatialDec *self, int ps, +- const SPATIAL_BS_FRAME *frame) { +- int dSlots; +- FIXP_DBL delta; +- +- dSlots = frame->paramSlot[ps] - self->smoothState->prevParamSlot; +- +- if (dSlots <= 0) { +- dSlots += self->timeSlots; +- } +- +- delta = fDivNorm(dSlots, self->smgTime[ps]); +- +- return delta; +-} +- +-/******************************************************************************* +- Functionname: getSmoothOnOff +- ******************************************************************************* +- +- Description: +- +- Arguments: +- +- Input: +- +- Output: +- +- +-*******************************************************************************/ +-static int getSmoothOnOff(spatialDec *self, int ps, int pb) { +- int smoothBand = 0; +- +- smoothBand = self->smgData[ps][pb]; +- +- return smoothBand; +-} +- +-void SpatialDecSmoothM1andM2(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- int ps) { +- FIXP_DBL delta__FDK; +- FIXP_DBL one_minus_delta__FDK; +- +- int pb, row, col; +- int residualBands = 0; +- +- if (self->residualCoding) { +- int i; +- int boxes = self->numOttBoxes; +- for (i = 0; i < boxes; i++) { +- if (self->residualBands[i] > residualBands) { +- residualBands = self->residualBands[i]; +- } +- } +- } +- +- delta__FDK = calcFilterCoeff__FDK(self, ps, frame); +- if (delta__FDK == /*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL) +- one_minus_delta__FDK = FL2FXCONST_DBL(0.0f); +- else if (delta__FDK == FL2FXCONST_DBL(0.0f)) +- one_minus_delta__FDK = /*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL; +- else +- one_minus_delta__FDK = (FL2FXCONST_DBL(0.5f) - (delta__FDK >> 1)) << 1; +- +- for (pb = 0; pb < self->numParameterBands; pb++) { +- int smoothBand; +- +- smoothBand = getSmoothOnOff(self, ps, pb); +- +- if (smoothBand && (pb >= residualBands)) { +- for (row = 0; row < self->numM2rows; row++) { +- for (col = 0; col < self->numVChannels; col++) { +- self->M2Real__FDK[row][col][pb] = +- ((fMultDiv2(delta__FDK, self->M2Real__FDK[row][col][pb]) + +- fMultDiv2(one_minus_delta__FDK, +- self->M2RealPrev__FDK[row][col][pb])) +- << 1); +- if (0 || (self->phaseCoding == 3)) { +- self->M2Imag__FDK[row][col][pb] = +- ((fMultDiv2(delta__FDK, self->M2Imag__FDK[row][col][pb]) + +- fMultDiv2(one_minus_delta__FDK, +- self->M2ImagPrev__FDK[row][col][pb])) +- << 1); +- } +- } +- } +- } +- } +- self->smoothState->prevParamSlot = frame->paramSlot[ps]; +-} +- +-/* init states */ +-void initParameterSmoothing(spatialDec *self) { +- self->smoothState->prevParamSlot = 0; +-} +- +-void SpatialDecSmoothOPD(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- int ps) { +- int pb; +- int dSlots; +- FIXP_DBL delta__FDK; +- FIXP_DBL one_minus_delta__FDK; +- FIXP_DBL *phaseLeftSmooth__FDK = self->smoothState->opdLeftState__FDK; +- FIXP_DBL *phaseRightSmooth__FDK = self->smoothState->opdRightState__FDK; +- int quantCoarse; +- +- quantCoarse = frame->IPDLosslessData[0].bsQuantCoarseXXX[ps]; +- +- if (frame->OpdSmoothingMode == 0) { +- FDKmemcpy(phaseLeftSmooth__FDK, self->PhaseLeft__FDK, +- self->numParameterBands * sizeof(FIXP_DBL)); +- FDKmemcpy(phaseRightSmooth__FDK, self->PhaseRight__FDK, +- self->numParameterBands * sizeof(FIXP_DBL)); +- } else { +- if (ps == 0) { +- dSlots = frame->paramSlot[ps] + 1; +- } else { +- dSlots = frame->paramSlot[ps] - frame->paramSlot[ps - 1]; +- } +- +- delta__FDK = (FIXP_DBL)((INT)(FL2FXCONST_DBL(0.0078125f)) * dSlots); +- +- if (delta__FDK == (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/) +- one_minus_delta__FDK = FL2FXCONST_DBL(0.0f); +- else if (delta__FDK == FL2FXCONST_DBL(0.0f)) +- one_minus_delta__FDK = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; +- else +- one_minus_delta__FDK = (FL2FXCONST_DBL(0.5f) - (delta__FDK >> 1)) << 1; +- +- for (pb = 0; pb < self->numParameterBands; pb++) { +- FIXP_DBL tmpL, tmpR, tmp; +- +- tmpL = self->PhaseLeft__FDK[pb]; +- tmpR = self->PhaseRight__FDK[pb]; +- +- while (tmpL > phaseLeftSmooth__FDK[pb] + PI__IPD) tmpL -= PI__IPD << 1; +- while (tmpL < phaseLeftSmooth__FDK[pb] - PI__IPD) tmpL += PI__IPD << 1; +- while (tmpR > phaseRightSmooth__FDK[pb] + PI__IPD) tmpR -= PI__IPD << 1; +- while (tmpR < phaseRightSmooth__FDK[pb] - PI__IPD) tmpR += PI__IPD << 1; +- +- phaseLeftSmooth__FDK[pb] = +- fMult(delta__FDK, tmpL) + +- fMult(one_minus_delta__FDK, phaseLeftSmooth__FDK[pb]); +- phaseRightSmooth__FDK[pb] = +- fMult(delta__FDK, tmpR) + +- fMult(one_minus_delta__FDK, phaseRightSmooth__FDK[pb]); +- +- tmp = (((tmpL >> 1) - (tmpR >> 1)) - ((phaseLeftSmooth__FDK[pb] >> 1) - +- (phaseRightSmooth__FDK[pb] >> 1))) +- << 1; +- while (tmp > PI__IPD) tmp -= PI__IPD << 1; +- while (tmp < -PI__IPD) tmp += PI__IPD << 1; +- if (fixp_abs(tmp) > fMult((quantCoarse ? FL2FXCONST_DBL(50.f / 180.f) +- : FL2FXCONST_DBL(25.f / 180.f)), +- PI__IPD)) { +- phaseLeftSmooth__FDK[pb] = tmpL; +- phaseRightSmooth__FDK[pb] = tmpR; +- } +- +- while (phaseLeftSmooth__FDK[pb] > PI__IPD << 1) +- phaseLeftSmooth__FDK[pb] -= PI__IPD << 1; +- while (phaseLeftSmooth__FDK[pb] < (FIXP_DBL)0) +- phaseLeftSmooth__FDK[pb] += PI__IPD << 1; +- while (phaseRightSmooth__FDK[pb] > PI__IPD << 1) +- phaseRightSmooth__FDK[pb] -= PI__IPD << 1; +- while (phaseRightSmooth__FDK[pb] < (FIXP_DBL)0) +- phaseRightSmooth__FDK[pb] += PI__IPD << 1; +- +- self->PhaseLeft__FDK[pb] = phaseLeftSmooth__FDK[pb]; +- self->PhaseRight__FDK[pb] = phaseRightSmooth__FDK[pb]; +- } +- } +- return; +-} +diff --git a/libSACdec/src/sac_smoothing.h b/libSACdec/src/sac_smoothing.h +deleted file mode 100644 +index fdf3f5b..0000000 +--- a/libSACdec/src/sac_smoothing.h ++++ /dev/null +@@ -1,114 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec parameter smoothing +- +-*******************************************************************************/ +- +-#ifndef SAC_SMOOTHING_H +-#define SAC_SMOOTHING_H +- +-#include "sac_dec.h" +- +-void initParameterSmoothing(spatialDec *self); +-void SpatialDecSmoothM1andM2(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- int ps); +-void SpatialDecSmoothOPD(spatialDec *self, const SPATIAL_BS_FRAME *frame, +- int ps); +- +-#endif +diff --git a/libSACdec/src/sac_stp.cpp b/libSACdec/src/sac_stp.cpp +deleted file mode 100644 +index 818e9df..0000000 +--- a/libSACdec/src/sac_stp.cpp ++++ /dev/null +@@ -1,548 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec subband processing +- +-*******************************************************************************/ +- +-#include "sac_stp.h" +-#include "sac_calcM1andM2.h" +-#include "sac_bitdec.h" +-#include "FDK_matrixCalloc.h" +-#include "sac_rom.h" +- +-#define BP_GF_START 6 +-#define BP_GF_SIZE 25 +-#define HP_SIZE 9 +-#define STP_UPDATE_ENERGY_RATE 32 +- +-#define SF_WET 5 +-#define SF_DRY \ +- 3 /* SF_DRY == 2 would produce good conformance test results as well */ +-#define SF_PRODUCT_BP_GF 13 +-#define SF_PRODUCT_BP_GF_GF 26 +-#define SF_SCALE 2 +- +-#define SF_SCALE_LD64 FL2FXCONST_DBL(0.03125) /* LD64((1<= scale2 >= 1/STP_SCALE_LIMIT +- => STP_SCALE_LIMIT >= (0.1 + 0.9 * scale) >= 1/STP_SCALE_LIMIT +- => (STP_SCALE_LIMIT-0.1)/0.9 >= scale >= +- (1/STP_SCALE_LIMIT-0.1)/0.9 +- +- 3. Limiting of scale factor before sqrt calculation +- ((STP_SCALE_LIMIT-0.1)/0.9)^2 >= (scale^2) >= +- ((1/STP_SCALE_LIMIT-0.1)/0.9)^2 (STP_SCALE_LIMIT_HI)^2 >= (scale^2) >= +- (STP_SCALE_LIMIT_LO)^2 +- +- 4. Thresholds for limiting of scale factor +- STP_SCALE_LIMIT_HI = ((2.82-0.1)/0.9) +- STP_SCALE_LIMIT_LO = (((1.0/2.82)-0.1)/0.9) +- STP_SCALE_LIMIT_HI_LD64 = LD64(STP_SCALE_LIMIT_HI*STP_SCALE_LIMIT_HI) +- STP_SCALE_LIMIT_LO_LD64 = LD64(STP_SCALE_LIMIT_LO*STP_SCALE_LIMIT_LO) +-*/ +- +-#define DRY_ENER_WEIGHT(DryEner) DryEner = DryEner >> dry_scale_dmx +- +-#define WET_ENER_WEIGHT(WetEner) WetEner = WetEner << wet_scale_dmx +- +-#define DRY_ENER_SUM_REAL(DryEner, dmxReal, n) \ +- DryEner += \ +- fMultDiv2(fPow2Div2(dmxReal << SF_DRY), pBP[n]) >> ((2 * SF_DRY) - 2) +- +-#define DRY_ENER_SUM_CPLX(DryEner, dmxReal, dmxImag, n) \ +- DryEner += fMultDiv2( \ +- fPow2Div2(dmxReal << SF_DRY) + fPow2Div2(dmxImag << SF_DRY), pBP[n]) +- +-#define CALC_WET_SCALE(dryIdx, wetIdx) \ +- if ((DryEnerLD64[dryIdx] - STP_SCALE_LIMIT_HI_LD64) > WetEnerLD64[wetIdx]) { \ +- scale[wetIdx] = STP_SCALE_LIMIT_HI; \ +- } else if (DryEnerLD64[dryIdx] < \ +- (WetEnerLD64[wetIdx] - STP_SCALE_LIMIT_LO_LD64)) { \ +- scale[wetIdx] = STP_SCALE_LIMIT_LO; \ +- } else { \ +- tmp = ((DryEnerLD64[dryIdx] - WetEnerLD64[wetIdx]) >> 1) - SF_SCALE_LD64; \ +- scale[wetIdx] = CalcInvLdData(tmp); \ +- } +- +-struct STP_DEC { +- FIXP_DBL runDryEner[MAX_INPUT_CHANNELS]; +- FIXP_DBL runWetEner[MAX_OUTPUT_CHANNELS]; +- FIXP_DBL oldDryEnerLD64[MAX_INPUT_CHANNELS]; +- FIXP_DBL oldWetEnerLD64[MAX_OUTPUT_CHANNELS]; +- FIXP_DBL prev_tp_scale[MAX_OUTPUT_CHANNELS]; +- const FIXP_CFG *BP; +- const FIXP_CFG *BP_GF; +- int update_old_ener; +-}; +- +-inline void combineSignalReal(FIXP_DBL *hybOutputRealDry, +- FIXP_DBL *hybOutputRealWet, int bands) { +- int n; +- +- for (n = bands - 1; n >= 0; n--) { +- *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet; +- hybOutputRealDry++, hybOutputRealWet++; +- } +-} +- +-inline void combineSignalRealScale1(FIXP_DBL *hybOutputRealDry, +- FIXP_DBL *hybOutputRealWet, FIXP_DBL scaleX, +- int bands) { +- int n; +- +- for (n = bands - 1; n >= 0; n--) { +- *hybOutputRealDry = +- *hybOutputRealDry + +- (fMultDiv2(*hybOutputRealWet, scaleX) << (SF_SCALE + 1)); +- hybOutputRealDry++, hybOutputRealWet++; +- } +-} +- +-inline void combineSignalCplx(FIXP_DBL *hybOutputRealDry, +- FIXP_DBL *hybOutputImagDry, +- FIXP_DBL *hybOutputRealWet, +- FIXP_DBL *hybOutputImagWet, int bands) { +- int n; +- +- for (n = bands - 1; n >= 0; n--) { +- *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet; +- *hybOutputImagDry = *hybOutputImagDry + *hybOutputImagWet; +- hybOutputRealDry++, hybOutputRealWet++; +- hybOutputImagDry++, hybOutputImagWet++; +- } +-} +- +-inline void combineSignalCplxScale1(FIXP_DBL *hybOutputRealDry, +- FIXP_DBL *hybOutputImagDry, +- FIXP_DBL *hybOutputRealWet, +- FIXP_DBL *hybOutputImagWet, +- const FIXP_CFG *pBP, FIXP_DBL scaleX, +- int bands) { +- int n; +- FIXP_DBL scaleY; +- for (n = bands - 1; n >= 0; n--) { +- scaleY = fMultDiv2(scaleX, *pBP); +- *hybOutputRealDry = +- *hybOutputRealDry + +- (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 2)); +- *hybOutputImagDry = +- *hybOutputImagDry + +- (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 2)); +- hybOutputRealDry++, hybOutputRealWet++; +- hybOutputImagDry++, hybOutputImagWet++; +- pBP++; +- } +-} +- +-inline void combineSignalCplxScale2(FIXP_DBL *hybOutputRealDry, +- FIXP_DBL *hybOutputImagDry, +- FIXP_DBL *hybOutputRealWet, +- FIXP_DBL *hybOutputImagWet, FIXP_DBL scaleX, +- int bands) { +- int n; +- +- for (n = bands - 1; n >= 0; n--) { +- *hybOutputRealDry = +- *hybOutputRealDry + +- (fMultDiv2(*hybOutputRealWet, scaleX) << (SF_SCALE + 1)); +- *hybOutputImagDry = +- *hybOutputImagDry + +- (fMultDiv2(*hybOutputImagWet, scaleX) << (SF_SCALE + 1)); +- hybOutputRealDry++, hybOutputRealWet++; +- hybOutputImagDry++, hybOutputImagWet++; +- } +-} +- +-/******************************************************************************* +- Functionname: subbandTPCreate +- ******************************************************************************/ +-SACDEC_ERROR subbandTPCreate(HANDLE_STP_DEC *hStpDec) { +- HANDLE_STP_DEC self = NULL; +- FDK_ALLOCATE_MEMORY_1D(self, 1, struct STP_DEC) +- if (hStpDec != NULL) { +- *hStpDec = self; +- } +- +- return MPS_OK; +-bail: +- return MPS_OUTOFMEMORY; +-} +- +-SACDEC_ERROR subbandTPInit(HANDLE_STP_DEC self) { +- SACDEC_ERROR err = MPS_OK; +- int ch; +- +- for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) { +- self->prev_tp_scale[ch] = FL2FXCONST_DBL(1.0f / (1 << SF_SCALE)); +- self->oldWetEnerLD64[ch] = +- FL2FXCONST_DBL(0.34375f); /* 32768.0*32768.0/2^(44-26-10) */ +- } +- for (ch = 0; ch < MAX_INPUT_CHANNELS; ch++) { +- self->oldDryEnerLD64[ch] = +- FL2FXCONST_DBL(0.1875f); /* 32768.0*32768.0/2^(44-26) */ +- } +- +- self->BP = BP__FDK; +- self->BP_GF = BP_GF__FDK; +- +- self->update_old_ener = 0; +- +- return err; +-} +- +-/******************************************************************************* +- Functionname: subbandTPDestroy +- ******************************************************************************/ +-void subbandTPDestroy(HANDLE_STP_DEC *hStpDec) { +- if (hStpDec != NULL) { +- FDK_FREE_MEMORY_1D(*hStpDec); +- } +-} +- +-/******************************************************************************* +- Functionname: subbandTPApply +- ******************************************************************************/ +-SACDEC_ERROR subbandTPApply(spatialDec *self, const SPATIAL_BS_FRAME *frame) { +- FIXP_DBL *qmfOutputRealDry[MAX_OUTPUT_CHANNELS]; +- FIXP_DBL *qmfOutputImagDry[MAX_OUTPUT_CHANNELS]; +- FIXP_DBL *qmfOutputRealWet[MAX_OUTPUT_CHANNELS]; +- FIXP_DBL *qmfOutputImagWet[MAX_OUTPUT_CHANNELS]; +- +- FIXP_DBL DryEner[MAX_INPUT_CHANNELS]; +- FIXP_DBL scale[MAX_OUTPUT_CHANNELS]; +- +- FIXP_DBL DryEnerLD64[MAX_INPUT_CHANNELS]; +- FIXP_DBL WetEnerLD64[MAX_OUTPUT_CHANNELS]; +- +- FIXP_DBL DryEner0 = FL2FXCONST_DBL(0.0f); +- FIXP_DBL WetEnerX, damp, tmp; +- FIXP_DBL dmxReal0, dmxImag0; +- int skipChannels[MAX_OUTPUT_CHANNELS]; +- int n, ch, cplxBands, cplxHybBands; +- int dry_scale_dmx, wet_scale_dmx; +- int i_LF, i_RF; +- HANDLE_STP_DEC hStpDec; +- const FIXP_CFG *pBP; +- +- int nrgScale = (2 * self->clipProtectGainSF__FDK); +- +- hStpDec = self->hStpDec; +- +- /* set scalefactor and loop counter */ +- FDK_ASSERT(SF_DRY >= 1); +- { +- cplxBands = BP_GF_SIZE; +- cplxHybBands = self->hybridBands; +- dry_scale_dmx = (2 * SF_DRY) - 2; +- wet_scale_dmx = 2; +- } +- +- /* setup pointer for forming the direct downmix signal */ +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- qmfOutputRealDry[ch] = &self->hybOutputRealDry__FDK[ch][7]; +- qmfOutputRealWet[ch] = &self->hybOutputRealWet__FDK[ch][7]; +- qmfOutputImagDry[ch] = &self->hybOutputImagDry__FDK[ch][7]; +- qmfOutputImagWet[ch] = &self->hybOutputImagWet__FDK[ch][7]; +- } +- +- /* clear skipping flag for all output channels */ +- FDKmemset(skipChannels, 0, self->numOutputChannels * sizeof(int)); +- +- /* set scale values to zero */ +- FDKmemset(scale, 0, self->numOutputChannels * sizeof(FIXP_DBL)); +- +- /* update normalisation energy with latest smoothed energy */ +- if (hStpDec->update_old_ener == STP_UPDATE_ENERGY_RATE) { +- hStpDec->update_old_ener = 1; +- for (ch = 0; ch < self->numInputChannels; ch++) { +- hStpDec->oldDryEnerLD64[ch] = +- CalcLdData(hStpDec->runDryEner[ch] + ABS_THR__FDK); +- } +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- hStpDec->oldWetEnerLD64[ch] = +- CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK); +- } +- } else { +- hStpDec->update_old_ener++; +- } +- +- /* get channel configuration */ +- switch (self->treeConfig) { +- case TREE_212: +- i_LF = 0; +- i_RF = 1; +- break; +- default: +- return MPS_WRONG_TREECONFIG; +- } +- +- /* form the 'direct' downmix signal */ +- pBP = hStpDec->BP_GF - BP_GF_START; +- switch (self->treeConfig) { +- case TREE_212: +- for (n = BP_GF_START; n < cplxBands; n++) { +- dmxReal0 = qmfOutputRealDry[i_LF][n] + qmfOutputRealDry[i_RF][n]; +- dmxImag0 = qmfOutputImagDry[i_LF][n] + qmfOutputImagDry[i_RF][n]; +- DRY_ENER_SUM_CPLX(DryEner0, dmxReal0, dmxImag0, n); +- } +- DRY_ENER_WEIGHT(DryEner0); +- break; +- default:; +- } +- DryEner[0] = DryEner0; +- +- /* normalise the 'direct' signals */ +- for (ch = 0; ch < self->numInputChannels; ch++) { +- DryEner[ch] = DryEner[ch] << (nrgScale); +- hStpDec->runDryEner[ch] = +- fMult(STP_LPF_COEFF1__FDK, hStpDec->runDryEner[ch]) + +- fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, DryEner[ch]); +- if (DryEner[ch] != FL2FXCONST_DBL(0.0f)) { +- DryEnerLD64[ch] = +- fixMax((CalcLdData(DryEner[ch]) - hStpDec->oldDryEnerLD64[ch]), +- FL2FXCONST_DBL(-0.484375f)); +- } else { +- DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); +- } +- } +- if (self->treeConfig == TREE_212) { +- for (; ch < MAX_INPUT_CHANNELS; ch++) { +- DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); +- } +- } +- +- /* normalise the 'diffuse' signals */ +- pBP = hStpDec->BP_GF - BP_GF_START; +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- if (skipChannels[ch]) { +- continue; +- } +- +- WetEnerX = FL2FXCONST_DBL(0.0f); +- for (n = BP_GF_START; n < cplxBands; n++) { +- tmp = fPow2Div2(qmfOutputRealWet[ch][n] << SF_WET); +- tmp += fPow2Div2(qmfOutputImagWet[ch][n] << SF_WET); +- WetEnerX += fMultDiv2(tmp, pBP[n]); +- } +- WET_ENER_WEIGHT(WetEnerX); +- +- WetEnerX = WetEnerX << (nrgScale); +- hStpDec->runWetEner[ch] = +- fMult(STP_LPF_COEFF1__FDK, hStpDec->runWetEner[ch]) + +- fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, WetEnerX); +- +- if (WetEnerX == FL2FXCONST_DBL(0.0f)) { +- WetEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); +- } else { +- WetEnerLD64[ch] = +- fixMax((CalcLdData(WetEnerX) - hStpDec->oldWetEnerLD64[ch]), +- FL2FXCONST_DBL(-0.484375f)); +- } +- } +- +- /* compute scale factor for the 'diffuse' signals */ +- switch (self->treeConfig) { +- case TREE_212: +- if (DryEner[0] != FL2FXCONST_DBL(0.0f)) { +- CALC_WET_SCALE(0, i_LF); +- CALC_WET_SCALE(0, i_RF); +- } +- break; +- default:; +- } +- +- damp = FL2FXCONST_DBL(0.1f / (1 << SF_SCALE)); +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- /* damp the scaling factor */ +- scale[ch] = damp + fMult(FL2FXCONST_DBL(0.9f), scale[ch]); +- +- /* limiting the scale factor */ +- if (scale[ch] > STP_SCALE_LIMIT__FDK) { +- scale[ch] = STP_SCALE_LIMIT__FDK; +- } +- if (scale[ch] < ONE_DIV_STP_SCALE_LIMIT__FDK) { +- scale[ch] = ONE_DIV_STP_SCALE_LIMIT__FDK; +- } +- +- /* low pass filter the scaling factor */ +- scale[ch] = +- fMult(STP_LPF_COEFF2__FDK, scale[ch]) + +- fMult(ONE_MINUS_STP_LPF_COEFF2__FDK, hStpDec->prev_tp_scale[ch]); +- hStpDec->prev_tp_scale[ch] = scale[ch]; +- } +- +- /* combine 'direct' and scaled 'diffuse' signal */ +- FDK_ASSERT((HP_SIZE - 3 + 10 - 1) == PC_NUM_HYB_BANDS); +- const SCHAR *channlIndex = row2channelSTP[self->treeConfig]; +- +- for (ch = 0; ch < self->numOutputChannels; ch++) { +- int no_scaling; +- +- no_scaling = !frame->tempShapeEnableChannelSTP[channlIndex[ch]]; +- if (no_scaling) { +- combineSignalCplx( +- &self->hybOutputRealDry__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputImagDry__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputRealWet__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputImagWet__FDK[ch][self->tp_hybBandBorder], +- cplxHybBands - self->tp_hybBandBorder); +- +- } else { +- FIXP_DBL scaleX; +- scaleX = scale[ch]; +- pBP = hStpDec->BP - self->tp_hybBandBorder; +- /* Band[HP_SIZE-3+10-1] needs not to be processed in +- combineSignalCplxScale1(), because pB[HP_SIZE-3+10-1] would be 1.0 */ +- combineSignalCplxScale1( +- &self->hybOutputRealDry__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputImagDry__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputRealWet__FDK[ch][self->tp_hybBandBorder], +- &self->hybOutputImagWet__FDK[ch][self->tp_hybBandBorder], +- &pBP[self->tp_hybBandBorder], scaleX, +- (HP_SIZE - 3 + 10 - 1) - self->tp_hybBandBorder); +- +- { +- combineSignalCplxScale2( +- &self->hybOutputRealDry__FDK[ch][HP_SIZE - 3 + 10 - 1], +- &self->hybOutputImagDry__FDK[ch][HP_SIZE - 3 + 10 - 1], +- &self->hybOutputRealWet__FDK[ch][HP_SIZE - 3 + 10 - 1], +- &self->hybOutputImagWet__FDK[ch][HP_SIZE - 3 + 10 - 1], scaleX, +- cplxHybBands - (HP_SIZE - 3 + 10 - 1)); +- } +- } +- } +- +- return (SACDEC_ERROR)MPS_OK; +- ; +-} +diff --git a/libSACdec/src/sac_stp.h b/libSACdec/src/sac_stp.h +deleted file mode 100644 +index 18471bd..0000000 +--- a/libSACdec/src/sac_stp.h ++++ /dev/null +@@ -1,115 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): +- +- Description: SAC Dec subband processing +- +-*******************************************************************************/ +- +-#ifndef SAC_STP_H +-#define SAC_STP_H +- +-#include "sac_dec.h" +- +-SACDEC_ERROR subbandTPCreate(HANDLE_STP_DEC *hStpDec); +- +-SACDEC_ERROR subbandTPInit(HANDLE_STP_DEC self); +- +-SACDEC_ERROR subbandTPApply(spatialDec *self, const SPATIAL_BS_FRAME *frame); +-void subbandTPDestroy(HANDLE_STP_DEC *hStpDec); +- +-#endif +diff --git a/libSACdec/src/sac_tsd.cpp b/libSACdec/src/sac_tsd.cpp +deleted file mode 100644 +index 30acca8..0000000 +--- a/libSACdec/src/sac_tsd.cpp ++++ /dev/null +@@ -1,353 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC MPS212 Transient Steering Decorrelator (TSD) +- +-*******************************************************************************/ +- +-#include "sac_tsd.h" +- +-#define TSD_START_BAND (7) +-#define SIZE_S (4) +-#define SIZE_C (5) +- +-/*** Tables ***/ +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const UCHAR nBitsTsdCW_32slots[32] = { +- 5, 9, 13, 16, 18, 20, 22, 24, 25, 26, 27, 28, 29, 29, 30, 30, +- 30, 29, 29, 28, 27, 26, 25, 24, 22, 20, 18, 16, 13, 9, 5, 0}; +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const UCHAR nBitsTsdCW_64slots[64] = { +- 6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49, +- 51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61, +- 61, 61, 61, 60, 60, 60, 59, 58, 58, 57, 56, 55, 53, 52, 51, 49, +- 48, 46, 44, 42, 40, 38, 35, 33, 30, 27, 23, 20, 16, 11, 6, 0}; +- +-RAM_ALIGN +-LNK_SECTION_CONSTDATA +-static const FIXP_STP phiTsd[8] = { +- STCP(0x7fffffff, 0x00000000), STCP(0x5a82799a, 0x5a82799a), +- STCP(0x00000000, 0x7fffffff), STCP(0xa57d8666, 0x5a82799a), +- STCP(0x80000000, 0x00000000), STCP(0xa57d8666, 0xa57d8666), +- STCP(0x00000000, 0x80000000), STCP(0x5a82799a, 0xa57d8666), +-}; +- +-/*** Static Functions ***/ +-static void longmult1(USHORT a[], USHORT b, USHORT d[], int len) { +- int k; +- ULONG tmp; +- ULONG b0 = (ULONG)b; +- +- tmp = ((ULONG)a[0]) * b0; +- d[0] = (USHORT)tmp; +- +- for (k = 1; k < len; k++) { +- tmp = (tmp >> 16) + ((ULONG)a[k]) * b0; +- d[k] = (USHORT)tmp; +- } +-} +- +-static void longdiv(USHORT b[], USHORT a, USHORT d[], USHORT *pr, int len) { +- ULONG r; +- ULONG tmp; +- int k; +- +- FDK_ASSERT(a != 0); +- +- r = 0; +- +- for (k = len - 1; k >= 0; k--) { +- tmp = ((ULONG)b[k]) + (r << 16); +- +- if (tmp) { +- d[k] = (USHORT)(tmp / a); +- r = tmp - d[k] * a; +- } else { +- d[k] = 0; +- } +- } +- *pr = (USHORT)r; +-} +- +-static void longsub(USHORT a[], USHORT b[], int lena, int lenb) { +- int h; +- LONG carry = 0; +- +- FDK_ASSERT(lena >= lenb); +- for (h = 0; h < lenb; h++) { +- carry += ((LONG)a[h]) - ((LONG)b[h]); +- a[h] = (USHORT)carry; +- carry = carry >> 16; +- } +- +- for (; h < lena; h++) { +- carry = ((LONG)a[h]) + carry; +- a[h] = (USHORT)carry; +- carry = carry >> 16; +- } +- +- FDK_ASSERT(carry == +- 0); /* carry != 0 indicates subtraction underflow, e.g. b > a */ +- return; +-} +- +-static int longcompare(USHORT a[], USHORT b[], int len) { +- int i; +- +- for (i = len - 1; i > 0; i--) { +- if (a[i] != b[i]) break; +- } +- return (a[i] >= b[i]) ? 1 : 0; +-} +- +-FDK_INLINE int isTrSlot(const TSD_DATA *pTsdData, const int ts) { +- return (pTsdData->bsTsdTrPhaseData[ts] >= 0); +-} +- +-/*** Public Functions ***/ +-int TsdRead(HANDLE_FDK_BITSTREAM hBs, const int numSlots, TSD_DATA *pTsdData) { +- int nBitsTrSlots = 0; +- int bsTsdNumTrSlots; +- const UCHAR *nBitsTsdCW_tab = NULL; +- +- switch (numSlots) { +- case 32: +- nBitsTrSlots = 4; +- nBitsTsdCW_tab = nBitsTsdCW_32slots; +- break; +- case 64: +- nBitsTrSlots = 5; +- nBitsTsdCW_tab = nBitsTsdCW_64slots; +- break; +- default: +- return 1; +- } +- +- /*** Read TempShapeData for bsTempShapeConfig == 3 ***/ +- pTsdData->bsTsdEnable = FDKreadBit(hBs); +- if (!pTsdData->bsTsdEnable) { +- return 0; +- } +- +- /*** Parse/Decode TsdData() ***/ +- pTsdData->numSlots = numSlots; +- +- bsTsdNumTrSlots = FDKreadBits(hBs, nBitsTrSlots); +- +- /* Decode transient slot positions */ +- { +- int nBitsTsdCW = (int)nBitsTsdCW_tab[bsTsdNumTrSlots]; +- SCHAR *phaseData = pTsdData->bsTsdTrPhaseData; +- int p = bsTsdNumTrSlots + 1; +- int k, h; +- USHORT s[SIZE_S] = {0}; +- USHORT c[SIZE_C] = {0}; +- USHORT r[1]; +- +- /* Init with TsdSepData[k] = 0 */ +- for (k = 0; k < numSlots; k++) { +- phaseData[k] = -1; /* means TsdSepData[] = 0 */ +- } +- +- for (h = (SIZE_S - 1); h >= 0; h--) { +- if (nBitsTsdCW > h * 16) { +- s[h] = (USHORT)FDKreadBits(hBs, nBitsTsdCW - h * 16); +- nBitsTsdCW = h * 16; +- } +- } +- +- /* c = prod_{h=1}^{p} (k-p+h)/h */ +- k = numSlots - 1; +- c[0] = k - p + 1; +- for (h = 2; h <= p; h++) { +- longmult1(c, (k - p + h), c, 5); /* c *= k - p + h; */ +- longdiv(c, h, c, r, 5); /* c /= h; */ +- FDK_ASSERT(*r == 0); +- } +- +- /* go through all slots */ +- for (; k >= 0; k--) { +- if (p > k) { +- for (; k >= 0; k--) { +- phaseData[k] = 1; /* means TsdSepData[] = 1 */ +- } +- break; +- } +- if (longcompare(s, c, 4)) { /* (s >= c) */ +- longsub(s, c, 4, 4); /* s -= c; */ +- phaseData[k] = 1; /* means TsdSepData[] = 1 */ +- if (p == 1) { +- break; +- } +- /* Update c for next iteration: c_new = c_old * p / k */ +- longmult1(c, p, c, 5); +- p--; +- } else { +- /* Update c for next iteration: c_new = c_old * (k-p) / k */ +- longmult1(c, (k - p), c, 5); +- } +- longdiv(c, k, c, r, 5); +- FDK_ASSERT(*r == 0); +- } +- +- /* Read phase data */ +- for (k = 0; k < numSlots; k++) { +- if (phaseData[k] == 1) { +- phaseData[k] = FDKreadBits(hBs, 3); +- } +- } +- } +- +- return 0; +-} +- +-void TsdGenerateNonTr(const int numHybridBands, const TSD_DATA *pTsdData, +- const int ts, FIXP_DBL *pVdirectReal, +- FIXP_DBL *pVdirectImag, FIXP_DBL *pVnonTrReal, +- FIXP_DBL *pVnonTrImag, FIXP_DBL **ppDecorrInReal, +- FIXP_DBL **ppDecorrInImag) { +- int k = 0; +- +- if (!isTrSlot(pTsdData, ts)) { +- /* Let allpass based decorrelator read from direct input. */ +- *ppDecorrInReal = pVdirectReal; +- *ppDecorrInImag = pVdirectImag; +- return; +- } +- +- /* Generate nonTr input signal for allpass based decorrelator */ +- for (; k < TSD_START_BAND; k++) { +- pVnonTrReal[k] = pVdirectReal[k]; +- pVnonTrImag[k] = pVdirectImag[k]; +- } +- for (; k < numHybridBands; k++) { +- pVnonTrReal[k] = (FIXP_DBL)0; +- pVnonTrImag[k] = (FIXP_DBL)0; +- } +- *ppDecorrInReal = pVnonTrReal; +- *ppDecorrInImag = pVnonTrImag; +-} +- +-void TsdApply(const int numHybridBands, const TSD_DATA *pTsdData, int *pTsdTs, +- const FIXP_DBL *pVdirectReal, const FIXP_DBL *pVdirectImag, +- FIXP_DBL *pDnonTrReal, FIXP_DBL *pDnonTrImag) { +- const int ts = *pTsdTs; +- +- if (isTrSlot(pTsdData, ts)) { +- int k; +- const FIXP_STP *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]]; +- FDK_ASSERT((pTsdData->bsTsdTrPhaseData[ts] >= 0) && +- (pTsdData->bsTsdTrPhaseData[ts] < 8)); +- +- /* d = d_nonTr + v_direct * exp(j * bsTsdTrPhaseData[ts]/4 * pi ) */ +- for (k = TSD_START_BAND; k < numHybridBands; k++) { +- FIXP_DBL tempReal, tempImag; +- cplxMult(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k], *phi); +- pDnonTrReal[k] += tempReal; +- pDnonTrImag[k] += tempImag; +- } +- } +- +- /* The modulo MAX_TSD_TIME_SLOTS operation is to avoid illegal memory accesses +- * in case of errors. */ +- *pTsdTs = (ts + 1) & (MAX_TSD_TIME_SLOTS - 1); +- return; +-} +diff --git a/libSACdec/src/sac_tsd.h b/libSACdec/src/sac_tsd.h +deleted file mode 100644 +index 2521e27..0000000 +--- a/libSACdec/src/sac_tsd.h ++++ /dev/null +@@ -1,167 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround decoder library ************************* +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC MPS212 Transient Steering Decorrelator (TSD) +- +-*******************************************************************************/ +- +-#ifndef SAC_TSD_H +-#define SAC_TSD_H +- +-#include "FDK_bitstream.h" +-#include "common_fix.h" +- +-#define MAX_TSD_TIME_SLOTS (64) +- +-/** Structure which holds the data needed to apply TSD to current frame. */ +-typedef struct { +- UCHAR bsTsdEnable; /**< for current frame TSD is (0:disabled, 1:enabled) */ +- UCHAR numSlots; /**< total number of QMF slots per frame */ +- SCHAR +- bsTsdTrPhaseData[MAX_TSD_TIME_SLOTS]; /**< -1 => TsdSepData[ts]=0; 0-7: +- values of bsTsdTrPhaseData[ts] +- and TsdSepData[ts]=1 */ +-} TSD_DATA; +- +-FDK_INLINE int isTsdActive(const TSD_DATA *pTsdData) { +- return (int)pTsdData->bsTsdEnable; +-} +- +-/** +- * \brief Parse and Decode TSD data. +- * \param[in] hBs bitstream handle to read data from. +- * \param[in] numSlots number of QMF slots per frame. +- * \param[out] pTsdData pointer to TSD data structure. +- * \return 0 on succes, 1 on error. +- */ +-int TsdRead(HANDLE_FDK_BITSTREAM hBs, const int numSlots, TSD_DATA *pTsdData); +- +-/** +- * \brief Perform transient seperation (v_{x,nonTr} signal). +- * \param[in] numHybridBands number of hybrid bands. +- * \param[in] pTsdData pointer to TSD data structure. +- * \param[in] pVdirectReal pointer to array with direct signal. +- * \param[in] pVdirectImag pointer to array with direct signal. +- * \param[out] pVnonTrReal pointer to array with nonTr signal. +- * \param[out] pVnonTrImag pointer to array with nonTr signal. +- * \param[out] ppDecorrInReal handle to array where allpass based decorrelator +- * should read from (modified by this function). +- * \param[out] ppDecorrInImag handle to array where allpass based decorrelator +- * should read from (modified by this function). +- */ +-void TsdGenerateNonTr(const int numHybridBands, const TSD_DATA *pTsdData, +- const int ts, FIXP_DBL *pVdirectReal, +- FIXP_DBL *pVdirectImag, FIXP_DBL *pVnonTrReal, +- FIXP_DBL *pVnonTrImag, FIXP_DBL **ppDecorrInReal, +- FIXP_DBL **ppDecorrInImag); +- +-/** +- * \brief Generate d_{x,Tr} signal and add to d_{x,nonTr} signal +- * \param[in] numHybridBands +- * \param[in,out] pTsdData +- * \param pTsdTs pointer to persistent time slot counter +- * \param[in] pVdirectReal +- * \param[in] pVdirectImag +- * \param[out] pDnonTrReal +- * \param[out] pDnonTrImag +- */ +-void TsdApply(const int numHybridBands, const TSD_DATA *pTsdData, int *pTsdTs, +- const FIXP_DBL *pVdirectReal, const FIXP_DBL *pVdirectImag, +- FIXP_DBL *pDnonTrReal, FIXP_DBL *pDnonTrImag); +- +-#endif /* #ifndef SAC_TSD_H */ +diff --git a/libSACenc/include/sacenc_lib.h b/libSACenc/include/sacenc_lib.h +deleted file mode 100644 +index 758cc0f..0000000 +--- a/libSACenc/include/sacenc_lib.h ++++ /dev/null +@@ -1,405 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Encoder API +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- ******************************************************************************/ +- +-#ifndef SACENC_LIB_H +-#define SACENC_LIB_H +- +-/* Includes ******************************************************************/ +-#include "machine_type.h" +-#include "FDK_audio.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +- +-/** +- * Space encoder error codes. +- */ +-typedef enum { +- SACENC_OK = 0x00000000, /*!< No error happened. All fine. */ +- SACENC_INVALID_HANDLE = +- 0x00000080, /*!< Handle passed to function call was invalid. */ +- SACENC_MEMORY_ERROR = 0x00000800, /*!< Memory allocation failed. */ +- SACENC_INIT_ERROR = 0x00008000, /*!< General initialization error. */ +- SACENC_ENCODE_ERROR = +- 0x00080000, /*!< The encoding process was interrupted by an unexpected +- error. */ +- SACENC_PARAM_ERROR = 0x00800000, /*!< Invalid runtime parameter. */ +- SACENC_UNSUPPORTED_PARAMETER = 0x00800001, /*!< Parameter not available. */ +- SACENC_INVALID_CONFIG = 0x00800002, /*!< Configuration not provided. */ +- SACENC_UNKNOWN_ERROR = 0x08000000 /*!< Unknown error. */ +- +-} FDK_SACENC_ERROR; +- +-typedef enum { +- SACENC_INVALID_MODE = 0, +- SACENC_212 = 8, +- SACENC_ESCAPE = 15 +- +-} MP4SPACEENC_MODE; +- +-typedef enum { +- SACENC_BANDS_INVALID = 0, +- SACENC_BANDS_4 = 4, +- SACENC_BANDS_5 = 5, +- SACENC_BANDS_7 = 7, +- SACENC_BANDS_9 = 9, +- SACENC_BANDS_12 = 12, +- SACENC_BANDS_15 = 15, +- SACENC_BANDS_23 = 23 +- +-} MP4SPACEENC_BANDS_CONFIG; +- +-typedef enum { +- SACENC_QUANTMODE_INVALID = -1, +- SACENC_QUANTMODE_FINE = 0, +- SACENC_QUANTMODE_EBQ1 = 1, +- SACENC_QUANTMODE_EBQ2 = 2, +- SACENC_QUANTMODE_RSVD3 = 3 +- +-} MP4SPACEENC_QUANTMODE; +- +-typedef enum { +- SACENC_DMXGAIN_INVALID = -1, +- SACENC_DMXGAIN_0_dB = 0, +- SACENC_DMXGAIN_1_5_dB = 1, +- SACENC_DMXGAIN_3_dB = 2, +- SACENC_DMXGAIN_4_5_dB = 3, +- SACENC_DMXGAIN_6_dB = 4, +- SACENC_DMXGAIN_7_5_dB = 5, +- SACENC_DMXGAIN_9_dB = 6, +- SACENC_DMXGAIN_12_dB = 7 +- +-} MP4SPACEENC_DMX_GAIN; +- +-/** +- * \brief Space Encoder setting parameters. +- * +- * Use FDK_sacenc_setParam() function to configure the internal status of the +- * following parameters. +- */ +-typedef enum { +- SACENC_LOWDELAY, /*!< Configure lowdelay MPEG Surround. +- - 0: Disable Lowdelay. (default) +- - 1: Enable Lowdelay. +- - 2: Enable Lowdelay including keep frame. */ +- +- SACENC_ENC_MODE, /*!< Configure encoder tree mode. See ::MP4SPACEENC_MODE for +- available values. */ +- +- SACENC_SAMPLERATE, /*!< Configure encoder sampling rate. */ +- +- SACENC_FRAME_TIME_SLOTS, /*!< Configure number of slots per spatial frame. */ +- +- SACENC_PARAM_BANDS, /*!< Configure number of parameter bands. See +- ::MP4SPACEENC_BANDS_CONFIG for available values. */ +- +- SACENC_TIME_DOM_DMX, /*!< Configure time domain downmix. +- - 0: No time domain downmix. (default) +- - 1: Static time domain downmix. +- - 2: Enhanced time domain downmix, stereo to mono +- only. */ +- +- SACENC_DMX_GAIN, /*!< Configure downmix gain. See ::MP4SPACEENC_DMX_GAIN for +- available values. */ +- +- SACENC_COARSE_QUANT, /*!< Use coarse parameter quantization. +- - 0: No (default) +- - 1: Yes */ +- +- SACENC_QUANT_MODE, /*!< Configure quanitzation mode. See +- ::MP4SPACEENC_QUANTMODE for available values. */ +- +- SACENC_TIME_ALIGNMENT, /*!< Configure time alignment in samples. */ +- +- SACENC_INDEPENDENCY_COUNT, /*!< Configure the independency count. (count == 0 +- means independencyFlag == 1) */ +- +- SACENC_INDEPENDENCY_FACTOR, /*!< How often should we set the independency flag +- */ +- +- SACENC_NONE /*!< ------ */ +- +-} SPACEENC_PARAM; +- +-/** +- * Describes Spatial Specific Config. +- */ +-typedef struct { +- INT nSscSizeBits; /*!< Number of valid bits in pSsc buffer. */ +- UCHAR *pSsc; /*!< SpatialSpecificConfig buffer in binary format. */ +- +-} MPEG4SPACEENC_SSCBUF; +- +-/** +- * Provides some info about the encoder configuration. +- */ +-typedef struct { +- INT nSampleRate; /*!< Configured sampling rate.*/ +- INT nSamplesFrame; /*!< Frame length in samples. */ +- INT nTotalInputChannels; /*!< Number of expected audio input channels. */ +- INT nDmxDelay; /*!< Delay of the downmixed signal. */ +- INT nCodecDelay; /*!< Delay of the whole en-/decoded signal, including +- core-coder delay. */ +- INT nDecoderDelay; /*!< Delay added by the MP4SPACE decoder. */ +- INT nPayloadDelay; /*!< Delay of the payload. */ +- INT nDiscardOutFrames; /*!< Number of dmx frames to discard for alignment with +- bitstream. */ +- +- MPEG4SPACEENC_SSCBUF +- *pSscBuf; /*!< Pointer to Spatial Specific Config structure. */ +- +-} MP4SPACEENC_INFO; +- +-/** +- * MPEG Surround encoder handle. +- */ +-typedef struct MP4SPACE_ENCODER *HANDLE_MP4SPACE_ENCODER; +- +-/** +- * Defines the input arguments for a FDK_sacenc_encode() call. +- */ +-typedef struct { +- INT nInputSamples; /*!< Number of valid input audio samples (multiple of input +- channels). */ +- UINT inputBufferSizePerChannel; /*!< Size of input buffer (input audio +- samples) per channel. */ +- UINT isInputInterleaved; /*!< Indicates if input audio samples are represented +- in blocks or interleaved: +- - 0 : in blocks. +- - 1 : interleaved. */ +- +-} SACENC_InArgs; +- +-/** +- * Defines the output arguments for a FDK_sacenc_encode() call. +- */ +-typedef struct { +- INT nOutputBits; /*!< Number of valid payload bits generated during +- FDK_sacenc_encode(). */ +- INT nOutputSamples; /*!< Number of valid output audio samples generated during +- FDK_sacenc_encode(). */ +- UINT nSamplesConsumed; /*!< Number of input audio samples consumed in +- FDK_sacenc_encode(). */ +- +-} SACENC_OutArgs; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/** +- * \brief Opens a new instace of the MPEG Surround encoder. +- * +- * \param phMp4SpaceEnc Pointer to the encoder handle to be deallocated. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, SACENC_MEMORY_ERROR, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_open(HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc); +- +-/** +- * \brief Finalizes opening process of MPEG Surround encoder. +- * +- * Shows, how many samples are needed as input +- * +- * \param hMp4SpaceEnc A valid MPEG Surround encoder handle. +- * \param dmxDelay Downmix delay. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, SACENC_INIT_ERROR, SACENC_INVALID_CONFIG, +- * on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_init(HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- const INT dmxDelay); +- +-/** +- * \brief Close the MPEG Surround encoder instance. +- * +- * Deallocate encoder instance and free whole memory. +- * +- * \param phMp4SpaceEnc Pointer to the encoder handle to be deallocated. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_close(HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc); +- +-/** +- * \brief MPEG surround parameter extraction, framwise. +- * +- * \param hMp4SpaceEnc A valid MPEG Surround encoder handle. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_encode(const HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- const FDK_bufDescr *inBufDesc, +- const FDK_bufDescr *outBufDesc, +- const SACENC_InArgs *inargs, +- SACENC_OutArgs *outargs); +- +-/** +- * \brief Provides information on produced bitstream. +- * +- * \param hMp4SpaceEnc A valid MPEG Surround encoder handle. +- * \param pInfo Pointer to an encoder info struct, filled on +- * return. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_getInfo(const HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- MP4SPACEENC_INFO *const pInfo); +- +-/** +- * \brief Set one single MPEG Surround encoder parameter. +- * +- * This function allows configuration of all encoder parameters specified in +- * ::SPACEENC_PARAM. Each parameter must be set with a separate function call. +- * An internal validation of the configuration value range will be done. +- * +- * \param hMp4SpaceEnc A valid MPEG Surround encoder handle. +- * \param param Parameter to be set. See ::SPACEENC_PARAM. +- * \param value Parameter value. See parameter description in +- * ::SPACEENC_PARAM. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, SACENC_UNSUPPORTED_PARAMETER, +- * SACENC_INVALID_CONFIG, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_setParam(HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- const SPACEENC_PARAM param, +- const UINT value); +- +-/** +- * \brief Get information about MPEG Surround encoder library build. +- * +- * Fill a given LIB_INFO structure with library version information. +- * +- * \param info Pointer to an allocated LIB_INFO struct. +- * +- * \return +- * - SACENC_OK, on success. +- * - SACENC_INVALID_HANDLE, SACENC_INIT_ERROR, on failure. +- */ +-FDK_SACENC_ERROR FDK_sacenc_getLibInfo(LIB_INFO *info); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif /* SACENC_LIB_H */ +diff --git a/libSACenc/src/sacenc_bitstream.cpp b/libSACenc/src/sacenc_bitstream.cpp +deleted file mode 100644 +index dacfc27..0000000 +--- a/libSACenc/src/sacenc_bitstream.cpp ++++ /dev/null +@@ -1,826 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): +- +- Description: Encoder Library Interface +- Bitstream Writer +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_bitstream.h" +-#include "sacenc_const.h" +- +-#include "genericStds.h" +-#include "common_fix.h" +- +-#include "FDK_matrixCalloc.h" +-#include "sacenc_nlc_enc.h" +- +-/* Defines *******************************************************************/ +-#define MAX_FREQ_RES_INDEX 8 +-#define MAX_SAMPLING_FREQUENCY_INDEX 13 +-#define SAMPLING_FREQUENCY_INDEX_ESCAPE 15 +- +-/* Data Types ****************************************************************/ +-typedef struct { +- SCHAR cld_old[SACENC_MAX_NUM_BOXES][MAX_NUM_BINS]; +- SCHAR icc_old[SACENC_MAX_NUM_BOXES][MAX_NUM_BINS]; +- UCHAR quantCoarseCldPrev[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- UCHAR quantCoarseIccPrev[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- +-} PREV_OTTDATA; +- +-typedef struct { +- PREV_OTTDATA prevOttData; +- +-} STATIC_SPATIALFRAME; +- +-typedef struct BSF_INSTANCE { +- SPATIALSPECIFICCONFIG spatialSpecificConfig; +- SPATIALFRAME frame; +- STATIC_SPATIALFRAME prevFrameData; +- +-} BSF_INSTANCE; +- +-/* Constants *****************************************************************/ +-static const INT SampleRateTable[MAX_SAMPLING_FREQUENCY_INDEX] = { +- 96000, 88200, 64000, 48000, 44100, 32000, 24000, +- 22050, 16000, 12000, 11025, 8000, 7350}; +- +-static const UCHAR FreqResBinTable_LD[MAX_FREQ_RES_INDEX] = {0, 23, 15, 12, +- 9, 7, 5, 4}; +-static const UCHAR FreqResStrideTable_LD[] = {1, 2, 5, 23}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static FDK_SACENC_ERROR DuplicateLosslessData( +- const INT startBox, const INT stopBox, +- const LOSSLESSDATA *const hLosslessDataFrom, const INT setFrom, +- LOSSLESSDATA *const hLosslessDataTo, const INT setTo) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hLosslessDataFrom) || (NULL == hLosslessDataTo)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i; +- +- for (i = startBox; i < stopBox; i++) { +- hLosslessDataTo->bsXXXDataMode[i][setTo] = +- hLosslessDataFrom->bsXXXDataMode[i][setFrom]; +- hLosslessDataTo->bsDataPair[i][setTo] = +- hLosslessDataFrom->bsDataPair[i][setFrom]; +- hLosslessDataTo->bsQuantCoarseXXX[i][setTo] = +- hLosslessDataFrom->bsQuantCoarseXXX[i][setFrom]; +- hLosslessDataTo->bsFreqResStrideXXX[i][setTo] = +- hLosslessDataFrom->bsFreqResStrideXXX[i][setFrom]; +- } +- } +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_duplicateParameterSet( +- const SPATIALFRAME *const hFrom, const INT setFrom, SPATIALFRAME *const hTo, +- const INT setTo) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hFrom) || (NULL == hTo)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int box; +- /* Only Copy Parameter Set selective stuff */ +- +- /* OTT-Data */ +- for (box = 0; box < SACENC_MAX_NUM_BOXES; box++) { +- FDKmemcpy(hTo->ottData.cld[box][setTo], hFrom->ottData.cld[box][setFrom], +- sizeof(hFrom->ottData.cld[0][0])); +- FDKmemcpy(hTo->ottData.icc[box][setTo], hFrom->ottData.icc[box][setFrom], +- sizeof(hFrom->ottData.icc[0][0])); +- } +- +- /* LOSSLESSDATA */ +- DuplicateLosslessData(0, SACENC_MAX_NUM_BOXES, &hFrom->CLDLosslessData, +- setFrom, &hTo->CLDLosslessData, setTo); +- DuplicateLosslessData(0, SACENC_MAX_NUM_BOXES, &hFrom->ICCLosslessData, +- setFrom, &hTo->ICCLosslessData, setTo); +- +- } /* valid handle */ +- +- return error; +-} +- +-/* set frame defaults */ +-static void clearFrame(SPATIALFRAME *const pFrame) { +- FDKmemclear(pFrame, sizeof(SPATIALFRAME)); +- +- pFrame->bsIndependencyFlag = 1; +- pFrame->framingInfo.numParamSets = 1; +-} +- +-static void fine2coarse(SCHAR *const data, const DATA_TYPE dataType, +- const INT startBand, const INT numBands) { +- int i; +- if (dataType == t_CLD) { +- for (i = startBand; i < startBand + numBands; i++) { +- data[i] /= 2; +- } +- } else { +- for (i = startBand; i < startBand + numBands; i++) { +- data[i] >>= 1; +- } +- } +-} +- +-static void coarse2fine(SCHAR *const data, const DATA_TYPE dataType, +- const INT startBand, const INT numBands) { +- int i; +- +- for (i = startBand; i < startBand + numBands; i++) { +- data[i] <<= 1; +- } +- +- if (dataType == t_CLD) { +- for (i = startBand; i < startBand + numBands; i++) { +- if (data[i] == -14) { +- data[i] = -15; +- } else if (data[i] == 14) { +- data[i] = 15; +- } +- } +- } /* (dataType == t_CLD) */ +-} +- +-static UCHAR getBsFreqResStride(const INT index) { +- const UCHAR *pFreqResStrideTable = NULL; +- int freqResStrideTableSize = 0; +- +- pFreqResStrideTable = FreqResStrideTable_LD; +- freqResStrideTableSize = +- sizeof(FreqResStrideTable_LD) / sizeof(*FreqResStrideTable_LD); +- +- return (((NULL != pFreqResStrideTable) && (index >= 0) && +- (index < freqResStrideTableSize)) +- ? pFreqResStrideTable[index] +- : 1); +-} +- +-/* write data to bitstream */ +-static void ecData(HANDLE_FDK_BITSTREAM bitstream, +- SCHAR data[MAX_NUM_PARAMS][MAX_NUM_BINS], +- SCHAR oldData[MAX_NUM_BINS], +- UCHAR quantCoarseXXXprev[MAX_NUM_PARAMS], +- LOSSLESSDATA *const losslessData, const DATA_TYPE dataType, +- const INT paramIdx, const INT numParamSets, +- const INT independencyFlag, const INT startBand, +- const INT stopBand, const INT defaultValue) { +- int ps, pb, strOffset, pbStride, dataBands, i; +- int aStrides[MAX_NUM_BINS + 1] = {0}; +- SHORT cmpIdxData[2][MAX_NUM_BINS] = {{0}}; +- SHORT cmpOldData[MAX_NUM_BINS] = {0}; +- +- /* bsXXXDataMode */ +- if (independencyFlag || (losslessData->bsQuantCoarseXXX[paramIdx][0] != +- quantCoarseXXXprev[paramIdx])) { +- losslessData->bsXXXDataMode[paramIdx][0] = FINECOARSE; +- } else { +- losslessData->bsXXXDataMode[paramIdx][0] = KEEP; +- for (i = startBand; i < stopBand; i++) { +- if (data[0][i] != oldData[i]) { +- losslessData->bsXXXDataMode[paramIdx][0] = FINECOARSE; +- break; +- } +- } +- } +- +- FDKwriteBits(bitstream, losslessData->bsXXXDataMode[paramIdx][0], 2); +- +- for (ps = 1; ps < numParamSets; ps++) { +- if (losslessData->bsQuantCoarseXXX[paramIdx][ps] != +- losslessData->bsQuantCoarseXXX[paramIdx][ps - 1]) { +- losslessData->bsXXXDataMode[paramIdx][ps] = FINECOARSE; +- } else { +- losslessData->bsXXXDataMode[paramIdx][ps] = KEEP; +- for (i = startBand; i < stopBand; i++) { +- if (data[ps][i] != data[ps - 1][i]) { +- losslessData->bsXXXDataMode[paramIdx][ps] = FINECOARSE; +- break; +- } +- } +- } +- +- FDKwriteBits(bitstream, losslessData->bsXXXDataMode[paramIdx][ps], 2); +- } /* for ps */ +- +- /* Create data pairs if possible */ +- for (ps = 0; ps < (numParamSets - 1); ps++) { +- if (losslessData->bsXXXDataMode[paramIdx][ps] == FINECOARSE) { +- /* Check if next parameter set is FINCOARSE */ +- if (losslessData->bsXXXDataMode[paramIdx][ps + 1] == FINECOARSE) { +- /* We have to check if ps and ps+1 use the same bsXXXQuantMode */ +- /* and also have the same stride */ +- if ((losslessData->bsQuantCoarseXXX[paramIdx][ps + 1] == +- losslessData->bsQuantCoarseXXX[paramIdx][ps]) && +- (losslessData->bsFreqResStrideXXX[paramIdx][ps + 1] == +- losslessData->bsFreqResStrideXXX[paramIdx][ps])) { +- losslessData->bsDataPair[paramIdx][ps] = 1; +- losslessData->bsDataPair[paramIdx][ps + 1] = 1; +- +- /* We have a data pair -> Jump to the ps after next ps*/ +- ps++; +- continue; +- } +- } +- /* dataMode of next ps is not FINECOARSE or does not use the same +- * bsXXXQuantMode/stride */ +- /* -> no dataPair possible */ +- losslessData->bsDataPair[paramIdx][ps] = 0; +- +- /* Initialize ps after next ps to Zero (only important for the last +- * parameter set) */ +- losslessData->bsDataPair[paramIdx][ps + 1] = 0; +- } else { +- /* No FINECOARSE -> no data pair possible */ +- losslessData->bsDataPair[paramIdx][ps] = 0; +- +- /* Initialize ps after next ps to Zero (only important for the last +- * parameter set) */ +- losslessData->bsDataPair[paramIdx][ps + 1] = 0; +- } +- } /* for ps */ +- +- for (ps = 0; ps < numParamSets; ps++) { +- if (losslessData->bsXXXDataMode[paramIdx][ps] == DEFAULT) { +- /* Prepare old data */ +- for (i = startBand; i < stopBand; i++) { +- oldData[i] = defaultValue; +- } +- quantCoarseXXXprev[paramIdx] = 0; /* Default data are always fine */ +- } +- +- if (losslessData->bsXXXDataMode[paramIdx][ps] == FINECOARSE) { +- FDKwriteBits(bitstream, losslessData->bsDataPair[paramIdx][ps], 1); +- FDKwriteBits(bitstream, losslessData->bsQuantCoarseXXX[paramIdx][ps], 1); +- FDKwriteBits(bitstream, losslessData->bsFreqResStrideXXX[paramIdx][ps], +- 2); +- +- if (losslessData->bsQuantCoarseXXX[paramIdx][ps] != +- quantCoarseXXXprev[paramIdx]) { +- if (quantCoarseXXXprev[paramIdx]) { +- coarse2fine(oldData, dataType, startBand, stopBand - startBand); +- } else { +- fine2coarse(oldData, dataType, startBand, stopBand - startBand); +- } +- } +- +- /* Handle strides */ +- pbStride = +- getBsFreqResStride(losslessData->bsFreqResStrideXXX[paramIdx][ps]); +- dataBands = (stopBand - startBand - 1) / pbStride + 1; +- +- aStrides[0] = startBand; +- for (pb = 1; pb <= dataBands; pb++) { +- aStrides[pb] = aStrides[pb - 1] + pbStride; +- } +- +- strOffset = 0; +- while (aStrides[dataBands] > stopBand) { +- if (strOffset < dataBands) { +- strOffset++; +- } +- for (i = strOffset; i <= dataBands; i++) { +- aStrides[i]--; +- } +- } /* while */ +- +- for (pb = 0; pb < dataBands; pb++) { +- cmpOldData[startBand + pb] = oldData[aStrides[pb]]; +- cmpIdxData[0][startBand + pb] = data[ps][aStrides[pb]]; +- +- if (losslessData->bsDataPair[paramIdx][ps]) { +- cmpIdxData[1][startBand + pb] = data[ps + 1][aStrides[pb]]; +- } +- } /* for pb*/ +- +- /* Finally encode */ +- if (losslessData->bsDataPair[paramIdx][ps]) { +- fdk_sacenc_ecDataPairEnc(bitstream, cmpIdxData, cmpOldData, dataType, 0, +- startBand, dataBands, +- losslessData->bsQuantCoarseXXX[paramIdx][ps], +- independencyFlag && (ps == 0)); +- } else { +- fdk_sacenc_ecDataSingleEnc(bitstream, cmpIdxData, cmpOldData, dataType, +- 0, startBand, dataBands, +- losslessData->bsQuantCoarseXXX[paramIdx][ps], +- independencyFlag && (ps == 0)); +- } +- +- /* Overwrite old data */ +- for (i = startBand; i < stopBand; i++) { +- if (losslessData->bsDataPair[paramIdx][ps]) { +- oldData[i] = data[ps + 1][i]; +- } else { +- oldData[i] = data[ps][i]; +- } +- } +- +- quantCoarseXXXprev[paramIdx] = +- losslessData->bsQuantCoarseXXX[paramIdx][ps]; +- +- /* Jump forward if we have encoded a data pair */ +- if (losslessData->bsDataPair[paramIdx][ps]) { +- ps++; +- } +- +- } /* if (losslessData->bsXXXDataMode[paramIdx][ps] == FINECOARSE ) */ +- } /* for ps */ +-} +- +-/****************************************************************************/ +-/* Bitstream formatter interface functions */ +-/****************************************************************************/ +-static FDK_SACENC_ERROR getBsFreqResIndex(const INT numBands, +- INT *const pbsFreqResIndex) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pbsFreqResIndex) { +- error = SACENC_INVALID_HANDLE; +- } else { +- const UCHAR *pFreqResBinTable = FreqResBinTable_LD; +- int i; +- *pbsFreqResIndex = -1; +- +- for (i = 0; i < MAX_FREQ_RES_INDEX; i++) { +- if (numBands == pFreqResBinTable[i]) { +- *pbsFreqResIndex = i; +- break; +- } +- } +- if (*pbsFreqResIndex < 0 || *pbsFreqResIndex >= MAX_FREQ_RES_INDEX) { +- error = SACENC_INVALID_CONFIG; +- } +- } +- return error; +-} +- +-static FDK_SACENC_ERROR getSamplingFrequencyIndex( +- const INT bsSamplingFrequency, INT *const pbsSamplingFrequencyIndex) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pbsSamplingFrequencyIndex) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i; +- *pbsSamplingFrequencyIndex = SAMPLING_FREQUENCY_INDEX_ESCAPE; +- +- for (i = 0; i < MAX_SAMPLING_FREQUENCY_INDEX; i++) { +- if (bsSamplingFrequency == SampleRateTable[i]) { /*spatial sampling rate*/ +- *pbsSamplingFrequencyIndex = i; +- break; +- } +- } +- } +- return error; +-} +- +-/* destroy encoder instance */ +-FDK_SACENC_ERROR fdk_sacenc_destroySpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE *selfPtr) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((selfPtr == NULL) || (*selfPtr == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if (*selfPtr != NULL) { +- FDK_FREE_MEMORY_1D(*selfPtr); +- } +- } +- return error; +-} +- +-/* create encoder instance */ +-FDK_SACENC_ERROR fdk_sacenc_createSpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE *selfPtr) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == selfPtr) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* allocate encoder struct */ +- FDK_ALLOCATE_MEMORY_1D(*selfPtr, 1, BSF_INSTANCE); +- } +- return error; +- +-bail: +- fdk_sacenc_destroySpatialBitstreamEncoder(selfPtr); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-/* init encoder instance */ +-FDK_SACENC_ERROR fdk_sacenc_initSpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE selfPtr) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (selfPtr == NULL) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* init/clear */ +- clearFrame(&selfPtr->frame); +- +- } /* valid handle */ +- return error; +-} +- +-/* get SpatialSpecificConfig struct */ +-SPATIALSPECIFICCONFIG *fdk_sacenc_getSpatialSpecificConfig( +- HANDLE_BSF_INSTANCE selfPtr) { +- return ((selfPtr == NULL) ? NULL : &(selfPtr->spatialSpecificConfig)); +-} +- +-/* write SpatialSpecificConfig to stream */ +-FDK_SACENC_ERROR fdk_sacenc_writeSpatialSpecificConfig( +- SPATIALSPECIFICCONFIG *const spatialSpecificConfig, +- UCHAR *const pOutputBuffer, const INT outputBufferSize, +- INT *const pnOutputBits) { +- FDK_SACENC_ERROR error = SACENC_OK; +- INT bsSamplingFrequencyIndex = 0; +- INT bsFreqRes = 0; +- +- if ((spatialSpecificConfig == NULL) || (pOutputBuffer == NULL) || +- (pnOutputBits == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDK_BITSTREAM bitstream; +- +- /* Find FreqRes */ +- if (SACENC_OK != (error = getBsFreqResIndex(spatialSpecificConfig->numBands, +- &bsFreqRes))) +- goto bail; +- +- /* Find SamplingFrequencyIndex */ +- if (SACENC_OK != (error = getSamplingFrequencyIndex( +- spatialSpecificConfig->bsSamplingFrequency, +- &bsSamplingFrequencyIndex))) +- goto bail; +- +- /* bind extern buffer to bitstream handle */ +- FDKinitBitStream(&bitstream, pOutputBuffer, outputBufferSize, 0, BS_WRITER); +- +- /****************************************************************************/ +- /* write to bitstream */ +- +- FDKwriteBits(&bitstream, bsSamplingFrequencyIndex, 4); +- +- if (bsSamplingFrequencyIndex == 15) { +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsSamplingFrequency, 24); +- } +- +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsFrameLength, 5); +- +- FDKwriteBits(&bitstream, bsFreqRes, 3); +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsTreeConfig, 4); +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsQuantMode, 2); +- +- FDKwriteBits(&bitstream, 0, 1); /* bsArbitraryDownmix */ +- +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsFixedGainDMX, 3); +- +- FDKwriteBits(&bitstream, TEMPSHAPE_OFF, 2); +- FDKwriteBits(&bitstream, spatialSpecificConfig->bsDecorrConfig, 2); +- +- FDKbyteAlign(&bitstream, 0); /* byte alignment */ +- +- /* return number of valid bits in bitstream */ +- if ((*pnOutputBits = FDKgetValidBits(&bitstream)) > +- (outputBufferSize * 8)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* terminate buffer with alignment */ +- FDKbyteAlign(&bitstream, 0); +- +- } /* valid handle */ +- +-bail: +- return error; +-} +- +-/* get SpatialFrame struct */ +-SPATIALFRAME *fdk_sacenc_getSpatialFrame(HANDLE_BSF_INSTANCE selfPtr, +- const SPATIALFRAME_TYPE frameType) { +- int idx = -1; +- +- switch (frameType) { +- case READ_SPATIALFRAME: +- case WRITE_SPATIALFRAME: +- idx = 0; +- break; +- default: +- idx = -1; /* invalid configuration */ +- } /* switch frameType */ +- +- return (((selfPtr == NULL) || (idx == -1)) ? NULL : &selfPtr->frame); +-} +- +-static FDK_SACENC_ERROR writeFramingInfo(HANDLE_FDK_BITSTREAM hBitstream, +- const FRAMINGINFO *const pFramingInfo, +- const INT frameLength) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hBitstream == NULL) || (pFramingInfo == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDKwriteBits(hBitstream, pFramingInfo->bsFramingType, 1); +- FDKwriteBits(hBitstream, pFramingInfo->numParamSets - 1, 1); +- +- if (pFramingInfo->bsFramingType) { +- int ps = 0; +- int numParamSets = pFramingInfo->numParamSets; +- +- { +- for (ps = 0; ps < numParamSets; ps++) { +- int bitsParamSlot = 0; +- while ((1 << bitsParamSlot) < (frameLength + 1)) bitsParamSlot++; +- if (bitsParamSlot > 0) +- FDKwriteBits(hBitstream, pFramingInfo->bsParamSlots[ps], +- bitsParamSlot); +- } +- } +- } /* pFramingInfo->bsFramingType */ +- } /* valid handle */ +- +- return error; +-} +- +-static FDK_SACENC_ERROR writeSmgData(HANDLE_FDK_BITSTREAM hBitstream, +- const SMGDATA *const pSmgData, +- const INT numParamSets, +- const INT dataBands) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hBitstream == NULL) || (pSmgData == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i, j; +- +- for (i = 0; i < numParamSets; i++) { +- FDKwriteBits(hBitstream, pSmgData->bsSmoothMode[i], 2); +- +- if (pSmgData->bsSmoothMode[i] >= 2) { +- FDKwriteBits(hBitstream, pSmgData->bsSmoothTime[i], 2); +- } +- if (pSmgData->bsSmoothMode[i] == 3) { +- const int stride = getBsFreqResStride(pSmgData->bsFreqResStride[i]); +- FDKwriteBits(hBitstream, pSmgData->bsFreqResStride[i], 2); +- for (j = 0; j < dataBands; j += stride) { +- FDKwriteBits(hBitstream, pSmgData->bsSmgData[i][j], 1); +- } +- } +- } /* for i */ +- } /* valid handle */ +- +- return error; +-} +- +-static FDK_SACENC_ERROR writeOttData( +- HANDLE_FDK_BITSTREAM hBitstream, PREV_OTTDATA *const pPrevOttData, +- OTTDATA *const pOttData, const OTTCONFIG ottConfig[SACENC_MAX_NUM_BOXES], +- LOSSLESSDATA *const pCLDLosslessData, LOSSLESSDATA *const pICCLosslessData, +- const INT numOttBoxes, const INT numBands, const INT numParamSets, +- const INT bsIndependencyFlag) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hBitstream == NULL) || (pPrevOttData == NULL) || (pOttData == NULL) || +- (ottConfig == NULL) || (pCLDLosslessData == NULL) || +- (pICCLosslessData == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i; +- for (i = 0; i < numOttBoxes; i++) { +- ecData(hBitstream, pOttData->cld[i], pPrevOttData->cld_old[i], +- pPrevOttData->quantCoarseCldPrev[i], pCLDLosslessData, t_CLD, i, +- numParamSets, bsIndependencyFlag, 0, ottConfig[i].bsOttBands, 15); +- } +- { +- for (i = 0; i < numOttBoxes; i++) { +- { +- ecData(hBitstream, pOttData->icc[i], pPrevOttData->icc_old[i], +- pPrevOttData->quantCoarseIccPrev[i], pICCLosslessData, t_ICC, +- i, numParamSets, bsIndependencyFlag, 0, numBands, 0); +- } +- } /* for i */ +- } +- } /* valid handle */ +- +- return error; +-} +- +-/* write extension frame data to stream */ +-static FDK_SACENC_ERROR WriteSpatialExtensionFrame( +- HANDLE_FDK_BITSTREAM bitstream, HANDLE_BSF_INSTANCE self) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((bitstream == NULL) || (self == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDKbyteAlign(bitstream, 0); +- } /* valid handle */ +- +- return error; +-} +- +-/* write frame data to stream */ +-FDK_SACENC_ERROR fdk_sacenc_writeSpatialFrame(UCHAR *const pOutputBuffer, +- const INT outputBufferSize, +- INT *const pnOutputBits, +- HANDLE_BSF_INSTANCE selfPtr) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((pOutputBuffer == NULL) || (pnOutputBits == NULL) || (selfPtr == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- SPATIALFRAME *frame = NULL; +- SPATIALSPECIFICCONFIG *config = NULL; +- FDK_BITSTREAM bitstream; +- +- int i, j, numParamSets, numOttBoxes; +- +- if ((NULL == +- (frame = fdk_sacenc_getSpatialFrame(selfPtr, READ_SPATIALFRAME))) || +- (NULL == (config = &(selfPtr->spatialSpecificConfig)))) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- numOttBoxes = selfPtr->spatialSpecificConfig.treeDescription.numOttBoxes; +- +- numParamSets = frame->framingInfo.numParamSets; +- +- if (frame->bUseBBCues) { +- for (i = 0; i < SACENC_MAX_NUM_BOXES; i++) { +- /* If a transient was detected, force only the second ps broad band */ +- if (numParamSets == 1) { +- frame->CLDLosslessData.bsFreqResStrideXXX[i][0] = 3; +- frame->ICCLosslessData.bsFreqResStrideXXX[i][0] = 3; +- } else { +- for (j = 1; j < MAX_NUM_PARAMS; j++) { +- frame->CLDLosslessData.bsFreqResStrideXXX[i][j] = 3; +- frame->ICCLosslessData.bsFreqResStrideXXX[i][j] = 3; +- } +- } +- } +- } /* frame->bUseBBCues */ +- +- /* bind extern buffer to bitstream handle */ +- FDKinitBitStream(&bitstream, pOutputBuffer, outputBufferSize, 0, BS_WRITER); +- +- if (SACENC_OK != (error = writeFramingInfo( +- &bitstream, &(frame->framingInfo), +- selfPtr->spatialSpecificConfig.bsFrameLength))) { +- goto bail; +- } +- +- /* write bsIndependencyFlag */ +- FDKwriteBits(&bitstream, frame->bsIndependencyFlag, 1); +- +- /* write spatial data to bitstream */ +- if (SACENC_OK != +- (error = writeOttData(&bitstream, &selfPtr->prevFrameData.prevOttData, +- &frame->ottData, config->ottConfig, +- &frame->CLDLosslessData, &frame->ICCLosslessData, +- numOttBoxes, config->numBands, numParamSets, +- frame->bsIndependencyFlag))) { +- goto bail; +- } +- if (SACENC_OK != (error = writeSmgData(&bitstream, &frame->smgData, +- numParamSets, config->numBands))) { +- goto bail; +- } +- +- /* byte alignment */ +- FDKbyteAlign(&bitstream, 0); +- +- /* Write SpatialExtensionFrame */ +- if (SACENC_OK != +- (error = WriteSpatialExtensionFrame(&bitstream, selfPtr))) { +- goto bail; +- } +- +- if (NULL == +- (frame = fdk_sacenc_getSpatialFrame(selfPtr, WRITE_SPATIALFRAME))) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- clearFrame(frame); +- +- /* return number of valid bits in bitstream */ +- if ((*pnOutputBits = FDKgetValidBits(&bitstream)) > +- (outputBufferSize * 8)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* terminate buffer with alignment */ +- FDKbyteAlign(&bitstream, 0); +- +- } /* valid handle */ +- +-bail: +- return error; +-} +diff --git a/libSACenc/src/sacenc_bitstream.h b/libSACenc/src/sacenc_bitstream.h +deleted file mode 100644 +index 67b7b5a..0000000 +--- a/libSACenc/src/sacenc_bitstream.h ++++ /dev/null +@@ -1,296 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): +- +- Description: Encoder Library Interface +- Bitstream Writer +- +-*******************************************************************************/ +- +-#ifndef SACENC_BITSTREAM_H +-#define SACENC_BITSTREAM_H +- +-/* Includes ******************************************************************/ +-#include "FDK_bitstream.h" +-#include "FDK_matrixCalloc.h" +-#include "sacenc_lib.h" +-#include "sacenc_const.h" +- +-/* Defines *******************************************************************/ +-#define MAX_NUM_BINS 23 +-#define MAX_NUM_PARAMS 2 +-#define MAX_NUM_OUTPUTCHANNELS SACENC_MAX_OUTPUT_CHANNELS +-#define MAX_TIME_SLOTS 32 +- +-typedef enum { +- TREE_212 = 7, +- TREE_ESCAPE = 15 +- +-} TREECONFIG; +- +-typedef enum { +- FREQ_RES_40 = 0, +- FREQ_RES_20 = 1, +- FREQ_RES_10 = 2, +- FREQ_RES_5 = 3 +- +-} FREQ; +- +-typedef enum { +- QUANTMODE_INVALID = -1, +- QUANTMODE_FINE = 0, +- QUANTMODE_EBQ1 = 1, +- QUANTMODE_EBQ2 = 2 +- +-} QUANTMODE; +- +-typedef enum { +- TEMPSHAPE_OFF = 0 +- +-} TEMPSHAPECONFIG; +- +-typedef enum { +- FIXEDGAINDMX_INVALID = -1, +- FIXEDGAINDMX_0 = 0, +- FIXEDGAINDMX_1 = 1, +- FIXEDGAINDMX_2 = 2, +- FIXEDGAINDMX_3 = 3, +- FIXEDGAINDMX_4 = 4, +- FIXEDGAINDMX_5 = 5, +- FIXEDGAINDMX_6 = 6, +- FIXEDGAINDMX_7 = 7 +- +-} FIXEDGAINDMXCONFIG; +- +-typedef enum { +- DECORR_INVALID = -1, +- DECORR_QMFSPLIT0 = 0, /* QMF splitfreq: 3, 15, 24, 65 */ +- DECORR_QMFSPLIT1 = 1, /* QMF splitfreq: 3, 50, 65, 65 */ +- DECORR_QMFSPLIT2 = 2 /* QMF splitfreq: 0, 15, 65, 65 */ +- +-} DECORRCONFIG; +- +-typedef enum { +- DEFAULT = 0, +- KEEP = 1, +- INTERPOLATE = 2, +- FINECOARSE = 3 +- +-} DATA_MODE; +- +-typedef enum { +- READ_SPATIALFRAME = 0, +- WRITE_SPATIALFRAME = 1 +- +-} SPATIALFRAME_TYPE; +- +-/* Data Types ****************************************************************/ +-typedef struct { +- INT numOttBoxes; +- INT numInChan; +- INT numOutChan; +- +-} TREEDESCRIPTION; +- +-typedef struct { +- INT bsOttBands; +- +-} OTTCONFIG; +- +-typedef struct { +- INT bsSamplingFrequency; /* for bsSamplingFrequencyIndex */ +- INT bsFrameLength; +- INT numBands; /* for bsFreqRes */ +- TREECONFIG bsTreeConfig; +- QUANTMODE bsQuantMode; +- FIXEDGAINDMXCONFIG bsFixedGainDMX; +- int bsEnvQuantMode; +- DECORRCONFIG bsDecorrConfig; +- TREEDESCRIPTION treeDescription; +- OTTCONFIG ottConfig[SACENC_MAX_NUM_BOXES]; +- +-} SPATIALSPECIFICCONFIG; +- +-typedef struct { +- UCHAR bsFramingType; +- UCHAR numParamSets; +- UCHAR bsParamSlots[MAX_NUM_PARAMS]; +- +-} FRAMINGINFO; +- +-typedef struct { +- SCHAR cld[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS][MAX_NUM_BINS]; +- SCHAR icc[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS][MAX_NUM_BINS]; +- +-} OTTDATA; +- +-typedef struct { +- UCHAR bsSmoothMode[MAX_NUM_PARAMS]; +- UCHAR bsSmoothTime[MAX_NUM_PARAMS]; +- UCHAR bsFreqResStride[MAX_NUM_PARAMS]; +- UCHAR bsSmgData[MAX_NUM_PARAMS][MAX_NUM_BINS]; +- +-} SMGDATA; +- +-typedef struct { +- UCHAR bsEnvShapeChannel[MAX_NUM_OUTPUTCHANNELS]; +- UCHAR bsEnvShapeData[MAX_NUM_OUTPUTCHANNELS][MAX_TIME_SLOTS]; +- +-} TEMPSHAPEDATA; +- +-typedef struct { +- UCHAR bsXXXDataMode[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- UCHAR bsDataPair[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- UCHAR bsQuantCoarseXXX[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- UCHAR bsFreqResStrideXXX[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAMS]; +- +-} LOSSLESSDATA; +- +-typedef struct { +- FRAMINGINFO framingInfo; +- UCHAR bsIndependencyFlag; +- OTTDATA ottData; +- SMGDATA smgData; +- TEMPSHAPEDATA tempShapeData; +- LOSSLESSDATA CLDLosslessData; +- LOSSLESSDATA ICCLosslessData; +- UCHAR bUseBBCues; +- +-} SPATIALFRAME; +- +-typedef struct BSF_INSTANCE *HANDLE_BSF_INSTANCE; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-/* destroy encoder instance */ +-FDK_SACENC_ERROR fdk_sacenc_destroySpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE *selfPtr); +- +-/* create encoder instance */ +-FDK_SACENC_ERROR fdk_sacenc_createSpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE *selfPtr); +- +-FDK_SACENC_ERROR fdk_sacenc_initSpatialBitstreamEncoder( +- HANDLE_BSF_INSTANCE selfPtr); +- +-/* get SpatialSpecificConfig struct */ +-SPATIALSPECIFICCONFIG *fdk_sacenc_getSpatialSpecificConfig( +- HANDLE_BSF_INSTANCE selfPtr); +- +-/* write SpatialSpecificConfig to stream */ +-FDK_SACENC_ERROR fdk_sacenc_writeSpatialSpecificConfig( +- SPATIALSPECIFICCONFIG *const spatialSpecificConfig, +- UCHAR *const pOutputBuffer, const INT outputBufferSize, +- INT *const pnOutputBits); +- +-/* get SpatialFrame struct */ +-SPATIALFRAME *fdk_sacenc_getSpatialFrame(HANDLE_BSF_INSTANCE selfPtr, +- const SPATIALFRAME_TYPE frameType); +- +-/* write frame data to stream */ +-FDK_SACENC_ERROR fdk_sacenc_writeSpatialFrame(UCHAR *const pOutputBuffer, +- const INT outputBufferSize, +- INT *const pnOutputBits, +- HANDLE_BSF_INSTANCE selfPtr); +- +-/* Copy/Save spatial frame data for one parameter set */ +-FDK_SACENC_ERROR fdk_sacenc_duplicateParameterSet( +- const SPATIALFRAME *const hFrom, const INT setFrom, SPATIALFRAME *const hTo, +- const INT setTo); +- +-#endif /* SACENC_BITSTREAM_H */ +diff --git a/libSACenc/src/sacenc_const.h b/libSACenc/src/sacenc_const.h +deleted file mode 100644 +index c86e765..0000000 +--- a/libSACenc/src/sacenc_const.h ++++ /dev/null +@@ -1,126 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Markus Multrus +- +- Description: Encoder Library Interface +- constants to MPEG-4 spatial encoder lib +- +-*******************************************************************************/ +- +-#ifndef SACENC_CONST_H +-#define SACENC_CONST_H +- +-/* Includes ******************************************************************/ +-#include "machine_type.h" +- +-/* Defines *******************************************************************/ +-#define NUM_QMF_BANDS 64 +-#define MAX_QMF_BANDS 128 +- +-#define SACENC_MAX_NUM_BOXES 1 +-#define SACENC_MAX_INPUT_CHANNELS 2 +-#define SACENC_MAX_OUTPUT_CHANNELS 1 +- +-#define SACENC_FLOAT_EPSILON (1e-9f) +- +-/* Data Types ****************************************************************/ +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-#endif /* SACENC_CONST_H */ +diff --git a/libSACenc/src/sacenc_delay.cpp b/libSACenc/src/sacenc_delay.cpp +deleted file mode 100644 +index f2ed6b0..0000000 +--- a/libSACenc/src/sacenc_delay.cpp ++++ /dev/null +@@ -1,472 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Christian Goettlinger +- +- Description: Encoder Library Interface +- delay management of the encoder +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- This file contains all delay infrastructure +- ******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_delay.h" +-#include "sacenc_const.h" +-#include "FDK_matrixCalloc.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +-struct DELAY { +- struct DELAY_CONFIG { +- /* Routing Config Switches*/ +- INT bDmxAlign; +- INT bTimeDomDmx; +- INT bMinimizeDelay; +- INT bSacTimeAlignmentDynamicOut; +- +- /* Needed Input Variables*/ +- INT nQmfLen; +- INT nFrameLen; +- INT nSurroundDelay; +- INT nArbDmxDelay; +- INT nLimiterDelay; +- INT nCoreCoderDelay; +- INT nSacStreamMuxDelay; +- INT nSacTimeAlignment; /* Overwritten, if bSacTimeAlignmentDynamicOut */ +- } config; +- +- /* Variable Delaybuffers -> Delays */ +- INT nDmxAlignBuffer; +- INT nSurroundAnalysisBuffer; +- INT nArbDmxAnalysisBuffer; +- INT nOutputAudioBuffer; +- INT nBitstreamFrameBuffer; +- INT nOutputAudioQmfFrameBuffer; +- INT nDiscardOutFrames; +- +- /* Variable Delaybuffers Computation Variables */ +- INT nBitstreamFrameBufferSize; +- +- /* Output: Infos */ +- INT nInfoDmxDelay; /* Delay of the downmixed signal after the space encoder */ +- INT nInfoCodecDelay; /* Delay of the whole en-/decoder including CoreCoder */ +- INT nInfoDecoderDelay; /* Delay of the Mpeg Surround decoder */ +-}; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_delay_Open() +-description: initializes Delays +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_delay_Open(HANDLE_DELAY *phDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == phDelay) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDK_ALLOCATE_MEMORY_1D(*phDelay, 1, struct DELAY); +- } +- return error; +- +-bail: +- fdk_sacenc_delay_Close(phDelay); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_delay_Close() +-description: destructs Delay +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_delay_Close(HANDLE_DELAY *phDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == phDelay) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if (NULL != *phDelay) { +- FDK_FREE_MEMORY_1D(*phDelay); +- } +- } +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_Init(HANDLE_DELAY hDelay, const INT nQmfLen, +- const INT nFrameLen, +- const INT nCoreCoderDelay, +- const INT nSacStreamMuxDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hDelay) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* Fill structure before calculation */ +- FDKmemclear(&hDelay->config, sizeof(hDelay->config)); +- +- hDelay->config.nQmfLen = nQmfLen; +- hDelay->config.nFrameLen = nFrameLen; +- hDelay->config.nCoreCoderDelay = nCoreCoderDelay; +- hDelay->config.nSacStreamMuxDelay = nSacStreamMuxDelay; +- } +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_delay_SubCalulateBufferDelays() +-description: Calculates the Delays of the buffers +-returns: Error Code +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_delay_SubCalulateBufferDelays(HANDLE_DELAY hDel) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hDel) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int nEncoderAnDelay, nEncoderSynDelay, nEncoderWinDelay, nDecoderAnDelay, +- nDecoderSynDelay, nResidualCoderFrameDelay, +- nArbDmxResidualCoderFrameDelay; +- +- if (hDel->config.bSacTimeAlignmentDynamicOut > 0) { +- hDel->config.nSacTimeAlignment = 0; +- } +- +- { +- nEncoderAnDelay = +- 2 * hDel->config.nQmfLen + +- hDel->config.nQmfLen / 2; /* Only Ld-QMF Delay, no hybrid */ +- nEncoderSynDelay = 1 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2; +- nDecoderAnDelay = 2 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2; +- nDecoderSynDelay = 1 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2; +- nEncoderWinDelay = +- hDel->config.nFrameLen / 2; /* WindowLookahead is just half a frame */ +- } +- +- { nResidualCoderFrameDelay = 0; } +- +- { nArbDmxResidualCoderFrameDelay = 0; } +- +- /* Calculate variable Buffer-Delays */ +- if (hDel->config.bTimeDomDmx == 0) { +- /* ArbitraryDmx and TdDmx off */ +- int tempDelay; +- +- hDel->nSurroundAnalysisBuffer = 0; +- hDel->nArbDmxAnalysisBuffer = 0; +- tempDelay = nEncoderSynDelay + hDel->config.nLimiterDelay + +- hDel->config.nCoreCoderDelay + +- hDel->config.nSacTimeAlignment + nDecoderAnDelay; +- tempDelay = (nResidualCoderFrameDelay * hDel->config.nFrameLen) + +- hDel->config.nSacStreamMuxDelay - tempDelay; +- +- if (tempDelay > 0) { +- hDel->nBitstreamFrameBuffer = 0; +- hDel->nOutputAudioBuffer = tempDelay; +- } else { +- tempDelay = -tempDelay; +- hDel->nBitstreamFrameBuffer = +- (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen; +- hDel->nOutputAudioBuffer = +- (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen) - tempDelay; +- } +- +- hDel->nOutputAudioQmfFrameBuffer = +- (hDel->nOutputAudioBuffer + (hDel->config.nQmfLen / 2) - 1) / +- hDel->config.nQmfLen; +- +- if (hDel->config.bDmxAlign > 0) { +- tempDelay = nEncoderWinDelay + nEncoderAnDelay + nEncoderSynDelay + +- hDel->nOutputAudioBuffer + hDel->config.nLimiterDelay + +- hDel->config.nCoreCoderDelay; +- hDel->nDiscardOutFrames = +- (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen; +- hDel->nDmxAlignBuffer = +- hDel->nDiscardOutFrames * hDel->config.nFrameLen - tempDelay; +- } else { +- hDel->nDiscardOutFrames = 0; +- hDel->nDmxAlignBuffer = 0; +- } +- +- /* Output: Info-Variables */ +- hDel->nInfoDmxDelay = hDel->nSurroundAnalysisBuffer + nEncoderAnDelay + +- nEncoderWinDelay + nEncoderSynDelay + +- hDel->nOutputAudioBuffer + +- hDel->config.nLimiterDelay; +- hDel->nInfoCodecDelay = +- hDel->nInfoDmxDelay + hDel->config.nCoreCoderDelay + +- hDel->config.nSacTimeAlignment + nDecoderAnDelay + nDecoderSynDelay; +- +- } else { +- /* ArbitraryDmx or TdDmx on */ +- int tempDelay1, tempDelay2, tempDelay12, tempDelay3; +- +- tempDelay1 = hDel->config.nArbDmxDelay - hDel->config.nSurroundDelay; +- +- if (tempDelay1 >= 0) { +- hDel->nSurroundAnalysisBuffer = tempDelay1; +- hDel->nArbDmxAnalysisBuffer = 0; +- } else { +- hDel->nSurroundAnalysisBuffer = 0; +- hDel->nArbDmxAnalysisBuffer = -tempDelay1; +- } +- +- tempDelay1 = nEncoderWinDelay + hDel->config.nSurroundDelay + +- hDel->nSurroundAnalysisBuffer + +- nEncoderAnDelay; /*Surround Path*/ +- tempDelay2 = nEncoderWinDelay + hDel->config.nArbDmxDelay + +- hDel->nArbDmxAnalysisBuffer + +- nEncoderAnDelay; /* ArbDmx Compare Path */ +- tempDelay3 = hDel->config.nArbDmxDelay + hDel->config.nLimiterDelay + +- hDel->config.nCoreCoderDelay + +- hDel->config.nSacTimeAlignment + +- nDecoderAnDelay; /* ArbDmx Passthrough*/ +- +- tempDelay12 = +- FDKmax(nResidualCoderFrameDelay, nArbDmxResidualCoderFrameDelay) * +- hDel->config.nFrameLen; +- tempDelay12 += hDel->config.nSacStreamMuxDelay; +- +- if (tempDelay1 > tempDelay2) { +- tempDelay12 += tempDelay1; +- } else { +- tempDelay12 += tempDelay2; +- } +- +- if (tempDelay3 > tempDelay12) { +- if (hDel->config.bMinimizeDelay > 0) { +- hDel->nBitstreamFrameBuffer = +- (tempDelay3 - tempDelay12) / hDel->config.nFrameLen; /*floor*/ +- hDel->nOutputAudioBuffer = 0; +- hDel->nSurroundAnalysisBuffer += +- (tempDelay3 - tempDelay12 - +- (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen)); +- hDel->nArbDmxAnalysisBuffer += +- (tempDelay3 - tempDelay12 - +- (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen)); +- } else { +- hDel->nBitstreamFrameBuffer = +- ((tempDelay3 - tempDelay12) + hDel->config.nFrameLen - 1) / +- hDel->config.nFrameLen; +- hDel->nOutputAudioBuffer = +- hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen + +- tempDelay12 - tempDelay3; +- } +- } else { +- hDel->nBitstreamFrameBuffer = 0; +- hDel->nOutputAudioBuffer = tempDelay12 - tempDelay3; +- } +- +- if (hDel->config.bDmxAlign > 0) { +- int tempDelay = hDel->config.nArbDmxDelay + hDel->nOutputAudioBuffer + +- hDel->config.nLimiterDelay + +- hDel->config.nCoreCoderDelay; +- hDel->nDiscardOutFrames = +- (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen; +- hDel->nDmxAlignBuffer = +- hDel->nDiscardOutFrames * hDel->config.nFrameLen - tempDelay; +- } else { +- hDel->nDiscardOutFrames = 0; +- hDel->nDmxAlignBuffer = 0; +- } +- +- /* Output: Info-Variables */ +- hDel->nInfoDmxDelay = hDel->config.nArbDmxDelay + +- hDel->nOutputAudioBuffer + +- hDel->config.nLimiterDelay; +- hDel->nInfoCodecDelay = +- hDel->nInfoDmxDelay + hDel->config.nCoreCoderDelay + +- hDel->config.nSacTimeAlignment + nDecoderAnDelay + nDecoderSynDelay; +- hDel->nInfoDecoderDelay = nDecoderAnDelay + nDecoderSynDelay; +- +- } /* ArbitraryDmx or TdDmx on */ +- +- /* Additonal Variables needed for Computation Issues */ +- hDel->nBitstreamFrameBufferSize = hDel->nBitstreamFrameBuffer + 1; +- } +- +- return error; +-} +- +-static FDK_SACENC_ERROR assignParameterInRange( +- const INT startRange, /* including startRange */ +- const INT stopRange, /* including stopRange */ +- const INT value, /* value to write*/ +- INT *const ptr /* destination pointer*/ +-) { +- FDK_SACENC_ERROR error = SACENC_INVALID_CONFIG; +- +- if ((startRange <= value) && (value <= stopRange)) { +- *ptr = value; +- error = SACENC_OK; +- } +- +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetDmxAlign(HANDLE_DELAY hDelay, +- const INT bDmxAlignIn) { +- return (assignParameterInRange(0, 1, bDmxAlignIn, &hDelay->config.bDmxAlign)); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetTimeDomDmx(HANDLE_DELAY hDelay, +- const INT bTimeDomDmxIn) { +- return ( +- assignParameterInRange(0, 1, bTimeDomDmxIn, &hDelay->config.bTimeDomDmx)); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetSacTimeAlignmentDynamicOut( +- HANDLE_DELAY hDelay, const INT bSacTimeAlignmentDynamicOutIn) { +- return (assignParameterInRange(0, 1, bSacTimeAlignmentDynamicOutIn, +- &hDelay->config.bSacTimeAlignmentDynamicOut)); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetNSacTimeAlignment( +- HANDLE_DELAY hDelay, const INT nSacTimeAlignmentIn) { +- return (assignParameterInRange(-32768, 32767, nSacTimeAlignmentIn, +- &hDelay->config.nSacTimeAlignment)); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetMinimizeDelay(HANDLE_DELAY hDelay, +- const INT bMinimizeDelay) { +- return (assignParameterInRange(0, 1, bMinimizeDelay, +- &hDelay->config.bMinimizeDelay)); +-} +- +-INT fdk_sacenc_delay_GetOutputAudioBufferDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nOutputAudioBuffer); +-} +- +-INT fdk_sacenc_delay_GetSurroundAnalysisBufferDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nSurroundAnalysisBuffer); +-} +- +-INT fdk_sacenc_delay_GetArbDmxAnalysisBufferDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nArbDmxAnalysisBuffer); +-} +- +-INT fdk_sacenc_delay_GetBitstreamFrameBufferSize(HANDLE_DELAY hDelay) { +- return (hDelay->nBitstreamFrameBufferSize); +-} +- +-INT fdk_sacenc_delay_GetDmxAlignBufferDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nDmxAlignBuffer); +-} +- +-INT fdk_sacenc_delay_GetDiscardOutFrames(HANDLE_DELAY hDelay) { +- return (hDelay->nDiscardOutFrames); +-} +- +-INT fdk_sacenc_delay_GetInfoDmxDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nInfoDmxDelay); +-} +- +-INT fdk_sacenc_delay_GetInfoCodecDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nInfoCodecDelay); +-} +- +-INT fdk_sacenc_delay_GetInfoDecoderDelay(HANDLE_DELAY hDelay) { +- return (hDelay->nInfoDecoderDelay); +-} +diff --git a/libSACenc/src/sacenc_delay.h b/libSACenc/src/sacenc_delay.h +deleted file mode 100644 +index 38bfbc5..0000000 +--- a/libSACenc/src/sacenc_delay.h ++++ /dev/null +@@ -1,175 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Christian Goettlinger +- +- Description: Encoder Library Interface +- delay management of the encoder +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- ******************************************************************************/ +-#ifndef SACENC_DELAY_H +-#define SACENC_DELAY_H +- +-/* Includes ******************************************************************/ +-#include "sacenc_lib.h" +-#include "machine_type.h" +-#include "FDK_matrixCalloc.h" +- +-/* Defines *******************************************************************/ +-#define MAX_DELAY_INPUT 1024 +-#define MAX_DELAY_OUTPUT 4096 +-/* bumped from 0 to 5. this should be equal or larger to the dualrate sbr +- * resampler filter length */ +-#define MAX_DELAY_SURROUND_ANALYSIS 5 +-#define MAX_BITSTREAM_DELAY 1 +- +-/* Data Types ****************************************************************/ +-typedef struct DELAY *HANDLE_DELAY; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_delay_Open(HANDLE_DELAY *phDelay); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_Close(HANDLE_DELAY *phDelay); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_Init(HANDLE_DELAY hDelay, const INT nQmfLen, +- const INT nFrameLen, +- const INT nCoreCoderDelay, +- const INT nSacStreamMuxDelay); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SubCalulateBufferDelays(HANDLE_DELAY hDel); +- +-/* Set Expert Config Parameters */ +-FDK_SACENC_ERROR fdk_sacenc_delay_SetDmxAlign(HANDLE_DELAY hDelay, +- const INT bDmxAlignIn); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetTimeDomDmx(HANDLE_DELAY hDelay, +- const INT bTimeDomDmxIn); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetSacTimeAlignmentDynamicOut( +- HANDLE_DELAY hDelay, const INT bSacTimeAlignmentDynamicOutIn); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetNSacTimeAlignment( +- HANDLE_DELAY hDelay, const INT nSacTimeAlignmentIn); +- +-FDK_SACENC_ERROR fdk_sacenc_delay_SetMinimizeDelay(HANDLE_DELAY hDelay, +- const INT bMinimizeDelay); +- +-/* Get Internal Variables */ +-INT fdk_sacenc_delay_GetOutputAudioBufferDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetSurroundAnalysisBufferDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetArbDmxAnalysisBufferDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetBitstreamFrameBufferSize(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetDmxAlignBufferDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetDiscardOutFrames(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetInfoDmxDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetInfoCodecDelay(HANDLE_DELAY hDelay); +- +-INT fdk_sacenc_delay_GetInfoDecoderDelay(HANDLE_DELAY hDelay); +- +-#endif /* SACENC_DELAY_H */ +diff --git a/libSACenc/src/sacenc_dmx_tdom_enh.cpp b/libSACenc/src/sacenc_dmx_tdom_enh.cpp +deleted file mode 100644 +index be66c83..0000000 +--- a/libSACenc/src/sacenc_dmx_tdom_enh.cpp ++++ /dev/null +@@ -1,639 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Luis Valero +- +- Description: Enhanced Time Domain Downmix +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_dmx_tdom_enh.h" +- +-#include "FDK_matrixCalloc.h" +-#include "FDK_trigFcts.h" +-#include "fixpoint_math.h" +- +-/* Defines *******************************************************************/ +-#define PI_FLT 3.1415926535897931f +-#define ALPHA_FLT 0.0001f +- +-#define PI_E (2) +-#define PI_M (FL2FXCONST_DBL(PI_FLT / (1 << PI_E))) +- +-#define ALPHA_E (13) +-#define ALPHA_M (FL2FXCONST_DBL(ALPHA_FLT * (1 << ALPHA_E))) +- +-enum { L = 0, R = 1 }; +- +-/* Data Types ****************************************************************/ +-typedef struct T_ENHANCED_TIME_DOMAIN_DMX { +- int maxFramelength; +- +- int framelength; +- +- FIXP_DBL prev_gain_m[2]; +- INT prev_gain_e; +- FIXP_DBL prev_H1_m[2]; +- INT prev_H1_e; +- +- FIXP_DBL *sinusWindow_m; +- SCHAR sinusWindow_e; +- +- FIXP_DBL prev_Left_m; +- INT prev_Left_e; +- FIXP_DBL prev_Right_m; +- INT prev_Right_e; +- FIXP_DBL prev_XNrg_m; +- INT prev_XNrg_e; +- +- FIXP_DBL lin_bbCld_weight_m; +- INT lin_bbCld_weight_e; +- FIXP_DBL gain_weight_m[2]; +- INT gain_weight_e; +- +-} ENHANCED_TIME_DOMAIN_DMX; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-static void calculateRatio(const FIXP_DBL sqrt_linCld_m, +- const INT sqrt_linCld_e, const FIXP_DBL lin_Cld_m, +- const INT lin_Cld_e, const FIXP_DBL Icc_m, +- const INT Icc_e, FIXP_DBL G_m[2], INT *G_e); +- +-static void calculateDmxGains(const FIXP_DBL lin_Cld_m, const INT lin_Cld_e, +- const FIXP_DBL lin_Cld2_m, const INT lin_Cld2_e, +- const FIXP_DBL Icc_m, const INT Icc_e, +- const FIXP_DBL G_m[2], const INT G_e, +- FIXP_DBL H1_m[2], INT *pH1_e); +- +-/* Function / Class Definition ***********************************************/ +-static FIXP_DBL invSqrtNorm2(const FIXP_DBL op_m, const INT op_e, +- INT *const result_e) { +- FIXP_DBL src_m = op_m; +- int src_e = op_e; +- +- if (src_e & 1) { +- src_m >>= 1; +- src_e += 1; +- } +- +- src_m = invSqrtNorm2(src_m, result_e); +- *result_e = (*result_e) - (src_e >> 1); +- +- return src_m; +-} +- +-static FIXP_DBL sqrtFixp(const FIXP_DBL op_m, const INT op_e, +- INT *const result_e) { +- FIXP_DBL src_m = op_m; +- int src_e = op_e; +- +- if (src_e & 1) { +- src_m >>= 1; +- src_e += 1; +- } +- +- *result_e = (src_e >> 1); +- return sqrtFixp(src_m); +-} +- +-static FIXP_DBL fixpAdd(const FIXP_DBL src1_m, const INT src1_e, +- const FIXP_DBL src2_m, const INT src2_e, +- INT *const dst_e) { +- FIXP_DBL dst_m; +- +- if (src1_m == FL2FXCONST_DBL(0.f)) { +- *dst_e = src2_e; +- dst_m = src2_m; +- } else if (src2_m == FL2FXCONST_DBL(0.f)) { +- *dst_e = src1_e; +- dst_m = src1_m; +- } else { +- *dst_e = fixMax(src1_e, src2_e) + 1; +- dst_m = +- scaleValue(src1_m, fixMax((src1_e - (*dst_e)), -(DFRACT_BITS - 1))) + +- scaleValue(src2_m, fixMax((src2_e - (*dst_e)), -(DFRACT_BITS - 1))); +- } +- return dst_m; +-} +- +-/** +- * \brief Sum up fixpoint values with best possible accuracy. +- * +- * \param value1 First input value. +- * \param q1 Scaling factor of first input value. +- * \param pValue2 Pointer to second input value, will be modified on +- * return. +- * \param pQ2 Pointer to second scaling factor, will be modified on +- * return. +- * +- * \return void +- */ +-static void fixpAddNorm(const FIXP_DBL value1, const INT q1, +- FIXP_DBL *const pValue2, INT *const pQ2) { +- const int headroom1 = fNormz(fixp_abs(value1)) - 1; +- const int headroom2 = fNormz(fixp_abs(*pValue2)) - 1; +- int resultScale = fixMax(q1 - headroom1, (*pQ2) - headroom2); +- +- if ((value1 != FL2FXCONST_DBL(0.f)) && (*pValue2 != FL2FXCONST_DBL(0.f))) { +- resultScale++; +- } +- +- *pValue2 = +- scaleValue(value1, q1 - resultScale) + +- scaleValue(*pValue2, fixMax(-(DFRACT_BITS - 1), ((*pQ2) - resultScale))); +- *pQ2 = (*pValue2 != (FIXP_DBL)0) ? resultScale : DFRACT_BITS - 1; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_open_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX *phEnhancedTimeDmx, const INT framelength) { +- FDK_SACENC_ERROR error = SACENC_OK; +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx = NULL; +- +- if (NULL == phEnhancedTimeDmx) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDK_ALLOCATE_MEMORY_1D(hEnhancedTimeDmx, 1, ENHANCED_TIME_DOMAIN_DMX); +- FDK_ALLOCATE_MEMORY_1D(hEnhancedTimeDmx->sinusWindow_m, 1 + framelength, +- FIXP_DBL); +- hEnhancedTimeDmx->maxFramelength = framelength; +- *phEnhancedTimeDmx = hEnhancedTimeDmx; +- } +- return error; +- +-bail: +- fdk_sacenc_close_enhancedTimeDomainDmx(&hEnhancedTimeDmx); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_init_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, +- const FIXP_DBL *const pInputGain_m, const INT inputGain_e, +- const FIXP_DBL outputGain_m, const INT outputGain_e, +- const INT framelength) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (hEnhancedTimeDmx == NULL) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int smp; +- if (framelength > hEnhancedTimeDmx->maxFramelength) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- +- hEnhancedTimeDmx->framelength = framelength; +- +- INT deltax_e; +- FIXP_DBL deltax_m; +- +- deltax_m = fDivNormHighPrec( +- PI_M, (FIXP_DBL)(2 * hEnhancedTimeDmx->framelength), &deltax_e); +- deltax_m = scaleValue(deltax_m, PI_E + deltax_e - (DFRACT_BITS - 1) - 1); +- deltax_e = 1; +- +- for (smp = 0; smp < hEnhancedTimeDmx->framelength + 1; smp++) { +- hEnhancedTimeDmx->sinusWindow_m[smp] = +- fMult(ALPHA_M, fPow2(fixp_sin(smp * deltax_m, deltax_e))); +- } +- hEnhancedTimeDmx->sinusWindow_e = -ALPHA_E; +- +- hEnhancedTimeDmx->prev_Left_m = hEnhancedTimeDmx->prev_Right_m = +- hEnhancedTimeDmx->prev_XNrg_m = FL2FXCONST_DBL(0.f); +- hEnhancedTimeDmx->prev_Left_e = hEnhancedTimeDmx->prev_Right_e = +- hEnhancedTimeDmx->prev_XNrg_e = DFRACT_BITS - 1; +- +- hEnhancedTimeDmx->lin_bbCld_weight_m = +- fDivNormHighPrec(fPow2(pInputGain_m[L]), fPow2(pInputGain_m[R]), +- &hEnhancedTimeDmx->lin_bbCld_weight_e); +- +- hEnhancedTimeDmx->gain_weight_m[L] = fMult(pInputGain_m[L], outputGain_m); +- hEnhancedTimeDmx->gain_weight_m[R] = fMult(pInputGain_m[R], outputGain_m); +- hEnhancedTimeDmx->gain_weight_e = +- -fNorm(fixMax(hEnhancedTimeDmx->gain_weight_m[L], +- hEnhancedTimeDmx->gain_weight_m[R])); +- +- hEnhancedTimeDmx->gain_weight_m[L] = scaleValue( +- hEnhancedTimeDmx->gain_weight_m[L], -hEnhancedTimeDmx->gain_weight_e); +- hEnhancedTimeDmx->gain_weight_m[R] = scaleValue( +- hEnhancedTimeDmx->gain_weight_m[R], -hEnhancedTimeDmx->gain_weight_e); +- hEnhancedTimeDmx->gain_weight_e += inputGain_e + outputGain_e; +- +- hEnhancedTimeDmx->prev_gain_m[L] = hEnhancedTimeDmx->gain_weight_m[L] >> 1; +- hEnhancedTimeDmx->prev_gain_m[R] = hEnhancedTimeDmx->gain_weight_m[R] >> 1; +- hEnhancedTimeDmx->prev_gain_e = hEnhancedTimeDmx->gain_weight_e + 1; +- +- hEnhancedTimeDmx->prev_H1_m[L] = +- scaleValue(hEnhancedTimeDmx->gain_weight_m[L], -4); +- hEnhancedTimeDmx->prev_H1_m[R] = +- scaleValue(hEnhancedTimeDmx->gain_weight_m[R], -4); +- hEnhancedTimeDmx->prev_H1_e = 2 + 2 + hEnhancedTimeDmx->gain_weight_e; +- } +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_apply_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, +- const INT_PCM *const *const inputTime, INT_PCM *const outputTimeDmx, +- const INT InputDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hEnhancedTimeDmx) || (NULL == inputTime) || +- (NULL == inputTime[L]) || (NULL == inputTime[R]) || +- (NULL == outputTimeDmx)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int smp; +- FIXP_DBL lin_bbCld_m, lin_Cld_m, bbCorr_m, sqrt_linCld_m, G_m[2], H1_m[2], +- gainLeft_m, gainRight_m; +- FIXP_DBL bbNrgLeft_m, bbNrgRight_m, bbXNrg_m, nrgLeft_m, nrgRight_m, nrgX_m; +- INT lin_bbCld_e, lin_Cld_e, bbCorr_e, sqrt_linCld_e, G_e, H1_e; +- INT bbNrgLeft_e, bbNrgRight_e, bbXNrg_e, nrgLeft_e, nrgRight_e, nrgX_e; +- +- /* Increase energy time resolution with shorter processing blocks. 128 is an +- * empiric value. */ +- const int granuleLength = fixMin(128, hEnhancedTimeDmx->framelength); +- int granuleShift = +- (granuleLength > 1) +- ? ((DFRACT_BITS - 1) - fNorm((FIXP_DBL)(granuleLength - 1))) +- : 0; +- granuleShift = fixMax( +- 3, granuleShift + +- 1); /* one bit more headroom for worst case accumulation */ +- +- smp = 0; +- +- /* Prevent division by zero. */ +- bbNrgLeft_m = bbNrgRight_m = bbXNrg_m = (FIXP_DBL)(1); +- bbNrgLeft_e = bbNrgRight_e = bbXNrg_e = 0; +- +- do { +- const int offset = smp; +- FIXP_DBL partialL, partialR, partialX; +- partialL = partialR = partialX = FL2FXCONST_DBL(0.f); +- +- int in_margin = FDKmin( +- getScalefactorPCM( +- &inputTime[L][offset], +- fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength) - +- offset, +- 1), +- getScalefactorPCM( +- &inputTime[R][offset], +- fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength) - +- offset, +- 1)); +- +- /* partial energy */ +- for (smp = offset; +- smp < fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength); +- smp++) { +- FIXP_PCM inputL = +- scaleValue((FIXP_PCM)inputTime[L][smp], in_margin - 1); +- FIXP_PCM inputR = +- scaleValue((FIXP_PCM)inputTime[R][smp], in_margin - 1); +- +- partialL += fPow2Div2(inputL) >> (granuleShift - 3); +- partialR += fPow2Div2(inputR) >> (granuleShift - 3); +- partialX += fMultDiv2(inputL, inputR) >> (granuleShift - 3); +- } +- +- fixpAddNorm(partialL, granuleShift - 2 * in_margin, &bbNrgLeft_m, +- &bbNrgLeft_e); +- fixpAddNorm(partialR, granuleShift - 2 * in_margin, &bbNrgRight_m, +- &bbNrgRight_e); +- fixpAddNorm(partialX, granuleShift - 2 * in_margin, &bbXNrg_m, &bbXNrg_e); +- } while (smp < hEnhancedTimeDmx->framelength); +- +- nrgLeft_m = +- fixpAdd(hEnhancedTimeDmx->prev_Left_m, hEnhancedTimeDmx->prev_Left_e, +- bbNrgLeft_m, bbNrgLeft_e, &nrgLeft_e); +- nrgRight_m = +- fixpAdd(hEnhancedTimeDmx->prev_Right_m, hEnhancedTimeDmx->prev_Right_e, +- bbNrgRight_m, bbNrgRight_e, &nrgRight_e); +- nrgX_m = +- fixpAdd(hEnhancedTimeDmx->prev_XNrg_m, hEnhancedTimeDmx->prev_XNrg_e, +- bbXNrg_m, bbXNrg_e, &nrgX_e); +- +- lin_bbCld_m = fMult(hEnhancedTimeDmx->lin_bbCld_weight_m, +- fDivNorm(nrgLeft_m, nrgRight_m, &lin_bbCld_e)); +- lin_bbCld_e += +- hEnhancedTimeDmx->lin_bbCld_weight_e + nrgLeft_e - nrgRight_e; +- +- bbCorr_m = fMult(nrgX_m, invSqrtNorm2(fMult(nrgLeft_m, nrgRight_m), +- nrgLeft_e + nrgRight_e, &bbCorr_e)); +- bbCorr_e += nrgX_e; +- +- hEnhancedTimeDmx->prev_Left_m = bbNrgLeft_m; +- hEnhancedTimeDmx->prev_Left_e = bbNrgLeft_e; +- hEnhancedTimeDmx->prev_Right_m = bbNrgRight_m; +- hEnhancedTimeDmx->prev_Right_e = bbNrgRight_e; +- hEnhancedTimeDmx->prev_XNrg_m = bbXNrg_m; +- hEnhancedTimeDmx->prev_XNrg_e = bbXNrg_e; +- +- /* +- bbCld = 10.f*log10(lin_bbCld) +- +- lin_Cld = pow(10,bbCld/20) +- = pow(10,10.f*log10(lin_bbCld)/20.f) +- = sqrt(lin_bbCld) +- +- lin_Cld2 = lin_Cld*lin_Cld +- = sqrt(lin_bbCld)*sqrt(lin_bbCld) +- = lin_bbCld +- */ +- lin_Cld_m = sqrtFixp(lin_bbCld_m, lin_bbCld_e, &lin_Cld_e); +- sqrt_linCld_m = sqrtFixp(lin_Cld_m, lin_Cld_e, &sqrt_linCld_e); +- +- /*calculate how much right and how much left signal, to avoid signal +- * cancellations*/ +- calculateRatio(sqrt_linCld_m, sqrt_linCld_e, lin_Cld_m, lin_Cld_e, bbCorr_m, +- bbCorr_e, G_m, &G_e); +- +- /*calculate downmix gains*/ +- calculateDmxGains(lin_Cld_m, lin_Cld_e, lin_bbCld_m, lin_bbCld_e, bbCorr_m, +- bbCorr_e, G_m, G_e, H1_m, &H1_e); +- +- /*adapt output gains*/ +- H1_m[L] = fMult(H1_m[L], hEnhancedTimeDmx->gain_weight_m[L]); +- H1_m[R] = fMult(H1_m[R], hEnhancedTimeDmx->gain_weight_m[R]); +- H1_e += hEnhancedTimeDmx->gain_weight_e; +- +- gainLeft_m = hEnhancedTimeDmx->prev_gain_m[L]; +- gainRight_m = hEnhancedTimeDmx->prev_gain_m[R]; +- +- INT intermediate_gain_e = +- +hEnhancedTimeDmx->sinusWindow_e + H1_e - hEnhancedTimeDmx->prev_gain_e; +- +- for (smp = 0; smp < hEnhancedTimeDmx->framelength; smp++) { +- const INT N = hEnhancedTimeDmx->framelength; +- FIXP_DBL intermediate_gainLeft_m, intermediate_gainRight_m, tmp; +- +- intermediate_gainLeft_m = +- scaleValue((fMult(hEnhancedTimeDmx->sinusWindow_m[smp], H1_m[L]) + +- fMult(hEnhancedTimeDmx->sinusWindow_m[N - smp], +- hEnhancedTimeDmx->prev_H1_m[L])), +- intermediate_gain_e); +- intermediate_gainRight_m = +- scaleValue((fMult(hEnhancedTimeDmx->sinusWindow_m[smp], H1_m[R]) + +- fMult(hEnhancedTimeDmx->sinusWindow_m[N - smp], +- hEnhancedTimeDmx->prev_H1_m[R])), +- intermediate_gain_e); +- +- gainLeft_m = intermediate_gainLeft_m + +- fMult(FL2FXCONST_DBL(1.f - ALPHA_FLT), gainLeft_m); +- gainRight_m = intermediate_gainRight_m + +- fMult(FL2FXCONST_DBL(1.f - ALPHA_FLT), gainRight_m); +- +- tmp = fMultDiv2(gainLeft_m, (FIXP_PCM)inputTime[L][smp + InputDelay]) + +- fMultDiv2(gainRight_m, (FIXP_PCM)inputTime[R][smp + InputDelay]); +- outputTimeDmx[smp] = (INT_PCM)SATURATE_SHIFT( +- tmp, +- -(hEnhancedTimeDmx->prev_gain_e + 1 - (DFRACT_BITS - SAMPLE_BITS)), +- SAMPLE_BITS); +- } +- +- hEnhancedTimeDmx->prev_gain_m[L] = gainLeft_m; +- hEnhancedTimeDmx->prev_gain_m[R] = gainRight_m; +- +- hEnhancedTimeDmx->prev_H1_m[L] = H1_m[L]; +- hEnhancedTimeDmx->prev_H1_m[R] = H1_m[R]; +- hEnhancedTimeDmx->prev_H1_e = H1_e; +- } +- +- return error; +-} +- +-static void calculateRatio(const FIXP_DBL sqrt_linCld_m, +- const INT sqrt_linCld_e, const FIXP_DBL lin_Cld_m, +- const INT lin_Cld_e, const FIXP_DBL Icc_m, +- const INT Icc_e, FIXP_DBL G_m[2], INT *G_e) { +-#define G_SCALE_FACTOR (2) +- +- if (Icc_m >= FL2FXCONST_DBL(0.f)) { +- G_m[0] = G_m[1] = FL2FXCONST_DBL(1.f / (float)(1 << G_SCALE_FACTOR)); +- G_e[0] = G_SCALE_FACTOR; +- } else { +- const FIXP_DBL max_gain_factor = +- FL2FXCONST_DBL(2.f / (float)(1 << G_SCALE_FACTOR)); +- FIXP_DBL tmp1_m, tmp2_m, numerator_m, denominator_m, r_m, r4_m, q; +- INT tmp1_e, tmp2_e, numerator_e, denominator_e, r_e, r4_e; +- +- /* r = (lin_Cld + 1 + 2*Icc*sqrt_linCld) / (lin_Cld + 1 - +- * 2*Icc*sqrt_linCld) = (tmp1 + tmp2) / (tmp1 - tmp2) +- */ +- tmp1_m = +- fixpAdd(lin_Cld_m, lin_Cld_e, FL2FXCONST_DBL(1.f / 2.f), 1, &tmp1_e); +- +- tmp2_m = fMult(Icc_m, sqrt_linCld_m); +- tmp2_e = 1 + Icc_e + sqrt_linCld_e; +- numerator_m = fixpAdd(tmp1_m, tmp1_e, tmp2_m, tmp2_e, &numerator_e); +- denominator_m = fixpAdd(tmp1_m, tmp1_e, -tmp2_m, tmp2_e, &denominator_e); +- +- if ((numerator_m > FL2FXCONST_DBL(0.f)) && +- (denominator_m > FL2FXCONST_DBL(0.f))) { +- r_m = fDivNorm(numerator_m, denominator_m, &r_e); +- r_e += numerator_e - denominator_e; +- +- /* r_4 = sqrt( sqrt( r ) ) */ +- r4_m = sqrtFixp(r_m, r_e, &r4_e); +- r4_m = sqrtFixp(r4_m, r4_e, &r4_e); +- +- r4_e -= G_SCALE_FACTOR; +- +- /* q = min(r4_m, max_gain_factor) */ +- q = ((r4_e >= 0) && (r4_m >= (max_gain_factor >> r4_e))) +- ? max_gain_factor +- : scaleValue(r4_m, r4_e); +- } else { +- q = FL2FXCONST_DBL(0.f); +- } +- +- G_m[0] = max_gain_factor - q; +- G_m[1] = q; +- +- *G_e = G_SCALE_FACTOR; +- } +-} +- +-static void calculateDmxGains(const FIXP_DBL lin_Cld_m, const INT lin_Cld_e, +- const FIXP_DBL lin_Cld2_m, const INT lin_Cld2_e, +- const FIXP_DBL Icc_m, const INT Icc_e, +- const FIXP_DBL G_m[2], const INT G_e, +- FIXP_DBL H1_m[2], INT *pH1_e) { +-#define H1_SCALE_FACTOR (2) +- const FIXP_DBL max_gain_factor = +- FL2FXCONST_DBL(2.f / (float)(1 << H1_SCALE_FACTOR)); +- +- FIXP_DBL nrgRight_m, nrgLeft_m, crossNrg_m, inv_weight_num_m, +- inv_weight_denom_m, inverse_weight_m, inverse_weight_limited; +- INT nrgRight_e, nrgLeft_e, crossNrg_e, inv_weight_num_e, inv_weight_denom_e, +- inverse_weight_e; +- +- /* nrgRight = sqrt(1/(lin_Cld2 + 1) */ +- nrgRight_m = fixpAdd(lin_Cld2_m, lin_Cld2_e, FL2FXCONST_DBL(1.f / 2.f), 1, +- &nrgRight_e); +- nrgRight_m = invSqrtNorm2(nrgRight_m, nrgRight_e, &nrgRight_e); +- +- /* nrgLeft = lin_Cld * nrgRight */ +- nrgLeft_m = fMult(lin_Cld_m, nrgRight_m); +- nrgLeft_e = lin_Cld_e + nrgRight_e; +- +- /* crossNrg = sqrt(nrgLeft*nrgRight) */ +- crossNrg_m = sqrtFixp(fMult(nrgLeft_m, nrgRight_m), nrgLeft_e + nrgRight_e, +- &crossNrg_e); +- +- /* inverse_weight = sqrt((nrgLeft + nrgRight) / ( (G[0]*G[0]*nrgLeft) + +- * (G[1]*G[1]*nrgRight) + 2*G[0]*G[1]*Icc*crossNrg)) = sqrt(inv_weight_num / +- * inv_weight_denom) +- */ +- inv_weight_num_m = +- fixpAdd(nrgRight_m, nrgRight_e, nrgLeft_m, nrgLeft_e, &inv_weight_num_e); +- +- inv_weight_denom_m = +- fixpAdd(fMult(fPow2(G_m[0]), nrgLeft_m), 2 * G_e + nrgLeft_e, +- fMult(fPow2(G_m[1]), nrgRight_m), 2 * G_e + nrgRight_e, +- &inv_weight_denom_e); +- +- inv_weight_denom_m = +- fixpAdd(fMult(fMult(fMult(G_m[0], G_m[1]), crossNrg_m), Icc_m), +- 1 + 2 * G_e + crossNrg_e + Icc_e, inv_weight_denom_m, +- inv_weight_denom_e, &inv_weight_denom_e); +- +- if (inv_weight_denom_m > FL2FXCONST_DBL(0.f)) { +- inverse_weight_m = +- fDivNorm(inv_weight_num_m, inv_weight_denom_m, &inverse_weight_e); +- inverse_weight_m = +- sqrtFixp(inverse_weight_m, +- inverse_weight_e + inv_weight_num_e - inv_weight_denom_e, +- &inverse_weight_e); +- inverse_weight_e -= H1_SCALE_FACTOR; +- +- /* inverse_weight_limited = min(max_gain_factor, inverse_weight) */ +- inverse_weight_limited = +- ((inverse_weight_e >= 0) && +- (inverse_weight_m >= (max_gain_factor >> inverse_weight_e))) +- ? max_gain_factor +- : scaleValue(inverse_weight_m, inverse_weight_e); +- } else { +- inverse_weight_limited = max_gain_factor; +- } +- +- H1_m[0] = fMult(G_m[0], inverse_weight_limited); +- H1_m[1] = fMult(G_m[1], inverse_weight_limited); +- +- *pH1_e = G_e + H1_SCALE_FACTOR; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_close_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX *phEnhancedTimeDmx) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (phEnhancedTimeDmx == NULL) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if (*phEnhancedTimeDmx != NULL) { +- if ((*phEnhancedTimeDmx)->sinusWindow_m != NULL) { +- FDK_FREE_MEMORY_1D((*phEnhancedTimeDmx)->sinusWindow_m); +- } +- FDK_FREE_MEMORY_1D(*phEnhancedTimeDmx); +- } +- } +- return error; +-} +diff --git a/libSACenc/src/sacenc_dmx_tdom_enh.h b/libSACenc/src/sacenc_dmx_tdom_enh.h +deleted file mode 100644 +index 0b39911..0000000 +--- a/libSACenc/src/sacenc_dmx_tdom_enh.h ++++ /dev/null +@@ -1,134 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Luis Valero +- +- Description: Enhanced Time Domain Downmix +- +-*******************************************************************************/ +- +-#ifndef SACENC_DMX_TDOM_ENH_H +-#define SACENC_DMX_TDOM_ENH_H +- +-/* Includes ******************************************************************/ +-#include "sacenc_lib.h" +-#include "common_fix.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +-typedef struct T_ENHANCED_TIME_DOMAIN_DMX *HANDLE_ENHANCED_TIME_DOMAIN_DMX; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_open_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX *hEnhancedTimeDmx, const INT framelength); +- +-FDK_SACENC_ERROR fdk_sacenc_init_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, +- const FIXP_DBL *const pInputGain_m, const INT inputGain_e, +- const FIXP_DBL outputGain_m, const INT outputGain_e, const INT framelength); +- +-FDK_SACENC_ERROR fdk_sacenc_apply_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, +- const INT_PCM *const *const inputTime, INT_PCM *const outputTimeDmx, +- const INT InputDelay); +- +-FDK_SACENC_ERROR fdk_sacenc_close_enhancedTimeDomainDmx( +- HANDLE_ENHANCED_TIME_DOMAIN_DMX *hEnhancedTimeDmx); +- +-#endif /* SACENC_DMX_TDOM_ENH_H */ +diff --git a/libSACenc/src/sacenc_filter.cpp b/libSACenc/src/sacenc_filter.cpp +deleted file mode 100644 +index 79f0797..0000000 +--- a/libSACenc/src/sacenc_filter.cpp ++++ /dev/null +@@ -1,207 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Multrus +- +- Description: Encoder Library +- Filter functions +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_filter.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +-typedef struct T_DC_FILTER { +- FIXP_DBL c__FDK; +- FIXP_DBL state__FDK; +- +-} DC_FILTER; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_createDCFilter(HANDLE_DC_FILTER *hDCFilter) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hDCFilter) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDK_ALLOCATE_MEMORY_1D(*hDCFilter, 1, DC_FILTER); +- } +- return error; +- +-bail: +- fdk_sacenc_destroyDCFilter(hDCFilter); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_initDCFilter(HANDLE_DC_FILTER hDCFilter, +- const UINT sampleRate) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- FIXP_DBL expC; +- int s; +- +- /* Conversion for use of CalcInvLdData: e^x = 2^(x*log10(e)/log10(2) = +- CalcInvLdData(x*log10(e)/log10(2)/64.0) 1.44269504089 = log10(e)/log10(2) +- 0.5 = scale constant value with 1 Bits +- */ +- expC = fDivNormHighPrec((FIXP_DBL)20, (FIXP_DBL)sampleRate, &s); +- expC = fMultDiv2(FL2FXCONST_DBL(-1.44269504089 * 0.5), expC) >> +- (LD_DATA_SHIFT - 1 - 1); +- +- if (s < 0) +- expC = expC >> (-s); +- else +- expC = expC << (s); +- +- expC = CalcInvLdData(expC); +- +- hDCFilter->c__FDK = expC; +- hDCFilter->state__FDK = FL2FXCONST_DBL(0.0f); +- +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_destroyDCFilter(HANDLE_DC_FILTER *hDCFilter) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hDCFilter != NULL) && (*hDCFilter != NULL)) { +- FDKfree(*hDCFilter); +- +- *hDCFilter = NULL; +- } +- +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_applyDCFilter(HANDLE_DC_FILTER hDCFilter, +- const INT_PCM *const signalIn, +- INT_PCM *const signalOut, +- const INT signalLength) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hDCFilter == NULL) || (signalIn == NULL) || (signalOut == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- const INT_PCM *const x = signalIn; +- INT_PCM *const y = signalOut; +- const FIXP_DBL c = hDCFilter->c__FDK; +- FIXP_DBL *const state = &hDCFilter->state__FDK; +- int i; +- FIXP_DBL x0, x1, y1; +- +- x1 = x0 = FX_PCM2FX_DBL(x[0]) >> DC_FILTER_SF; +- y1 = x0 + (*state); +- +- for (i = 1; i < signalLength; i++) { +- x0 = FX_PCM2FX_DBL(x[i]) >> DC_FILTER_SF; +- y[i - 1] = FX_DBL2FX_PCM(y1); +- y1 = x0 - x1 + fMult(c, y1); +- x1 = x0; +- } +- +- *state = fMult(c, y1) - x1; +- y[i - 1] = FX_DBL2FX_PCM(y1); +- } +- +- return error; +-} +diff --git a/libSACenc/src/sacenc_filter.h b/libSACenc/src/sacenc_filter.h +deleted file mode 100644 +index 10e3abd..0000000 +--- a/libSACenc/src/sacenc_filter.h ++++ /dev/null +@@ -1,133 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Multrus +- +- Description: Encoder Library Interface +- Filter functions +- +-*******************************************************************************/ +- +-#ifndef SACENC_FILTER_H +-#define SACENC_FILTER_H +- +-/* Includes ******************************************************************/ +-#include "common_fix.h" +-#include "sacenc_lib.h" +-#include "FDK_matrixCalloc.h" +- +-/* Defines *******************************************************************/ +-#define DC_FILTER_SF 1 +- +-/* Data Types ****************************************************************/ +-typedef struct T_DC_FILTER *HANDLE_DC_FILTER; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_createDCFilter(HANDLE_DC_FILTER *hDCFilter); +- +-FDK_SACENC_ERROR fdk_sacenc_initDCFilter(HANDLE_DC_FILTER hDCFilter, +- const UINT sampleRate); +- +-FDK_SACENC_ERROR fdk_sacenc_destroyDCFilter(HANDLE_DC_FILTER *hDCFilter); +- +-FDK_SACENC_ERROR fdk_sacenc_applyDCFilter(HANDLE_DC_FILTER hDCFilter, +- const INT_PCM *const signalIn, +- INT_PCM *const signalOut, +- const INT signalLength); +- +-#endif /* SACENC_FILTER_H */ +diff --git a/libSACenc/src/sacenc_framewindowing.cpp b/libSACenc/src/sacenc_framewindowing.cpp +deleted file mode 100644 +index 15f0f0a..0000000 +--- a/libSACenc/src/sacenc_framewindowing.cpp ++++ /dev/null +@@ -1,568 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Get windows for framing +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- Description of file contents +- ******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_framewindowing.h" +-#include "sacenc_vectorfunctions.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +-typedef struct T_FRAMEWINDOW { +- INT nTimeSlotsMax; +- INT bFrameKeep; +- INT startSlope; +- INT stopSlope; +- INT startRect; +- INT stopRect; +- +- INT taperAnaLen; +- INT taperSynLen; +- FIXP_WIN pTaperAna__FDK[MAX_TIME_SLOTS]; +- FIXP_WIN pTaperSyn__FDK[MAX_TIME_SLOTS]; +- +-} FRAMEWINDOW; +- +-typedef enum { +- FIX_INVALID = -1, +- FIX_RECT_SMOOTH = 0, +- FIX_SMOOTH_RECT = 1, +- FIX_LARGE_SMOOTH = 2, +- FIX_RECT_TRIANG = 3 +- +-} FIX_TYPE; +- +-typedef enum { +- VAR_INVALID = -1, +- VAR_HOLD = 0, +- VAR_ISOLATE = 1 +- +-} VAR_TYPE; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static void calcTaperWin(FIXP_WIN *pTaperWin, INT timeSlots) { +- FIXP_DBL x; +- int i, scale; +- +- for (i = 0; i < timeSlots; i++) { +- x = fDivNormHighPrec((FIXP_DBL)i, (FIXP_DBL)timeSlots, &scale); +- +- if (scale < 0) { +- pTaperWin[i] = FX_DBL2FX_WIN(x >> (-scale)); +- } else { +- pTaperWin[i] = FX_DBL2FX_WIN(x << (scale)); +- } +- } +- pTaperWin[timeSlots] = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Create( +- HANDLE_FRAMEWINDOW *phFrameWindow) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == phFrameWindow) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* Memory Allocation */ +- FDK_ALLOCATE_MEMORY_1D(*phFrameWindow, 1, FRAMEWINDOW); +- } +- return error; +- +-bail: +- fdk_sacenc_frameWindow_Destroy(phFrameWindow); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Init( +- HANDLE_FRAMEWINDOW hFrameWindow, +- const FRAMEWINDOW_CONFIG *const pFrameWindowConfig) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hFrameWindow == NULL) || (pFrameWindowConfig == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else if (pFrameWindowConfig->nTimeSlotsMax < 0) { +- error = SACENC_INIT_ERROR; +- } else { +- int ts; +- hFrameWindow->bFrameKeep = pFrameWindowConfig->bFrameKeep; +- hFrameWindow->nTimeSlotsMax = pFrameWindowConfig->nTimeSlotsMax; +- +- FIXP_WIN winMaxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL); +- int timeSlots = pFrameWindowConfig->nTimeSlotsMax; +- { +- hFrameWindow->startSlope = 0; +- hFrameWindow->stopSlope = ((3 * timeSlots) >> 1) - 1; +- hFrameWindow->startRect = timeSlots >> 1; +- hFrameWindow->stopRect = timeSlots; +- calcTaperWin(hFrameWindow->pTaperSyn__FDK, timeSlots >> 1); +- hFrameWindow->taperSynLen = timeSlots >> 1; +- } +- +- /* Calculate Taper for non-rect. ana. windows */ +- hFrameWindow->taperAnaLen = +- hFrameWindow->startRect - hFrameWindow->startSlope; +- for (ts = 0; ts < hFrameWindow->taperAnaLen; ts++) { +- { hFrameWindow->pTaperAna__FDK[ts] = winMaxVal; } +- } +- } +- +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Destroy( +- HANDLE_FRAMEWINDOW *phFrameWindow) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL != phFrameWindow) && (NULL != *phFrameWindow)) { +- FDKfree(*phFrameWindow); +- *phFrameWindow = NULL; +- } +- return error; +-} +- +-static FDK_SACENC_ERROR FrameWinList_Reset(FRAMEWIN_LIST *const pFrameWinList) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pFrameWinList) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int k = 0; +- for (k = 0; k < MAX_NUM_PARAMS; k++) { +- pFrameWinList->dat[k].slot = -1; +- pFrameWinList->dat[k].hold = FW_INTP; +- } +- pFrameWinList->n = 0; +- } +- return error; +-} +- +-static FDK_SACENC_ERROR FrameWindowList_Add(FRAMEWIN_LIST *const pFrameWinList, +- const INT slot, +- const FW_SLOTTYPE hold) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pFrameWinList) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if (pFrameWinList->n >= MAX_NUM_PARAMS) { /* Place left in List ?*/ +- error = SACENC_PARAM_ERROR; +- } else if (pFrameWinList->n > 0 && +- pFrameWinList->dat[pFrameWinList->n - 1].slot - slot > 0) { +- error = SACENC_PARAM_ERROR; +- } else { +- pFrameWinList->dat[pFrameWinList->n].slot = slot; +- pFrameWinList->dat[pFrameWinList->n].hold = hold; +- pFrameWinList->n++; +- } +- } +- return error; +-} +- +-static FDK_SACENC_ERROR FrameWindowList_Remove( +- FRAMEWIN_LIST *const pFrameWinList, const INT idx) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pFrameWinList) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int k = 0; +- if (idx < 0 || idx >= MAX_NUM_PARAMS) { +- error = SACENC_PARAM_ERROR; +- } else if (pFrameWinList->n > 0) { +- if (idx == MAX_NUM_PARAMS - 1) { +- pFrameWinList->dat[idx].slot = -1; +- pFrameWinList->dat[idx].hold = FW_INTP; +- } else { +- for (k = idx; k < MAX_NUM_PARAMS - 1; k++) { +- pFrameWinList->dat[k] = pFrameWinList->dat[k + 1]; +- } +- } +- pFrameWinList->n--; +- } +- } +- return error; +-} +- +-static FDK_SACENC_ERROR FrameWindowList_Limit( +- FRAMEWIN_LIST *const pFrameWinList, const INT ll /*lower limit*/, +- const INT ul /*upper limit*/ +-) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == pFrameWinList) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int k = 0; +- for (k = 0; k < pFrameWinList->n; k++) { +- if (pFrameWinList->dat[k].slot < ll || pFrameWinList->dat[k].slot > ul) { +- FrameWindowList_Remove(pFrameWinList, k); +- --k; +- } +- } +- } +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_GetWindow( +- HANDLE_FRAMEWINDOW hFrameWindow, INT tr_pos[MAX_NUM_PARAMS], +- const INT timeSlots, FRAMINGINFO *const pFramingInfo, +- FIXP_WIN *pWindowAna__FDK[MAX_NUM_PARAMS], +- FRAMEWIN_LIST *const pFrameWinList, const INT avoid_keep) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hFrameWindow == NULL) || (tr_pos == NULL) || (pFramingInfo == NULL) || +- (pFrameWinList == NULL) || (pWindowAna__FDK == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- const VAR_TYPE varType = VAR_HOLD; +- const int tranL = 4; +- int winCnt = 0; +- int w, ps; +- +- int startSlope = hFrameWindow->startSlope; +- int stopSlope = hFrameWindow->stopSlope; +- int startRect = hFrameWindow->startRect; +- int stopRect = hFrameWindow->stopRect; +- int taperAnaLen = hFrameWindow->taperAnaLen; +- +- FIXP_WIN winMaxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL); +- FIXP_WIN applyRightWindowGain__FDK[MAX_NUM_PARAMS]; +- FIXP_WIN *pTaperAna__FDK = hFrameWindow->pTaperAna__FDK; +- +- /* sanity check */ +- for (ps = 0; ps < MAX_NUM_PARAMS; ps++) { +- if (pWindowAna__FDK[ps] == NULL) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- } +- +- if ((timeSlots > hFrameWindow->nTimeSlotsMax) || (timeSlots < 0)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* Reset */ +- if (SACENC_OK != (error = FrameWinList_Reset(pFrameWinList))) goto bail; +- +- FDKmemclear(applyRightWindowGain__FDK, sizeof(applyRightWindowGain__FDK)); +- +- if (tr_pos[0] > -1) { /* Transients in first (left) half? */ +- int p_l = tr_pos[0]; +- winCnt = 0; +- +- /* Create Parameter Positions */ +- switch (varType) { +- case VAR_HOLD: +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, p_l - 1, FW_HOLD))) +- goto bail; +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, p_l, FW_INTP))) +- goto bail; +- break; +- case VAR_ISOLATE: +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, p_l - 1, FW_HOLD))) +- goto bail; +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, p_l, FW_INTP))) +- goto bail; +- if (SACENC_OK != (error = FrameWindowList_Add(pFrameWinList, +- p_l + tranL, FW_HOLD))) +- goto bail; +- if (SACENC_OK != (error = FrameWindowList_Add( +- pFrameWinList, p_l + tranL + 1, FW_INTP))) +- goto bail; +- break; +- default: +- error = SACENC_INVALID_CONFIG; +- break; +- } +- +- /* Outside of frame? => Kick Out */ +- if (SACENC_OK != +- (error = FrameWindowList_Limit(pFrameWinList, 0, timeSlots - 1))) +- goto bail; +- +- /* Add timeSlots as temporary border for window creation */ +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, timeSlots - 1, FW_HOLD))) +- goto bail; +- +- /* Create Windows */ +- for (ps = 0; ps < pFrameWinList->n - 1; ps++) { +- if (FW_HOLD != pFrameWinList->dat[ps].hold) { +- int const start = pFrameWinList->dat[ps].slot; +- int const stop = pFrameWinList->dat[ps + 1].slot; +- +- /* Analysis Window */ +- FDKmemset_flex(pWindowAna__FDK[winCnt], FX_DBL2FX_WIN((FIXP_DBL)0), +- start); +- FDKmemset_flex(&pWindowAna__FDK[winCnt][start], winMaxVal, +- stop - start + 1); +- FDKmemset_flex(&pWindowAna__FDK[winCnt][stop + 1], +- FX_DBL2FX_WIN((FIXP_DBL)0), timeSlots - stop - 1); +- +- applyRightWindowGain__FDK[winCnt] = +- pWindowAna__FDK[winCnt][timeSlots - 1]; +- winCnt++; +- } +- } /* ps */ +- +- /* Pop temporary frame border */ +- if (SACENC_OK != +- (error = FrameWindowList_Remove(pFrameWinList, pFrameWinList->n - 1))) +- goto bail; +- } else { /* No transient in left half of ana. window */ +- winCnt = 0; +- +- /* Add paramter set at end of frame */ +- if (SACENC_OK != +- (error = FrameWindowList_Add(pFrameWinList, timeSlots - 1, FW_INTP))) +- goto bail; +- /* Analysis Window */ +- FDKmemset_flex(pWindowAna__FDK[winCnt], FX_DBL2FX_WIN((FIXP_DBL)0), +- startSlope); +- FDKmemcpy_flex(&pWindowAna__FDK[winCnt][startSlope], 1, pTaperAna__FDK, 1, +- taperAnaLen); +- FDKmemset_flex(&pWindowAna__FDK[winCnt][startRect], winMaxVal, +- timeSlots - startRect); +- +- applyRightWindowGain__FDK[winCnt] = winMaxVal; +- winCnt++; +- } /* if (tr_pos[0] > -1) */ +- +- for (w = 0; w < winCnt; w++) { +- if (applyRightWindowGain__FDK[w] > (FIXP_WIN)0) { +- if (tr_pos[1] > -1) { /* Transients in second (right) half? */ +- int p_r = tr_pos[1]; +- +- /* Analysis Window */ +- FDKmemset_flex(&pWindowAna__FDK[w][timeSlots], winMaxVal, +- p_r - timeSlots); +- FDKmemset_flex(&pWindowAna__FDK[w][p_r], FX_DBL2FX_WIN((FIXP_DBL)0), +- 2 * timeSlots - p_r); +- +- } else { /* No transient in right half of ana. window */ +- /* Analysis Window */ +- FDKmemset_flex(&pWindowAna__FDK[w][timeSlots], winMaxVal, +- stopRect - timeSlots + 1); +- FDKmemcpy_flex(&pWindowAna__FDK[w][stopRect], 1, +- &pTaperAna__FDK[taperAnaLen - 1], -1, taperAnaLen); +- FDKmemset_flex(&pWindowAna__FDK[w][stopSlope + 1], +- FX_DBL2FX_WIN((FIXP_DBL)0), +- 2 * timeSlots - stopSlope - 1); +- +- } /* if (tr_pos[1] > -1) */ +- +- /* Weight */ +- if (applyRightWindowGain__FDK[w] < winMaxVal) { +- int ts; +- for (ts = 0; ts < timeSlots; ts++) { +- pWindowAna__FDK[w][timeSlots + ts] = +- FX_DBL2FX_WIN(fMult(pWindowAna__FDK[w][timeSlots + ts], +- applyRightWindowGain__FDK[w])); +- } +- } +- } /* if (applyRightWindowGain[w] > 0.0f) */ +- else { +- /* All Zero */ +- FDKmemset_flex(&pWindowAna__FDK[w][timeSlots], +- FX_DBL2FX_WIN((FIXP_DBL)0), timeSlots); +- } +- } /* loop over windows */ +- +- if (hFrameWindow->bFrameKeep == 1) { +- FDKmemcpy_flex(&pWindowAna__FDK[0][2 * timeSlots], 1, +- &pWindowAna__FDK[0][timeSlots], 1, timeSlots); +- FDKmemcpy_flex(&pWindowAna__FDK[0][timeSlots], 1, pWindowAna__FDK[0], 1, +- timeSlots); +- +- if (avoid_keep != 0) { +- FDKmemset_flex(pWindowAna__FDK[0], FX_DBL2FX_WIN((FIXP_DBL)0), +- timeSlots); +- } else { +- FDKmemset_flex(pWindowAna__FDK[0], winMaxVal, timeSlots); +- } +- } /* if (hFrameWindow->bFrameKeep==1) */ +- +- /* Feed Info to Bitstream Formatter */ +- pFramingInfo->numParamSets = pFrameWinList->n; +- pFramingInfo->bsFramingType = 1; /* variable framing */ +- for (ps = 0; ps < pFramingInfo->numParamSets; ps++) { +- pFramingInfo->bsParamSlots[ps] = pFrameWinList->dat[ps].slot; +- } +- +- /* if there is just one param set at last slot, +- use fixed framing to save some bits */ +- if ((pFramingInfo->numParamSets == 1) && +- (pFramingInfo->bsParamSlots[0] == timeSlots - 1)) { +- pFramingInfo->bsFramingType = 0; +- } +- +- } /* valid handle */ +- +-bail: +- +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_analysisWindowing( +- const INT nTimeSlots, const INT startTimeSlot, +- FIXP_WIN *pFrameWindowAna__FDK, const FIXP_DPK *const *const ppDataIn__FDK, +- FIXP_DPK *const *const ppDataOut__FDK, const INT nHybridBands, +- const INT dim) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((pFrameWindowAna__FDK == NULL) || (ppDataIn__FDK == NULL) || +- (ppDataOut__FDK == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i, ts; +- FIXP_WIN maxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL); +- +- if (dim == FW_CHANGE_DIM) { +- for (ts = startTimeSlot; ts < nTimeSlots; ts++) { +- FIXP_WIN win = pFrameWindowAna__FDK[ts]; +- if (win == maxVal) { +- for (i = 0; i < nHybridBands; i++) { +- ppDataOut__FDK[i][ts].v.re = ppDataIn__FDK[ts][i].v.re; +- ppDataOut__FDK[i][ts].v.im = ppDataIn__FDK[ts][i].v.im; +- } +- } else { +- for (i = 0; i < nHybridBands; i++) { +- ppDataOut__FDK[i][ts].v.re = fMult(win, ppDataIn__FDK[ts][i].v.re); +- ppDataOut__FDK[i][ts].v.im = fMult(win, ppDataIn__FDK[ts][i].v.im); +- } +- } +- } /* ts */ +- } else { +- for (ts = startTimeSlot; ts < nTimeSlots; ts++) { +- FIXP_WIN win = pFrameWindowAna__FDK[ts]; +- if (win == maxVal) { +- for (i = 0; i < nHybridBands; i++) { +- ppDataOut__FDK[ts][i].v.re = ppDataIn__FDK[ts][i].v.re; +- ppDataOut__FDK[ts][i].v.im = ppDataIn__FDK[ts][i].v.im; +- } +- } else { +- for (i = 0; i < nHybridBands; i++) { +- ppDataOut__FDK[ts][i].v.re = fMult(win, ppDataIn__FDK[ts][i].v.re); +- ppDataOut__FDK[ts][i].v.im = fMult(win, ppDataIn__FDK[ts][i].v.im); +- } +- } +- } /* ts */ +- } +- } +- +- return error; +-} +diff --git a/libSACenc/src/sacenc_framewindowing.h b/libSACenc/src/sacenc_framewindowing.h +deleted file mode 100644 +index 6b22dc9..0000000 +--- a/libSACenc/src/sacenc_framewindowing.h ++++ /dev/null +@@ -1,181 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Get windows for framing +- +-*******************************************************************************/ +- +-#ifndef SACENC_FRAMEWINDOWING_H +-#define SACENC_FRAMEWINDOWING_H +- +-/**************************************************************************/ /** +- \file +- Description of file contents +- ******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "genericStds.h" +-#include "common_fix.h" +-#include "sacenc_lib.h" +-#include "sacenc_bitstream.h" +- +-/* Defines *******************************************************************/ +-#define FIXP_WIN FIXP_DBL +-#define FX_DBL2FX_WIN(x) (x) +-#define DALDATATYPE_WIN DALDATATYPE_DFRACT +- +-typedef enum { +- FW_INTP = 0, +- FW_HOLD = 1 +- +-} FW_SLOTTYPE; +- +-typedef enum { +- FW_LEAVE_DIM = 0, +- FW_CHANGE_DIM = 1 +- +-} FW_DIMENSION; +- +-/* Data Types ****************************************************************/ +-typedef struct T_FRAMEWINDOW *HANDLE_FRAMEWINDOW; +- +-typedef struct T_FRAMEWINDOW_CONFIG { +- INT nTimeSlotsMax; +- INT bFrameKeep; +- +-} FRAMEWINDOW_CONFIG; +- +-typedef struct { +- INT slot; +- FW_SLOTTYPE hold; +- +-} FRAMEWIN_DATA; +- +-typedef struct { +- FRAMEWIN_DATA dat[MAX_NUM_PARAMS]; +- INT n; +- +-} FRAMEWIN_LIST; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Create( +- HANDLE_FRAMEWINDOW *phFrameWindow); +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Init( +- HANDLE_FRAMEWINDOW hFrameWindow, +- const FRAMEWINDOW_CONFIG *const pFrameWindowConfig); +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_Destroy( +- HANDLE_FRAMEWINDOW *phFrameWindow); +- +-FDK_SACENC_ERROR fdk_sacenc_frameWindow_GetWindow( +- HANDLE_FRAMEWINDOW hFrameWindow, INT tr_pos[MAX_NUM_PARAMS], +- const INT timeSlots, FRAMINGINFO *const pFramingInfo, +- FIXP_WIN *pWindowAna__FDK[MAX_NUM_PARAMS], +- FRAMEWIN_LIST *const pFrameWinList, const INT avoid_keep); +- +-FDK_SACENC_ERROR fdk_sacenc_analysisWindowing( +- const INT nTimeSlots, const INT startTimeSlot, +- FIXP_WIN *pFrameWindowAna__FDK, const FIXP_DPK *const *const ppDataIn__FDK, +- FIXP_DPK *const *const ppDataOut__FDK, const INT nHybridBands, +- const INT dim); +- +-#endif /* SACENC_FRAMEWINDOWING_H */ +diff --git a/libSACenc/src/sacenc_huff_tab.cpp b/libSACenc/src/sacenc_huff_tab.cpp +deleted file mode 100644 +index 7b28ecd..0000000 +--- a/libSACenc/src/sacenc_huff_tab.cpp ++++ /dev/null +@@ -1,997 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Markus Lohwasser +- +- Description: SAC-Encoder constant huffman tables +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_huff_tab.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +- +-/* Constants *****************************************************************/ +-const HUFF_CLD_TABLE fdk_sacenc_huffCLDTab = { +- {/* h1D[2][31] */ +- {HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000002, 2), +- HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x000000fe, 8), +- HUFF_PACK(0x000001fe, 9), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x000007fe, 11), HUFF_PACK(0x00000ffe, 12), +- HUFF_PACK(0x00001ffe, 13), HUFF_PACK(0x00007ffe, 15), +- HUFF_PACK(0x00007ffc, 15), HUFF_PACK(0x0000fffe, 16), +- HUFF_PACK(0x0000fffa, 16), HUFF_PACK(0x0001fffe, 17), +- HUFF_PACK(0x0001fff6, 17), HUFF_PACK(0x0003fffe, 18), +- HUFF_PACK(0x0003ffff, 18), HUFF_PACK(0x0007ffde, 19), +- HUFF_PACK(0x0003ffee, 18), HUFF_PACK(0x000fffbe, 20), +- HUFF_PACK(0x001fff7e, 21), HUFF_PACK(0x00fffbfc, 24), +- HUFF_PACK(0x00fffbfd, 24), HUFF_PACK(0x00fffbfe, 24), +- HUFF_PACK(0x00fffbff, 24), HUFF_PACK(0x007ffdfc, 23), +- HUFF_PACK(0x007ffdfd, 23)}, +- {HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000002, 2), +- HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x000001fc, 9), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x000003fa, 10), HUFF_PACK(0x000007fe, 11), +- HUFF_PACK(0x000007f6, 11), HUFF_PACK(0x00000ffe, 12), +- HUFF_PACK(0x00000fee, 12), HUFF_PACK(0x00001ffe, 13), +- HUFF_PACK(0x00001fde, 13), HUFF_PACK(0x00003ffe, 14), +- HUFF_PACK(0x00003fbe, 14), HUFF_PACK(0x00003fbf, 14), +- HUFF_PACK(0x00007ffe, 15), HUFF_PACK(0x0000fffe, 16), +- HUFF_PACK(0x0001fffe, 17), HUFF_PACK(0x0007fffe, 19), +- HUFF_PACK(0x0007fffc, 19), HUFF_PACK(0x000ffffa, 20), +- HUFF_PACK(0x001ffffc, 21), HUFF_PACK(0x001ffffd, 21), +- HUFF_PACK(0x001ffffe, 21), HUFF_PACK(0x001fffff, 21), +- HUFF_PACK(0x000ffffb, 20)}}, +- { /* HUFF_CLD_TAB_2D */ +- { /* HUFF_CLD_TAB_2D[0][] */ +- {/* HUFF_CLD_TAB_2D[0][0] */ +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x00000002, 3), +- HUFF_PACK(0x00000004, 5), HUFF_PACK(0x0000003e, 8)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000007, 4), +- HUFF_PACK(0x0000000e, 6), HUFF_PACK(0x000000fe, 10)}, +- {HUFF_PACK(0x0000007e, 9), HUFF_PACK(0x0000001e, 7), +- HUFF_PACK(0x0000000c, 6), HUFF_PACK(0x00000005, 5)}, +- {HUFF_PACK(0x000000ff, 10), HUFF_PACK(0x0000000d, 6), +- HUFF_PACK(0x00000000, 3), HUFF_PACK(0x00000003, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000002, 3), HUFF_PACK(0x00000003, 3), +- HUFF_PACK(0x00000010, 5), HUFF_PACK(0x0000007c, 7), +- HUFF_PACK(0x000000d6, 8), HUFF_PACK(0x000003ee, 10)}, +- {HUFF_PACK(0x0000000a, 4), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x00000016, 5), HUFF_PACK(0x00000034, 6), +- HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x00001f7e, 13)}, +- {HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x00000036, 6), +- HUFF_PACK(0x00000026, 6), HUFF_PACK(0x00000046, 7), +- HUFF_PACK(0x0000011e, 9), HUFF_PACK(0x000001f6, 9)}, +- {HUFF_PACK(0x0000011f, 9), HUFF_PACK(0x000000d7, 8), +- HUFF_PACK(0x0000008e, 8), HUFF_PACK(0x000000ff, 8), +- HUFF_PACK(0x0000006a, 7), HUFF_PACK(0x0000004e, 7)}, +- {HUFF_PACK(0x00000fbe, 12), HUFF_PACK(0x000007de, 11), +- HUFF_PACK(0x0000004f, 7), HUFF_PACK(0x00000037, 6), +- HUFF_PACK(0x00000017, 5), HUFF_PACK(0x0000001e, 5)}, +- {HUFF_PACK(0x00001f7f, 13), HUFF_PACK(0x000000fa, 8), +- HUFF_PACK(0x00000022, 6), HUFF_PACK(0x00000012, 5), +- HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x0000007c, 7), +- HUFF_PACK(0x000000be, 8), HUFF_PACK(0x0000017a, 9), +- HUFF_PACK(0x000000ee, 9), HUFF_PACK(0x000007b6, 11)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x00000016, 5), HUFF_PACK(0x00000026, 6), +- HUFF_PACK(0x0000003e, 7), HUFF_PACK(0x0000002e, 7), +- HUFF_PACK(0x000001ec, 9), HUFF_PACK(0x000047ce, 15)}, +- {HUFF_PACK(0x00000016, 6), HUFF_PACK(0x0000003c, 6), +- HUFF_PACK(0x00000022, 6), HUFF_PACK(0x0000004e, 7), +- HUFF_PACK(0x0000003f, 7), HUFF_PACK(0x0000005e, 8), +- HUFF_PACK(0x000008fa, 12), HUFF_PACK(0x000008fb, 12)}, +- {HUFF_PACK(0x0000005f, 8), HUFF_PACK(0x000000fa, 8), +- HUFF_PACK(0x000000bf, 8), HUFF_PACK(0x0000003a, 7), +- HUFF_PACK(0x000001f6, 9), HUFF_PACK(0x000001de, 10), +- HUFF_PACK(0x000003da, 10), HUFF_PACK(0x000007b7, 11)}, +- {HUFF_PACK(0x000001df, 10), HUFF_PACK(0x000003ee, 10), +- HUFF_PACK(0x0000017b, 9), HUFF_PACK(0x000003ef, 10), +- HUFF_PACK(0x000001ee, 9), HUFF_PACK(0x0000008e, 8), +- HUFF_PACK(0x000001ef, 9), HUFF_PACK(0x000001fe, 9)}, +- {HUFF_PACK(0x000008f8, 12), HUFF_PACK(0x0000047e, 11), +- HUFF_PACK(0x0000047f, 11), HUFF_PACK(0x00000076, 8), +- HUFF_PACK(0x0000003c, 7), HUFF_PACK(0x00000046, 7), +- HUFF_PACK(0x0000007a, 7), HUFF_PACK(0x0000007e, 7)}, +- {HUFF_PACK(0x000023e6, 14), HUFF_PACK(0x000011f2, 13), +- HUFF_PACK(0x000001ff, 9), HUFF_PACK(0x0000003d, 7), +- HUFF_PACK(0x0000004f, 7), HUFF_PACK(0x0000002e, 6), +- HUFF_PACK(0x00000012, 5), HUFF_PACK(0x00000004, 4)}, +- {HUFF_PACK(0x000047cf, 15), HUFF_PACK(0x0000011e, 9), +- HUFF_PACK(0x000000bc, 8), HUFF_PACK(0x000000fe, 8), +- HUFF_PACK(0x0000001c, 6), HUFF_PACK(0x00000010, 5), +- HUFF_PACK(0x0000000d, 4), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV9_2D */ +- {{HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000007, 4), +- HUFF_PACK(0x00000006, 5), HUFF_PACK(0x0000007e, 7), +- HUFF_PACK(0x0000000a, 7), HUFF_PACK(0x0000001e, 8), +- HUFF_PACK(0x0000008a, 9), HUFF_PACK(0x0000004e, 10), +- HUFF_PACK(0x00000276, 10), HUFF_PACK(0x000002e2, 11)}, +- {HUFF_PACK(0x00000000, 4), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x00000016, 5), HUFF_PACK(0x00000026, 6), +- HUFF_PACK(0x00000076, 7), HUFF_PACK(0x000000f2, 8), +- HUFF_PACK(0x00000012, 8), HUFF_PACK(0x0000005e, 8), +- HUFF_PACK(0x0000008b, 9), HUFF_PACK(0x00002e76, 15)}, +- {HUFF_PACK(0x00000012, 6), HUFF_PACK(0x00000007, 5), +- HUFF_PACK(0x00000038, 6), HUFF_PACK(0x0000007c, 7), +- HUFF_PACK(0x00000008, 7), HUFF_PACK(0x00000046, 8), +- HUFF_PACK(0x000000f6, 8), HUFF_PACK(0x000001ca, 9), +- HUFF_PACK(0x0000173a, 14), HUFF_PACK(0x00001738, 14)}, +- {HUFF_PACK(0x0000009e, 8), HUFF_PACK(0x0000004a, 7), +- HUFF_PACK(0x00000026, 7), HUFF_PACK(0x0000000c, 7), +- HUFF_PACK(0x0000004e, 8), HUFF_PACK(0x000000f7, 8), +- HUFF_PACK(0x0000013a, 9), HUFF_PACK(0x0000009e, 11), +- HUFF_PACK(0x000009fe, 12), HUFF_PACK(0x0000013e, 12)}, +- {HUFF_PACK(0x00000026, 9), HUFF_PACK(0x0000001a, 8), +- HUFF_PACK(0x000001e6, 9), HUFF_PACK(0x000001e2, 9), +- HUFF_PACK(0x000000ee, 8), HUFF_PACK(0x000001ce, 9), +- HUFF_PACK(0x00000277, 10), HUFF_PACK(0x000003ce, 10), +- HUFF_PACK(0x000002e6, 11), HUFF_PACK(0x000004fc, 11)}, +- {HUFF_PACK(0x000002e3, 11), HUFF_PACK(0x00000170, 10), +- HUFF_PACK(0x00000172, 10), HUFF_PACK(0x000000ba, 9), +- HUFF_PACK(0x0000003e, 9), HUFF_PACK(0x000001e3, 9), +- HUFF_PACK(0x0000001b, 8), HUFF_PACK(0x0000003f, 9), +- HUFF_PACK(0x0000009e, 9), HUFF_PACK(0x0000009f, 9)}, +- {HUFF_PACK(0x00000b9e, 13), HUFF_PACK(0x000009ff, 12), +- HUFF_PACK(0x000004fd, 11), HUFF_PACK(0x000004fe, 11), +- HUFF_PACK(0x000001cf, 9), HUFF_PACK(0x000000ef, 8), +- HUFF_PACK(0x00000044, 8), HUFF_PACK(0x0000005f, 8), +- HUFF_PACK(0x000000e4, 8), HUFF_PACK(0x000000f0, 8)}, +- {HUFF_PACK(0x00002e72, 15), HUFF_PACK(0x0000013f, 12), +- HUFF_PACK(0x00000b9f, 13), HUFF_PACK(0x0000013e, 9), +- HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x00000047, 8), +- HUFF_PACK(0x0000000e, 7), HUFF_PACK(0x0000007d, 7), +- HUFF_PACK(0x00000010, 6), HUFF_PACK(0x00000024, 6)}, +- {HUFF_PACK(0x00002e77, 15), HUFF_PACK(0x00005ce6, 16), +- HUFF_PACK(0x000000bb, 9), HUFF_PACK(0x000000e6, 8), +- HUFF_PACK(0x00000016, 8), HUFF_PACK(0x000000ff, 8), +- HUFF_PACK(0x0000007a, 7), HUFF_PACK(0x0000003a, 6), +- HUFF_PACK(0x00000017, 5), HUFF_PACK(0x00000002, 4)}, +- {HUFF_PACK(0x00005ce7, 16), HUFF_PACK(0x000003cf, 10), +- HUFF_PACK(0x00000017, 8), HUFF_PACK(0x000001cb, 9), +- HUFF_PACK(0x0000009c, 8), HUFF_PACK(0x0000004b, 7), +- HUFF_PACK(0x00000016, 6), HUFF_PACK(0x0000000a, 5), +- HUFF_PACK(0x00000008, 4), HUFF_PACK(0x00000006, 3)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }}, +- {/* HUFF_CLD_TAB_2D[0][1] */ +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000076e, 11), HUFF_PACK(0x00000ede, 12)}, +- {HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000003f, 6), +- HUFF_PACK(0x000003b6, 10), HUFF_PACK(0x0000003a, 6)}, +- {HUFF_PACK(0x0000001c, 5), HUFF_PACK(0x000000ee, 8), +- HUFF_PACK(0x000001da, 9), HUFF_PACK(0x0000001e, 5)}, +- {HUFF_PACK(0x000000ef, 8), HUFF_PACK(0x00000edf, 12), +- HUFF_PACK(0x000000ec, 8), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000001c, 5), +- HUFF_PACK(0x0000007e, 8), HUFF_PACK(0x00000efc, 12), +- HUFF_PACK(0x0000effe, 16), HUFF_PACK(0x0001dffe, 17)}, +- {HUFF_PACK(0x00000004, 3), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x0000003e, 7), HUFF_PACK(0x00000efe, 12), +- HUFF_PACK(0x000077fe, 15), HUFF_PACK(0x00000076, 7)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000016, 5), +- HUFF_PACK(0x000000be, 8), HUFF_PACK(0x00000efd, 12), +- HUFF_PACK(0x000000ee, 8), HUFF_PACK(0x0000000e, 5)}, +- {HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x0000002e, 6), +- HUFF_PACK(0x000001de, 9), HUFF_PACK(0x000003be, 10), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x0000001e, 5)}, +- {HUFF_PACK(0x0000007f, 7), HUFF_PACK(0x0000005e, 7), +- HUFF_PACK(0x00003bfe, 14), HUFF_PACK(0x000000fe, 9), +- HUFF_PACK(0x0000001e, 6), HUFF_PACK(0x00000002, 3)}, +- {HUFF_PACK(0x000000bf, 8), HUFF_PACK(0x0001dfff, 17), +- HUFF_PACK(0x00001dfe, 13), HUFF_PACK(0x000000ff, 9), +- HUFF_PACK(0x0000003a, 6), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000002, 3), HUFF_PACK(0x0000001c, 5), +- HUFF_PACK(0x000000bc, 8), HUFF_PACK(0x000005fc, 11), +- HUFF_PACK(0x00005ffe, 15), HUFF_PACK(0x0002ffde, 18), +- HUFF_PACK(0x000bff7e, 20), HUFF_PACK(0x0017feff, 21)}, +- {HUFF_PACK(0x00000004, 3), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x0000000e, 7), HUFF_PACK(0x000002fa, 10), +- HUFF_PACK(0x000001fe, 13), HUFF_PACK(0x0000bff2, 16), +- HUFF_PACK(0x0005ffbe, 19), HUFF_PACK(0x000000ee, 8)}, +- {HUFF_PACK(0x00000002, 4), HUFF_PACK(0x00000016, 5), +- HUFF_PACK(0x000000f6, 8), HUFF_PACK(0x000005fe, 11), +- HUFF_PACK(0x000001ff, 13), HUFF_PACK(0x0000bff6, 16), +- HUFF_PACK(0x000001de, 9), HUFF_PACK(0x0000007e, 7)}, +- {HUFF_PACK(0x00000000, 5), HUFF_PACK(0x0000003c, 6), +- HUFF_PACK(0x0000000e, 8), HUFF_PACK(0x0000003e, 10), +- HUFF_PACK(0x00002ffe, 14), HUFF_PACK(0x000002fb, 10), +- HUFF_PACK(0x000000f7, 8), HUFF_PACK(0x0000002e, 6)}, +- {HUFF_PACK(0x00000006, 6), HUFF_PACK(0x0000007a, 7), +- HUFF_PACK(0x0000000a, 8), HUFF_PACK(0x0000007e, 11), +- HUFF_PACK(0x000000fe, 12), HUFF_PACK(0x00000016, 9), +- HUFF_PACK(0x00000006, 7), HUFF_PACK(0x00000002, 5)}, +- {HUFF_PACK(0x0000000f, 7), HUFF_PACK(0x00000076, 7), +- HUFF_PACK(0x00000017, 9), HUFF_PACK(0x00005ff8, 15), +- HUFF_PACK(0x00000bfe, 12), HUFF_PACK(0x0000001e, 9), +- HUFF_PACK(0x0000007f, 7), HUFF_PACK(0x00000003, 4)}, +- {HUFF_PACK(0x00000004, 7), HUFF_PACK(0x000000bd, 8), +- HUFF_PACK(0x0000bff3, 16), HUFF_PACK(0x00005fff, 15), +- HUFF_PACK(0x00000bfa, 12), HUFF_PACK(0x0000017c, 9), +- HUFF_PACK(0x0000003a, 6), HUFF_PACK(0x00000003, 3)}, +- {HUFF_PACK(0x0000017e, 9), HUFF_PACK(0x0017fefe, 21), +- HUFF_PACK(0x00017fee, 17), HUFF_PACK(0x00005ffa, 15), +- HUFF_PACK(0x00000bfb, 12), HUFF_PACK(0x000001df, 9), +- HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x00000006, 3)}}, +- HUFF_PACK(0x0017feff, 21) /* escape */ +- }, +- { +- /* LAV9_2D */ +- {{HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x00000014, 5), +- HUFF_PACK(0x0000008e, 8), HUFF_PACK(0x000004fe, 11), +- HUFF_PACK(0x000023fe, 14), HUFF_PACK(0x00008ffe, 16), +- HUFF_PACK(0x0005ffbc, 19), HUFF_PACK(0x0017fef7, 21), +- HUFF_PACK(0x0017fef7, 21), HUFF_PACK(0x0017fef7, 21)}, +- {HUFF_PACK(0x00000002, 3), HUFF_PACK(0x00000002, 4), +- HUFF_PACK(0x00000044, 7), HUFF_PACK(0x0000027e, 10), +- HUFF_PACK(0x000017fc, 13), HUFF_PACK(0x0000bff6, 16), +- HUFF_PACK(0x0005ffbe, 19), HUFF_PACK(0x00011ff8, 17), +- HUFF_PACK(0x000bff7a, 20), HUFF_PACK(0x000000bc, 8)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000016, 5), +- HUFF_PACK(0x0000001a, 7), HUFF_PACK(0x000000fe, 10), +- HUFF_PACK(0x000011f6, 13), HUFF_PACK(0x0000bffe, 16), +- HUFF_PACK(0x00011ff9, 17), HUFF_PACK(0x0017fef6, 21), +- HUFF_PACK(0x0000011e, 9), HUFF_PACK(0x00000056, 7)}, +- {HUFF_PACK(0x00000010, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000009e, 8), HUFF_PACK(0x000007fe, 11), +- HUFF_PACK(0x000011f7, 13), HUFF_PACK(0x00005ff8, 15), +- HUFF_PACK(0x00017fee, 17), HUFF_PACK(0x000007ff, 11), +- HUFF_PACK(0x000000ae, 8), HUFF_PACK(0x0000001e, 7)}, +- {HUFF_PACK(0x00000026, 6), HUFF_PACK(0x0000000e, 6), +- HUFF_PACK(0x000001ee, 9), HUFF_PACK(0x0000047e, 11), +- HUFF_PACK(0x00000bfc, 12), HUFF_PACK(0x0000bfff, 16), +- HUFF_PACK(0x000008fa, 12), HUFF_PACK(0x0000006e, 9), +- HUFF_PACK(0x000001ef, 9), HUFF_PACK(0x0000007e, 7)}, +- {HUFF_PACK(0x0000007a, 7), HUFF_PACK(0x0000004e, 7), +- HUFF_PACK(0x0000007e, 9), HUFF_PACK(0x000000de, 10), +- HUFF_PACK(0x000011fe, 13), HUFF_PACK(0x00002ffe, 14), +- HUFF_PACK(0x000004ff, 11), HUFF_PACK(0x000000ff, 10), +- HUFF_PACK(0x000000bd, 8), HUFF_PACK(0x0000002e, 6)}, +- {HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x000000af, 8), +- HUFF_PACK(0x000001ec, 9), HUFF_PACK(0x000001be, 11), +- HUFF_PACK(0x00011ffe, 17), HUFF_PACK(0x00002ffa, 14), +- HUFF_PACK(0x000008fe, 12), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x00000046, 7), HUFF_PACK(0x00000012, 5)}, +- {HUFF_PACK(0x0000003e, 8), HUFF_PACK(0x00000045, 7), +- HUFF_PACK(0x000002fe, 10), HUFF_PACK(0x000bff7e, 20), +- HUFF_PACK(0x00005ff9, 15), HUFF_PACK(0x00005ffa, 15), +- HUFF_PACK(0x00000bfd, 12), HUFF_PACK(0x0000013e, 9), +- HUFF_PACK(0x0000000c, 6), HUFF_PACK(0x00000007, 4)}, +- {HUFF_PACK(0x000000be, 8), HUFF_PACK(0x00000036, 8), +- HUFF_PACK(0x000bff7f, 20), HUFF_PACK(0x00023ffe, 18), +- HUFF_PACK(0x00011ffa, 17), HUFF_PACK(0x00005ffe, 15), +- HUFF_PACK(0x000001bf, 11), HUFF_PACK(0x000001ed, 9), +- HUFF_PACK(0x0000002a, 6), HUFF_PACK(0x00000000, 3)}, +- {HUFF_PACK(0x0000017e, 9), HUFF_PACK(0x0017fef7, 21), +- HUFF_PACK(0x00047ffe, 19), HUFF_PACK(0x00047fff, 19), +- HUFF_PACK(0x00011ffb, 17), HUFF_PACK(0x00002ffb, 14), +- HUFF_PACK(0x0000047c, 11), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x0000003c, 6), HUFF_PACK(0x00000006, 3)}}, +- HUFF_PACK(0x0017fef7, 21) /* escape */ +- }}}, +- { /* HUFF_CLD_TAB_2D[1][] */ +- {/* HUFF_CLD_TAB_2D[1][0] */ +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x0000001e, 5), +- HUFF_PACK(0x000003be, 10), HUFF_PACK(0x00000efe, 12)}, +- {HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000001c, 5), +- HUFF_PACK(0x000001de, 9), HUFF_PACK(0x000000ea, 8)}, +- {HUFF_PACK(0x00000074, 7), HUFF_PACK(0x000000ee, 8), +- HUFF_PACK(0x000000eb, 8), HUFF_PACK(0x0000001f, 5)}, +- {HUFF_PACK(0x0000077e, 11), HUFF_PACK(0x00000eff, 12), +- HUFF_PACK(0x00000076, 7), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x00000006, 4), +- HUFF_PACK(0x00000024, 7), HUFF_PACK(0x0000025e, 11), +- HUFF_PACK(0x00003cfe, 14), HUFF_PACK(0x000079fe, 15)}, +- {HUFF_PACK(0x00000006, 3), HUFF_PACK(0x00000007, 4), +- HUFF_PACK(0x00000078, 7), HUFF_PACK(0x000003ce, 10), +- HUFF_PACK(0x00001e7e, 13), HUFF_PACK(0x000000be, 9)}, +- {HUFF_PACK(0x00000008, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x00000026, 7), HUFF_PACK(0x0000012e, 10), +- HUFF_PACK(0x000000bf, 9), HUFF_PACK(0x0000002e, 7)}, +- {HUFF_PACK(0x00000027, 7), HUFF_PACK(0x0000007a, 7), +- HUFF_PACK(0x000001e4, 9), HUFF_PACK(0x00000096, 9), +- HUFF_PACK(0x0000007b, 7), HUFF_PACK(0x0000003f, 6)}, +- {HUFF_PACK(0x000001e6, 9), HUFF_PACK(0x000001e5, 9), +- HUFF_PACK(0x00000f3e, 12), HUFF_PACK(0x0000005e, 8), +- HUFF_PACK(0x00000016, 6), HUFF_PACK(0x0000000e, 4)}, +- {HUFF_PACK(0x0000079e, 11), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x0000025f, 11), HUFF_PACK(0x0000004a, 8), +- HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x00000006, 4), +- HUFF_PACK(0x000000de, 8), HUFF_PACK(0x0000069e, 11), +- HUFF_PACK(0x000034fe, 14), HUFF_PACK(0x0001a7fe, 17), +- HUFF_PACK(0x00069ff6, 19), HUFF_PACK(0x00069ff7, 19)}, +- {HUFF_PACK(0x00000002, 3), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x0000006a, 7), HUFF_PACK(0x0000034e, 10), +- HUFF_PACK(0x00001fde, 13), HUFF_PACK(0x000069fe, 15), +- HUFF_PACK(0x0001a7fc, 17), HUFF_PACK(0x00000372, 10)}, +- {HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x0000003c, 6), +- HUFF_PACK(0x000000df, 8), HUFF_PACK(0x000001ee, 10), +- HUFF_PACK(0x00000dde, 12), HUFF_PACK(0x000069fa, 15), +- HUFF_PACK(0x00000373, 10), HUFF_PACK(0x0000007a, 8)}, +- {HUFF_PACK(0x0000003e, 7), HUFF_PACK(0x00000068, 7), +- HUFF_PACK(0x000001ba, 9), HUFF_PACK(0x000003f6, 10), +- HUFF_PACK(0x00000d3e, 12), HUFF_PACK(0x0000034c, 10), +- HUFF_PACK(0x000001fa, 9), HUFF_PACK(0x000000d2, 8)}, +- {HUFF_PACK(0x0000007e, 8), HUFF_PACK(0x0000007f, 8), +- HUFF_PACK(0x000001f8, 9), HUFF_PACK(0x000006ee, 11), +- HUFF_PACK(0x000003de, 11), HUFF_PACK(0x000001b8, 9), +- HUFF_PACK(0x000001fc, 9), HUFF_PACK(0x0000006b, 7)}, +- {HUFF_PACK(0x000000f6, 9), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x0000034d, 10), HUFF_PACK(0x00003fbe, 14), +- HUFF_PACK(0x000007f6, 11), HUFF_PACK(0x000003fa, 10), +- HUFF_PACK(0x0000003c, 7), HUFF_PACK(0x0000003d, 6)}, +- {HUFF_PACK(0x000003f7, 10), HUFF_PACK(0x00000376, 10), +- HUFF_PACK(0x0001a7ff, 17), HUFF_PACK(0x00003fbf, 14), +- HUFF_PACK(0x00000ddf, 12), HUFF_PACK(0x000001f9, 9), +- HUFF_PACK(0x00000036, 6), HUFF_PACK(0x0000000e, 4)}, +- {HUFF_PACK(0x000003df, 11), HUFF_PACK(0x00034ffa, 18), +- HUFF_PACK(0x000069fb, 15), HUFF_PACK(0x000034fc, 14), +- HUFF_PACK(0x00000fee, 12), HUFF_PACK(0x000001ff, 9), +- HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV9_2D */ +- {{HUFF_PACK(0x00000006, 3), HUFF_PACK(0x00000004, 4), +- HUFF_PACK(0x00000012, 7), HUFF_PACK(0x000007fe, 11), +- HUFF_PACK(0x00001f7e, 13), HUFF_PACK(0x0000fbfe, 16), +- HUFF_PACK(0x0001f7fe, 17), HUFF_PACK(0x000b7dfe, 21), +- HUFF_PACK(0x000b7dff, 21), HUFF_PACK(0x000b7dff, 21)}, +- {HUFF_PACK(0x00000000, 3), HUFF_PACK(0x00000006, 4), +- HUFF_PACK(0x0000007c, 7), HUFF_PACK(0x00000046, 9), +- HUFF_PACK(0x000007d0, 12), HUFF_PACK(0x00001f4e, 14), +- HUFF_PACK(0x0000b7fe, 17), HUFF_PACK(0x00005bee, 16), +- HUFF_PACK(0x00016fbe, 18), HUFF_PACK(0x000003ee, 10)}, +- {HUFF_PACK(0x00000006, 5), HUFF_PACK(0x0000000a, 5), +- HUFF_PACK(0x0000002e, 7), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x000007d2, 12), HUFF_PACK(0x00001f4f, 14), +- HUFF_PACK(0x00002dfe, 15), HUFF_PACK(0x0000b7de, 17), +- HUFF_PACK(0x000001fe, 10), HUFF_PACK(0x0000002e, 8)}, +- {HUFF_PACK(0x0000007a, 7), HUFF_PACK(0x0000007e, 7), +- HUFF_PACK(0x0000007a, 8), HUFF_PACK(0x000001fa, 10), +- HUFF_PACK(0x000007fe, 12), HUFF_PACK(0x00001f7c, 13), +- HUFF_PACK(0x000016fa, 14), HUFF_PACK(0x0000009e, 10), +- HUFF_PACK(0x00000020, 8), HUFF_PACK(0x00000021, 8)}, +- {HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x00000016, 7), +- HUFF_PACK(0x000000fe, 9), HUFF_PACK(0x0000016e, 10), +- HUFF_PACK(0x0000009f, 10), HUFF_PACK(0x00000b7c, 13), +- HUFF_PACK(0x000003de, 11), HUFF_PACK(0x000000b6, 9), +- HUFF_PACK(0x000000be, 9), HUFF_PACK(0x0000007c, 8)}, +- {HUFF_PACK(0x0000005a, 8), HUFF_PACK(0x00000078, 8), +- HUFF_PACK(0x00000047, 9), HUFF_PACK(0x00000044, 9), +- HUFF_PACK(0x000007ff, 12), HUFF_PACK(0x000007d1, 12), +- HUFF_PACK(0x000001f6, 10), HUFF_PACK(0x000001f7, 10), +- HUFF_PACK(0x0000002f, 8), HUFF_PACK(0x0000002c, 7)}, +- {HUFF_PACK(0x000000fc, 9), HUFF_PACK(0x000001f6, 9), +- HUFF_PACK(0x000000f6, 9), HUFF_PACK(0x000007ff, 11), +- HUFF_PACK(0x000016fe, 14), HUFF_PACK(0x000002de, 11), +- HUFF_PACK(0x000003ea, 11), HUFF_PACK(0x000000bf, 9), +- HUFF_PACK(0x000000fa, 8), HUFF_PACK(0x0000000a, 6)}, +- {HUFF_PACK(0x0000004e, 9), HUFF_PACK(0x00000026, 8), +- HUFF_PACK(0x000001ee, 10), HUFF_PACK(0x00005bfe, 16), +- HUFF_PACK(0x00003efe, 14), HUFF_PACK(0x00000b7e, 13), +- HUFF_PACK(0x000003eb, 11), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x0000007b, 7), HUFF_PACK(0x00000007, 5)}, +- {HUFF_PACK(0x000001fb, 10), HUFF_PACK(0x00000045, 9), +- HUFF_PACK(0x00016ffe, 18), HUFF_PACK(0x0001f7ff, 17), +- HUFF_PACK(0x00002df6, 15), HUFF_PACK(0x00001f7d, 13), +- HUFF_PACK(0x000003fe, 11), HUFF_PACK(0x0000005e, 8), +- HUFF_PACK(0x0000003c, 6), HUFF_PACK(0x0000000e, 4)}, +- {HUFF_PACK(0x000003df, 11), HUFF_PACK(0x0005befe, 20), +- HUFF_PACK(0x0002df7e, 19), HUFF_PACK(0x00016fff, 18), +- HUFF_PACK(0x00007dfe, 15), HUFF_PACK(0x00000fa6, 13), +- HUFF_PACK(0x000007de, 11), HUFF_PACK(0x00000079, 8), +- HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x000b7dff, 21) /* escape */ +- }}, +- {/* HUFF_CLD_TAB_2D[1][1] */ +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x000000fa, 8), HUFF_PACK(0x000007de, 11)}, +- {HUFF_PACK(0x0000000c, 4), HUFF_PACK(0x0000001e, 5), +- HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x000001f6, 9)}, +- {HUFF_PACK(0x000000ff, 8), HUFF_PACK(0x0000007c, 7), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x0000001a, 5)}, +- {HUFF_PACK(0x000007df, 11), HUFF_PACK(0x000003ee, 10), +- HUFF_PACK(0x0000001b, 5), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000007c, 7), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x00000fbe, 12), HUFF_PACK(0x00003efe, 14)}, +- {HUFF_PACK(0x00000000, 3), HUFF_PACK(0x00000001, 3), +- HUFF_PACK(0x0000003c, 6), HUFF_PACK(0x0000005e, 8), +- HUFF_PACK(0x000007de, 11), HUFF_PACK(0x000007be, 11)}, +- {HUFF_PACK(0x0000001e, 6), HUFF_PACK(0x0000000a, 5), +- HUFF_PACK(0x0000001f, 6), HUFF_PACK(0x0000005f, 8), +- HUFF_PACK(0x000001ee, 9), HUFF_PACK(0x000001f6, 9)}, +- {HUFF_PACK(0x000001fe, 9), HUFF_PACK(0x000000fe, 8), +- HUFF_PACK(0x000000f6, 8), HUFF_PACK(0x000000fa, 8), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x00000016, 6)}, +- {HUFF_PACK(0x000007bf, 11), HUFF_PACK(0x000003de, 10), +- HUFF_PACK(0x000003ee, 10), HUFF_PACK(0x0000007a, 7), +- HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x00000006, 4)}, +- {HUFF_PACK(0x00003eff, 14), HUFF_PACK(0x00001f7e, 13), +- HUFF_PACK(0x000003ff, 10), HUFF_PACK(0x0000002e, 7), +- HUFF_PACK(0x00000004, 4), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000002, 3), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x0000001a, 6), HUFF_PACK(0x000001be, 9), +- HUFF_PACK(0x000006e6, 11), HUFF_PACK(0x0000067a, 12), +- HUFF_PACK(0x00000cf2, 13), HUFF_PACK(0x000033de, 15)}, +- {HUFF_PACK(0x0000000c, 4), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x000000de, 8), +- HUFF_PACK(0x00000372, 10), HUFF_PACK(0x000003d6, 11), +- HUFF_PACK(0x00000678, 12), HUFF_PACK(0x00000cf6, 13)}, +- {HUFF_PACK(0x00000036, 6), HUFF_PACK(0x00000012, 5), +- HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x0000003c, 7), +- HUFF_PACK(0x000001b8, 9), HUFF_PACK(0x000003d4, 11), +- HUFF_PACK(0x0000033e, 11), HUFF_PACK(0x0000033f, 11)}, +- {HUFF_PACK(0x0000007e, 8), HUFF_PACK(0x0000006a, 7), +- HUFF_PACK(0x0000004e, 7), HUFF_PACK(0x0000007e, 7), +- HUFF_PACK(0x000001ba, 9), HUFF_PACK(0x000000ce, 9), +- HUFF_PACK(0x000000f6, 9), HUFF_PACK(0x000001ee, 10)}, +- {HUFF_PACK(0x000001ef, 10), HUFF_PACK(0x0000013e, 9), +- HUFF_PACK(0x0000007f, 8), HUFF_PACK(0x00000066, 8), +- HUFF_PACK(0x000000d6, 8), HUFF_PACK(0x0000003e, 7), +- HUFF_PACK(0x000000d7, 8), HUFF_PACK(0x0000009e, 8)}, +- {HUFF_PACK(0x000007ae, 12), HUFF_PACK(0x000001e8, 10), +- HUFF_PACK(0x000001e9, 10), HUFF_PACK(0x0000027e, 10), +- HUFF_PACK(0x00000032, 7), HUFF_PACK(0x00000018, 6), +- HUFF_PACK(0x00000026, 6), HUFF_PACK(0x00000034, 6)}, +- {HUFF_PACK(0x00000cf3, 13), HUFF_PACK(0x000007aa, 12), +- HUFF_PACK(0x000007ab, 12), HUFF_PACK(0x0000027f, 10), +- HUFF_PACK(0x000001bf, 9), HUFF_PACK(0x0000001b, 6), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000000b, 4)}, +- {HUFF_PACK(0x000033df, 15), HUFF_PACK(0x000019ee, 14), +- HUFF_PACK(0x000007af, 12), HUFF_PACK(0x000006e7, 11), +- HUFF_PACK(0x000001bb, 9), HUFF_PACK(0x0000007f, 7), +- HUFF_PACK(0x00000008, 4), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV9_2D */ +- {{HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x00000008, 4), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x000001ba, 10), HUFF_PACK(0x00000dbe, 12), +- HUFF_PACK(0x00000d7e, 13), HUFF_PACK(0x00001af6, 14), +- HUFF_PACK(0x00007fec, 15), HUFF_PACK(0x0001ffb6, 17)}, +- {HUFF_PACK(0x0000000a, 4), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x0000000c, 5), HUFF_PACK(0x00000036, 7), +- HUFF_PACK(0x000000de, 9), HUFF_PACK(0x000005fe, 11), +- HUFF_PACK(0x000006be, 12), HUFF_PACK(0x00001b7e, 13), +- HUFF_PACK(0x00007fee, 15), HUFF_PACK(0x00006dfe, 15)}, +- {HUFF_PACK(0x0000001e, 6), HUFF_PACK(0x0000000e, 5), +- HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x0000006a, 7), +- HUFF_PACK(0x000001ae, 9), HUFF_PACK(0x000006fe, 11), +- HUFF_PACK(0x00000376, 11), HUFF_PACK(0x00000dfe, 13), +- HUFF_PACK(0x00000dff, 13), HUFF_PACK(0x00000d7f, 13)}, +- {HUFF_PACK(0x000000b6, 8), HUFF_PACK(0x0000005e, 7), +- HUFF_PACK(0x0000007c, 7), HUFF_PACK(0x0000006e, 7), +- HUFF_PACK(0x0000006a, 8), HUFF_PACK(0x0000016a, 9), +- HUFF_PACK(0x00000ffe, 12), HUFF_PACK(0x00000dfe, 12), +- HUFF_PACK(0x00000ffc, 12), HUFF_PACK(0x00001bfe, 13)}, +- {HUFF_PACK(0x0000035e, 10), HUFF_PACK(0x000001b6, 9), +- HUFF_PACK(0x0000005e, 8), HUFF_PACK(0x000000b4, 8), +- HUFF_PACK(0x0000006c, 7), HUFF_PACK(0x0000017e, 9), +- HUFF_PACK(0x0000036e, 10), HUFF_PACK(0x000003ee, 10), +- HUFF_PACK(0x0000037e, 11), HUFF_PACK(0x00000377, 11)}, +- {HUFF_PACK(0x00000fff, 12), HUFF_PACK(0x000001ae, 10), +- HUFF_PACK(0x000001be, 10), HUFF_PACK(0x000001f6, 9), +- HUFF_PACK(0x000001be, 9), HUFF_PACK(0x000000da, 8), +- HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x0000016b, 9), +- HUFF_PACK(0x000000d6, 9), HUFF_PACK(0x0000037e, 10)}, +- {HUFF_PACK(0x000017fe, 13), HUFF_PACK(0x00000bfe, 12), +- HUFF_PACK(0x000007de, 11), HUFF_PACK(0x000006de, 11), +- HUFF_PACK(0x000001b8, 10), HUFF_PACK(0x000000d6, 8), +- HUFF_PACK(0x0000002e, 7), HUFF_PACK(0x00000034, 7), +- HUFF_PACK(0x000000de, 8), HUFF_PACK(0x000000be, 8)}, +- {HUFF_PACK(0x00007fef, 15), HUFF_PACK(0x000006bc, 12), +- HUFF_PACK(0x00001bff, 13), HUFF_PACK(0x00001ffa, 13), +- HUFF_PACK(0x000001b9, 10), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x000000fa, 8), HUFF_PACK(0x0000002e, 6), +- HUFF_PACK(0x00000034, 6), HUFF_PACK(0x0000001f, 6)}, +- {HUFF_PACK(0x00006dff, 15), HUFF_PACK(0x00001af7, 14), +- HUFF_PACK(0x000036fe, 14), HUFF_PACK(0x000006fe, 12), +- HUFF_PACK(0x00000fbe, 12), HUFF_PACK(0x0000035f, 10), +- HUFF_PACK(0x000000b7, 8), HUFF_PACK(0x0000002c, 6), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x00000009, 4)}, +- {HUFF_PACK(0x0001ffb7, 17), HUFF_PACK(0x0000ffda, 16), +- HUFF_PACK(0x00000d7a, 13), HUFF_PACK(0x000017ff, 13), +- HUFF_PACK(0x00000fbf, 12), HUFF_PACK(0x000002fe, 10), +- HUFF_PACK(0x0000005f, 8), HUFF_PACK(0x00000016, 6), +- HUFF_PACK(0x00000004, 4), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }}}}}; +- +-const HUFF_ICC_TABLE fdk_sacenc_huffICCTab = { +- {/* h1D[2][8] */ +- {HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000002, 2), +- HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x0000007f, 7)}, +- {HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000002, 2), +- HUFF_PACK(0x00000006, 3), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x0000007f, 7)}}, +- { /* HUFF_ICC_TAB_2D */ +- { /* HUFF_ICC_TAB_2D[0][] */ +- {/* HUFF_ICC_TAB_2D[0][0] */ +- { +- /* LAV1_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000006, 3)}, +- {HUFF_PACK(0x00000007, 3), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x00000000, 2), +- HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x0000007e, 8)}, +- {HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x00000004, 4), +- HUFF_PACK(0x00000016, 6), HUFF_PACK(0x000003fe, 11)}, +- {HUFF_PACK(0x000001fe, 10), HUFF_PACK(0x000000fe, 9), +- HUFF_PACK(0x0000003e, 7), HUFF_PACK(0x0000001e, 6)}, +- {HUFF_PACK(0x000003ff, 11), HUFF_PACK(0x00000017, 6), +- HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000003, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x00000002, 3), +- HUFF_PACK(0x0000000c, 5), HUFF_PACK(0x0000006a, 7), +- HUFF_PACK(0x000000dc, 8), HUFF_PACK(0x000006ee, 11)}, +- {HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x0000000d, 5), HUFF_PACK(0x0000001e, 6), +- HUFF_PACK(0x000001ae, 9), HUFF_PACK(0x0000ddff, 16)}, +- {HUFF_PACK(0x000000de, 8), HUFF_PACK(0x0000007e, 7), +- HUFF_PACK(0x0000001f, 6), HUFF_PACK(0x000001be, 9), +- HUFF_PACK(0x00006efe, 15), HUFF_PACK(0x0000ddfe, 16)}, +- {HUFF_PACK(0x0000377e, 14), HUFF_PACK(0x00001bbe, 13), +- HUFF_PACK(0x00000dde, 12), HUFF_PACK(0x000001bf, 9), +- HUFF_PACK(0x000000d6, 8), HUFF_PACK(0x00000376, 10)}, +- {HUFF_PACK(0x0000ddff, 16), HUFF_PACK(0x0000ddff, 16), +- HUFF_PACK(0x000001ba, 9), HUFF_PACK(0x00000034, 6), +- HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x0000000e, 5)}, +- {HUFF_PACK(0x0000ddff, 16), HUFF_PACK(0x000001af, 9), +- HUFF_PACK(0x0000007f, 7), HUFF_PACK(0x00000036, 6), +- HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x0000ddff, 16) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x0000002e, 6), HUFF_PACK(0x00000044, 7), +- HUFF_PACK(0x00000086, 8), HUFF_PACK(0x0000069e, 11), +- HUFF_PACK(0x0000043e, 11), HUFF_PACK(0x0000087a, 12)}, +- {HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000002a, 6), HUFF_PACK(0x00000046, 7), +- HUFF_PACK(0x0000015e, 9), HUFF_PACK(0x00000047, 7), +- HUFF_PACK(0x0000034a, 10), HUFF_PACK(0x0000087b, 12)}, +- {HUFF_PACK(0x000000d6, 8), HUFF_PACK(0x00000026, 6), +- HUFF_PACK(0x0000002f, 6), HUFF_PACK(0x000000d7, 8), +- HUFF_PACK(0x0000006a, 7), HUFF_PACK(0x0000034e, 10), +- HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12)}, +- {HUFF_PACK(0x000002be, 10), HUFF_PACK(0x000001a6, 9), +- HUFF_PACK(0x000001be, 9), HUFF_PACK(0x00000012, 5), +- HUFF_PACK(0x000001bf, 9), HUFF_PACK(0x0000087b, 12), +- HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12)}, +- {HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12), +- HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12), +- HUFF_PACK(0x00000036, 6), HUFF_PACK(0x000000d0, 8), +- HUFF_PACK(0x0000043c, 11), HUFF_PACK(0x0000043f, 11)}, +- {HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12), +- HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000034b, 10), +- HUFF_PACK(0x00000027, 6), HUFF_PACK(0x00000020, 6), +- HUFF_PACK(0x00000042, 7), HUFF_PACK(0x000000d1, 8)}, +- {HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000087b, 12), +- HUFF_PACK(0x000002bf, 10), HUFF_PACK(0x000000de, 8), +- HUFF_PACK(0x000000ae, 8), HUFF_PACK(0x00000056, 7), +- HUFF_PACK(0x00000016, 5), HUFF_PACK(0x00000014, 5)}, +- {HUFF_PACK(0x0000087b, 12), HUFF_PACK(0x0000069f, 11), +- HUFF_PACK(0x000001a4, 9), HUFF_PACK(0x0000010e, 9), +- HUFF_PACK(0x00000045, 7), HUFF_PACK(0x0000006e, 7), +- HUFF_PACK(0x0000001f, 5), HUFF_PACK(0x00000001, 2)}}, +- HUFF_PACK(0x0000087b, 12) /* escape */ +- }}, +- {/* HUFF_ICC_TAB_2D[0][1] */ +- { +- /* LAV1_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000006, 3)}, +- {HUFF_PACK(0x00000007, 3), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x00000004, 4), +- HUFF_PACK(0x0000017e, 10), HUFF_PACK(0x000002fe, 11)}, +- {HUFF_PACK(0x00000000, 2), HUFF_PACK(0x0000000e, 5), +- HUFF_PACK(0x000000be, 9), HUFF_PACK(0x00000016, 6)}, +- {HUFF_PACK(0x0000000f, 5), HUFF_PACK(0x00000014, 6), +- HUFF_PACK(0x0000005e, 8), HUFF_PACK(0x00000006, 4)}, +- {HUFF_PACK(0x0000002e, 7), HUFF_PACK(0x000002ff, 11), +- HUFF_PACK(0x00000015, 6), HUFF_PACK(0x00000003, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x0000001e, 5), +- HUFF_PACK(0x000003fc, 10), HUFF_PACK(0x0000fffa, 16), +- HUFF_PACK(0x000fff9e, 20), HUFF_PACK(0x000fff9f, 20)}, +- {HUFF_PACK(0x00000006, 3), HUFF_PACK(0x00000004, 4), +- HUFF_PACK(0x000000be, 9), HUFF_PACK(0x00007ffe, 15), +- HUFF_PACK(0x0007ffce, 19), HUFF_PACK(0x000000fe, 8)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x0000001e, 6), +- HUFF_PACK(0x000003fd, 10), HUFF_PACK(0x0000fffb, 16), +- HUFF_PACK(0x00000ffe, 12), HUFF_PACK(0x0000003e, 6)}, +- {HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x0000007e, 7), +- HUFF_PACK(0x00001ffe, 13), HUFF_PACK(0x00007fff, 15), +- HUFF_PACK(0x0000005e, 8), HUFF_PACK(0x0000000e, 5)}, +- {HUFF_PACK(0x0000001f, 6), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x0001fff2, 17), HUFF_PACK(0x00000ffc, 12), +- HUFF_PACK(0x0000002e, 7), HUFF_PACK(0x0000000e, 4)}, +- {HUFF_PACK(0x000000bf, 9), HUFF_PACK(0x0003ffe6, 18), +- HUFF_PACK(0x0000fff8, 16), HUFF_PACK(0x00000ffd, 12), +- HUFF_PACK(0x00000016, 6), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x0000001e, 6), +- HUFF_PACK(0x00000ffe, 12), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000fffe, 16), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000ffff, 16)}, +- {HUFF_PACK(0x00000006, 3), HUFF_PACK(0x00000008, 5), +- HUFF_PACK(0x000007fe, 11), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000005a, 8)}, +- {HUFF_PACK(0x00000006, 4), HUFF_PACK(0x0000007a, 7), +- HUFF_PACK(0x00000164, 10), HUFF_PACK(0x00007ffa, 15), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x00001fee, 13), HUFF_PACK(0x0000003c, 6)}, +- {HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x000000fe, 8), +- HUFF_PACK(0x000002ce, 11), HUFF_PACK(0x000002cf, 11), +- HUFF_PACK(0x00007ffb, 15), HUFF_PACK(0x00001fec, 13), +- HUFF_PACK(0x000000b0, 9), HUFF_PACK(0x0000002e, 7)}, +- {HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x00000165, 10), HUFF_PACK(0x00007ffc, 15), +- HUFF_PACK(0x00001fef, 13), HUFF_PACK(0x000007fa, 11), +- HUFF_PACK(0x000007f8, 11), HUFF_PACK(0x0000001f, 6)}, +- {HUFF_PACK(0x0000002f, 7), HUFF_PACK(0x000000f6, 8), +- HUFF_PACK(0x00001fed, 13), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x00007ffd, 15), HUFF_PACK(0x00000ff2, 12), +- HUFF_PACK(0x000000b1, 9), HUFF_PACK(0x0000000a, 5)}, +- {HUFF_PACK(0x00000009, 5), HUFF_PACK(0x00000166, 10), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x00007ffe, 15), HUFF_PACK(0x00003ffc, 14), +- HUFF_PACK(0x0000005b, 8), HUFF_PACK(0x0000000e, 4)}, +- {HUFF_PACK(0x0000007e, 7), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x0000ffff, 16), +- HUFF_PACK(0x0000ffff, 16), HUFF_PACK(0x00000ff3, 12), +- HUFF_PACK(0x000000f7, 8), HUFF_PACK(0x00000000, 2)}}, +- HUFF_PACK(0x0000ffff, 16) /* escape */ +- }}}, +- { /* HUFF_ICC_TAB_2D[1][] */ +- {/* HUFF_ICC_TAB_2D[1][0] */ +- { +- /* LAV1_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000006, 3)}, +- {HUFF_PACK(0x00000007, 3), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000037e, 10), HUFF_PACK(0x00000dfe, 12)}, +- {HUFF_PACK(0x0000000f, 4), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x000001ba, 9), HUFF_PACK(0x000001bb, 9)}, +- {HUFF_PACK(0x000000de, 8), HUFF_PACK(0x000000dc, 8), +- HUFF_PACK(0x000001be, 9), HUFF_PACK(0x0000001a, 5)}, +- {HUFF_PACK(0x000006fe, 11), HUFF_PACK(0x00000dff, 12), +- HUFF_PACK(0x00000036, 6), HUFF_PACK(0x00000000, 1)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x000001b6, 9), HUFF_PACK(0x00001b7c, 13), +- HUFF_PACK(0x0000dbfe, 16), HUFF_PACK(0x00036fff, 18)}, +- {HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x0000001e, 5), +- HUFF_PACK(0x000001be, 9), HUFF_PACK(0x00000dfe, 12), +- HUFF_PACK(0x00036ffe, 18), HUFF_PACK(0x0000036e, 10)}, +- {HUFF_PACK(0x0000006e, 7), HUFF_PACK(0x000000fe, 8), +- HUFF_PACK(0x000000d8, 8), HUFF_PACK(0x000036fe, 14), +- HUFF_PACK(0x000006de, 11), HUFF_PACK(0x000000de, 8)}, +- {HUFF_PACK(0x000001fa, 9), HUFF_PACK(0x000000da, 8), +- HUFF_PACK(0x00000dff, 12), HUFF_PACK(0x00001b7e, 13), +- HUFF_PACK(0x000000d9, 8), HUFF_PACK(0x000000ff, 8)}, +- {HUFF_PACK(0x000003f6, 10), HUFF_PACK(0x000006fe, 11), +- HUFF_PACK(0x00006dfe, 15), HUFF_PACK(0x0000037e, 10), +- HUFF_PACK(0x000000fc, 8), HUFF_PACK(0x0000001a, 5)}, +- {HUFF_PACK(0x000007ee, 11), HUFF_PACK(0x0001b7fe, 17), +- HUFF_PACK(0x00001b7d, 13), HUFF_PACK(0x000007ef, 11), +- HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00036fff, 18) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x0000000c, 4), +- HUFF_PACK(0x000007ee, 11), HUFF_PACK(0x00001e7e, 13), +- HUFF_PACK(0x00003cfe, 14), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x000079ff, 15)}, +- {HUFF_PACK(0x0000000e, 4), HUFF_PACK(0x0000001a, 5), +- HUFF_PACK(0x000001e6, 9), HUFF_PACK(0x00001fbe, 13), +- HUFF_PACK(0x000079fe, 15), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x000006fc, 11)}, +- {HUFF_PACK(0x0000006c, 7), HUFF_PACK(0x000000f6, 8), +- HUFF_PACK(0x000001ba, 9), HUFF_PACK(0x00000dfc, 12), +- HUFF_PACK(0x00000dfd, 12), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x00000f3e, 12), HUFF_PACK(0x000001bb, 9)}, +- {HUFF_PACK(0x000000dc, 8), HUFF_PACK(0x000001fe, 9), +- HUFF_PACK(0x0000036e, 10), HUFF_PACK(0x000003fe, 10), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x00000fde, 12), +- HUFF_PACK(0x000001ee, 9), HUFF_PACK(0x000000f2, 8)}, +- {HUFF_PACK(0x000001fa, 9), HUFF_PACK(0x000003f6, 10), +- HUFF_PACK(0x000001be, 9), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x00001fbf, 13), HUFF_PACK(0x000003ce, 10), +- HUFF_PACK(0x000003ff, 10), HUFF_PACK(0x000000de, 8)}, +- {HUFF_PACK(0x00000078, 7), HUFF_PACK(0x000000da, 8), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000006fd, 11), HUFF_PACK(0x0000036c, 10), +- HUFF_PACK(0x000001ef, 9), HUFF_PACK(0x000000fe, 8)}, +- {HUFF_PACK(0x0000036f, 10), HUFF_PACK(0x00000dfe, 12), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x0000036d, 10), +- HUFF_PACK(0x000000fc, 8), HUFF_PACK(0x0000003e, 6)}, +- {HUFF_PACK(0x00000dff, 12), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x000079ff, 15), +- HUFF_PACK(0x000079ff, 15), HUFF_PACK(0x0000079e, 11), +- HUFF_PACK(0x0000007a, 7), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x000079ff, 15) /* escape */ +- }}, +- {/* HUFF_ICC_TAB_2D[1][1] */ +- { +- /* LAV1_2D */ +- {{HUFF_PACK(0x00000000, 1), HUFF_PACK(0x00000006, 3)}, +- {HUFF_PACK(0x00000007, 3), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV3_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x000000fc, 8), HUFF_PACK(0x00000fde, 12)}, +- {HUFF_PACK(0x0000000c, 4), HUFF_PACK(0x0000000d, 4), +- HUFF_PACK(0x000001fe, 9), HUFF_PACK(0x000007ee, 11)}, +- {HUFF_PACK(0x000001fa, 9), HUFF_PACK(0x000001ff, 9), +- HUFF_PACK(0x000000fe, 8), HUFF_PACK(0x0000003e, 6)}, +- {HUFF_PACK(0x00000fdf, 12), HUFF_PACK(0x000003f6, 10), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x00000000, 1)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV5_2D */ +- {{HUFF_PACK(0x00000000, 2), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000003a, 7), HUFF_PACK(0x00000676, 11), +- HUFF_PACK(0x000019fe, 13), HUFF_PACK(0x0000cebe, 16)}, +- {HUFF_PACK(0x0000000f, 4), HUFF_PACK(0x00000002, 3), +- HUFF_PACK(0x0000001e, 6), HUFF_PACK(0x000000fe, 9), +- HUFF_PACK(0x000019d6, 13), HUFF_PACK(0x0000675e, 15)}, +- {HUFF_PACK(0x0000003e, 7), HUFF_PACK(0x00000032, 6), +- HUFF_PACK(0x00000018, 5), HUFF_PACK(0x0000033e, 10), +- HUFF_PACK(0x00000cfe, 12), HUFF_PACK(0x00000677, 11)}, +- {HUFF_PACK(0x00000674, 11), HUFF_PACK(0x0000019c, 9), +- HUFF_PACK(0x000000ff, 9), HUFF_PACK(0x0000003b, 7), +- HUFF_PACK(0x0000001c, 6), HUFF_PACK(0x0000007e, 8)}, +- {HUFF_PACK(0x000033fe, 14), HUFF_PACK(0x000033ff, 14), +- HUFF_PACK(0x00000cea, 12), HUFF_PACK(0x00000066, 7), +- HUFF_PACK(0x0000001a, 5), HUFF_PACK(0x00000006, 4)}, +- {HUFF_PACK(0x0000cebf, 16), HUFF_PACK(0x000033ae, 14), +- HUFF_PACK(0x0000067e, 11), HUFF_PACK(0x0000019e, 9), +- HUFF_PACK(0x0000001b, 5), HUFF_PACK(0x00000002, 2)}}, +- HUFF_PACK(0x00000000, 0) /* escape */ +- }, +- { +- /* LAV7_2D */ +- {{HUFF_PACK(0x00000002, 2), HUFF_PACK(0x00000002, 4), +- HUFF_PACK(0x000000fe, 9), HUFF_PACK(0x000007be, 12), +- HUFF_PACK(0x00000ffc, 13), HUFF_PACK(0x00000ffd, 13), +- HUFF_PACK(0x00001efe, 15), HUFF_PACK(0x00003dfe, 16)}, +- {HUFF_PACK(0x00000004, 4), HUFF_PACK(0x00000000, 3), +- HUFF_PACK(0x0000003c, 7), HUFF_PACK(0x000000f6, 10), +- HUFF_PACK(0x000001da, 11), HUFF_PACK(0x000003fe, 12), +- HUFF_PACK(0x00003dfe, 15), HUFF_PACK(0x00003dff, 16)}, +- {HUFF_PACK(0x0000003c, 8), HUFF_PACK(0x0000003e, 7), +- HUFF_PACK(0x0000000a, 5), HUFF_PACK(0x0000003a, 8), +- HUFF_PACK(0x000003de, 11), HUFF_PACK(0x000007be, 13), +- HUFF_PACK(0x00000f7e, 14), HUFF_PACK(0x00001efe, 14)}, +- {HUFF_PACK(0x000001de, 11), HUFF_PACK(0x000000ec, 10), +- HUFF_PACK(0x0000007e, 9), HUFF_PACK(0x0000000c, 5), +- HUFF_PACK(0x000001ee, 10), HUFF_PACK(0x00000f7e, 13), +- HUFF_PACK(0x000007fc, 12), HUFF_PACK(0x00003dff, 15)}, +- {HUFF_PACK(0x00007ffe, 16), HUFF_PACK(0x000003be, 12), +- HUFF_PACK(0x000000fe, 10), HUFF_PACK(0x000001fe, 10), +- HUFF_PACK(0x0000001a, 6), HUFF_PACK(0x0000001c, 7), +- HUFF_PACK(0x000007fd, 12), HUFF_PACK(0x00000ffe, 13)}, +- {HUFF_PACK(0x00003dff, 16), HUFF_PACK(0x000003bf, 12), +- HUFF_PACK(0x00001ffe, 14), HUFF_PACK(0x000003ff, 12), +- HUFF_PACK(0x0000003e, 8), HUFF_PACK(0x0000001b, 6), +- HUFF_PACK(0x0000007e, 8), HUFF_PACK(0x000000f6, 9)}, +- {HUFF_PACK(0x00007fff, 16), HUFF_PACK(0x00003dff, 16), +- HUFF_PACK(0x00003ffe, 15), HUFF_PACK(0x000001db, 11), +- HUFF_PACK(0x000000ee, 10), HUFF_PACK(0x0000007a, 8), +- HUFF_PACK(0x0000000e, 5), HUFF_PACK(0x0000000b, 5)}, +- {HUFF_PACK(0x00003dff, 16), HUFF_PACK(0x00003dff, 16), +- HUFF_PACK(0x000003de, 12), HUFF_PACK(0x000001fe, 11), +- HUFF_PACK(0x000001ee, 11), HUFF_PACK(0x0000007a, 9), +- HUFF_PACK(0x00000006, 5), HUFF_PACK(0x00000003, 2)}}, +- HUFF_PACK(0x00003dff, 16) /* escape */ +- }}}}}; +- +-const HUFF_PT0_TABLE fdk_sacenc_huffPart0Tab = { +- {/* CLD */ +- HUFF_PACK(0x00000052, 8), HUFF_PACK(0x000000ae, 9), +- HUFF_PACK(0x000000af, 9), HUFF_PACK(0x00000028, 7), +- HUFF_PACK(0x0000006e, 7), HUFF_PACK(0x00000036, 6), +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x0000000c, 4), HUFF_PACK(0x0000000a, 4), +- HUFF_PACK(0x00000002, 4), HUFF_PACK(0x00000016, 5), +- HUFF_PACK(0x00000012, 5), HUFF_PACK(0x00000017, 5), +- HUFF_PACK(0x00000000, 4), HUFF_PACK(0x00000004, 4), +- HUFF_PACK(0x00000006, 4), HUFF_PACK(0x00000008, 4), +- HUFF_PACK(0x00000007, 4), HUFF_PACK(0x00000003, 4), +- HUFF_PACK(0x00000001, 4), HUFF_PACK(0x0000001a, 5), +- HUFF_PACK(0x00000013, 5), HUFF_PACK(0x0000003e, 6), +- HUFF_PACK(0x00000016, 6), HUFF_PACK(0x00000017, 6), +- HUFF_PACK(0x0000006f, 7), HUFF_PACK(0x0000002a, 7), +- HUFF_PACK(0x00000056, 8), HUFF_PACK(0x00000053, 8), +- HUFF_PACK(0x0000003f, 6)}, +- {/* ICC */ +- HUFF_PACK(0x0000001e, 5), HUFF_PACK(0x0000000e, 4), +- HUFF_PACK(0x00000006, 3), HUFF_PACK(0x00000000, 2), +- HUFF_PACK(0x00000002, 2), HUFF_PACK(0x00000001, 2), +- HUFF_PACK(0x0000003e, 6), HUFF_PACK(0x0000003f, 6)}}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +diff --git a/libSACenc/src/sacenc_huff_tab.h b/libSACenc/src/sacenc_huff_tab.h +deleted file mode 100644 +index 7d6c331..0000000 +--- a/libSACenc/src/sacenc_huff_tab.h ++++ /dev/null +@@ -1,222 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Markus Lohwasser +- +- Description: SAC-Encoder constant huffman tables +- +-*******************************************************************************/ +- +-#ifndef SACENC_HUFF_TAB_H +-#define SACENC_HUFF_TAB_H +- +-/* Includes ******************************************************************/ +-#include "machine_type.h" +- +-/* Defines *******************************************************************/ +-#define HUFF_PACK(a, b) \ +- { \ +- ((((ULONG)a) & 0x00FFFFFF) << 8) | (((ULONG)b) & 0xFF) \ +- } /*!< Pack huffman value and length information. */ +-#define HUFF_VALUE(a) \ +- (((a.packed >> 8) & 0x00FFFFFF)) /*!< Return value from packed table entry. \ +- */ +-#define HUFF_LENGTH(a) \ +- ((a.packed & 0xFF)) /*!< Return length from packed table entry. */ +- +-/* Data Types ****************************************************************/ +-/** +- * \brief This struct contains packed huffman entries. +- * +- * The packed entry consist of hffman value and length information. +- * +- * |---------------------------------| +- * | value | length | +- * |---------------------------------| +- * |<------- 31...8 ------->|< 7..0 >| +- */ +-typedef struct { +- ULONG packed; /*! Packed huffman entry: +- - lower 8 bit are reservoed for length information +- - upper 24 bit contains huffman value */ +-} HUFF_ENTRY; +- +-typedef struct { +- HUFF_ENTRY entry[2][2]; +- HUFF_ENTRY escape; +- +-} LAV1_2D; +- +-typedef struct { +- HUFF_ENTRY entry[4][4]; +- HUFF_ENTRY escape; +- +-} LAV3_2D; +- +-typedef struct { +- HUFF_ENTRY entry[6][6]; +- HUFF_ENTRY escape; +- +-} LAV5_2D; +- +-typedef struct { +- HUFF_ENTRY entry[7][7]; +- HUFF_ENTRY escape; +- +-} LAV6_2D; +- +-typedef struct { +- HUFF_ENTRY entry[8][8]; +- HUFF_ENTRY escape; +- +-} LAV7_2D; +- +-typedef struct { +- HUFF_ENTRY entry[10][10]; +- HUFF_ENTRY escape; +- +-} LAV9_2D; +- +-typedef struct { +- HUFF_ENTRY entry[13][13]; +- HUFF_ENTRY escape; +- +-} LAV12_2D; +- +-typedef struct { +- LAV3_2D lav3; +- LAV5_2D lav5; +- LAV7_2D lav7; +- LAV9_2D lav9; +- +-} HUFF_CLD_TAB_2D; +- +-typedef struct { +- LAV1_2D lav1; +- LAV3_2D lav3; +- LAV5_2D lav5; +- LAV7_2D lav7; +- +-} HUFF_ICC_TAB_2D; +- +-typedef struct { +- HUFF_ENTRY h1D[2][31]; +- HUFF_CLD_TAB_2D h2D[2][2]; +- +-} HUFF_CLD_TABLE; +- +-typedef struct { +- HUFF_ENTRY h1D[2][8]; +- HUFF_ICC_TAB_2D h2D[2][2]; +- +-} HUFF_ICC_TABLE; +- +-typedef struct { +- HUFF_ENTRY cld[31]; +- HUFF_ENTRY icc[8]; +- +-} HUFF_PT0_TABLE; +- +-typedef HUFF_ENTRY HUFF_RES_TABLE[5][8]; +- +-/* Constants *****************************************************************/ +-extern const HUFF_CLD_TABLE fdk_sacenc_huffCLDTab; +-extern const HUFF_ICC_TABLE fdk_sacenc_huffICCTab; +-extern const HUFF_PT0_TABLE fdk_sacenc_huffPart0Tab; +- +-/* Function / Class Declarations *********************************************/ +- +-#endif /* SACENC_HUFF_TAB_H */ +diff --git a/libSACenc/src/sacenc_lib.cpp b/libSACenc/src/sacenc_lib.cpp +deleted file mode 100644 +index d6a1658..0000000 +--- a/libSACenc/src/sacenc_lib.cpp ++++ /dev/null +@@ -1,2042 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Interface to Spacial Audio Coding Encoder lib +- +-*******************************************************************************/ +- +-/**************************************************************************** +-\file +-Description of file contents +-******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_lib.h" +-#include "sacenc_const.h" +-#include "genericStds.h" +-#include "FDK_core.h" +-#include "sacenc_tree.h" +-#include "sacenc_bitstream.h" +-#include "sacenc_onsetdetect.h" +-#include "sacenc_framewindowing.h" +-#include "sacenc_filter.h" +-#include "sacenc_paramextract.h" +-#include "sacenc_staticgain.h" +-#include "sacenc_delay.h" +-#include "sacenc_dmx_tdom_enh.h" +-#include "sacenc_vectorfunctions.h" +-#include "qmf.h" +- +-/* Defines *******************************************************************/ +- +-/* Encoder library info */ +-#define SACENC_LIB_VL0 2 +-#define SACENC_LIB_VL1 0 +-#define SACENC_LIB_VL2 0 +-#define SACENC_LIB_TITLE "MPEG Surround Encoder" +-#ifdef __ANDROID__ +-#define SACENC_LIB_BUILD_DATE "" +-#define SACENC_LIB_BUILD_TIME "" +-#else +-#define SACENC_LIB_BUILD_DATE __DATE__ +-#define SACENC_LIB_BUILD_TIME __TIME__ +-#endif +- +-#define MAX_MPEGS_BYTES (1 << 14) +-#define MAX_SSC_BYTES (1 << 6) +- +-#define MAX_SPACE_TREE_CHANNELS 2 +-#define NUM_KEEP_WINDOWS 3 +- +-/* Data Types ****************************************************************/ +-typedef struct { +- MP4SPACEENC_MODE encMode; +- MP4SPACEENC_BANDS_CONFIG nParamBands; +- MP4SPACEENC_QUANTMODE quantMode; +- UCHAR bUseCoarseQuant; +- UCHAR bLdMode; +- UCHAR bTimeDomainDmx; +- UINT sampleRate; +- UINT frameTimeSlots; /* e.g. 32 when used with HE-AAC */ +- UINT independencyFactor; /* how often should we set the independency flag */ +- INT timeAlignment; /* additional delay for downmix */ +- +-} MP4SPACEENC_SETUP, *HANDLE_MP4SPACEENC_SETUP; +- +-struct ENC_CONFIG_SETUP { +- UCHAR bEncMode_212; +- UCHAR maxHybridInStaticSlots; +- LONG maxSamplingrate; +- INT maxAnalysisLengthTimeSlots; +- INT maxHybridBands; +- INT maxQmfBands; +- INT maxChIn; +- INT maxFrameTimeSlots; +- INT maxFrameLength; +- INT maxChOut; +- INT maxChTotOut; +-}; +- +-struct MP4SPACE_ENCODER { +- MP4SPACEENC_SETUP user; +- +- ENC_CONFIG_SETUP setup; /* describe allocated instance */ +- +- HANDLE_FRAMEWINDOW +- hFrameWindow; /* Windowing, only created+updated, but not used */ +- INT nSamplesValid; /* Input Buffer Handling */ +- +- /* Routing Sensible Switches/Variables */ +- MP4SPACEENC_BANDS_CONFIG nParamBands; +- UCHAR useTimeDomDownmix; +- +- /* not Routing Sensible Switches/Varibles - must be contained in Check */ +- MP4SPACEENC_MODE encMode; +- UCHAR bEncMode_212_only; +- +- /* not Routing Sensible Switches/Varibles + lower Classes */ +- UCHAR useFrameKeep; +- UINT independencyFactor; +- UINT nSampleRate; +- UCHAR nInputChannels; +- UCHAR nOutputChannels; +- UCHAR nFrameTimeSlots; /* e.g. 32 when used with HE-AAC */ +- UCHAR nQmfBands; +- UCHAR nHybridBands; +- UINT nFrameLength; /* number of output waveform samples/channel/frame */ +- +- /* not Routing Sensible Switches/Varibles + lower Classes, secondary computed +- */ +- INT nSamplesNext; +- INT nAnalysisLengthTimeSlots; +- INT nAnalysisLookaheadTimeSlots; +- INT nUpdateHybridPositionTimeSlots; +- INT *pnOutputBits; +- INT nInputDelay; +- INT nOutputBufferDelay; +- INT nSurroundAnalysisBufferDelay; +- INT nBitstreamDelayBuffer; +- INT nBitstreamBufferRead; +- INT nBitstreamBufferWrite; +- INT nDiscardOutFrames; +- INT avoid_keep; +- +- /* not Routing Sensible Switches/Varibles -> moved to lower Classes */ +- UCHAR useCoarseQuantCld; /* Only Used in SpaceTreeSetup */ +- UCHAR useCoarseQuantIcc; /* Only Used in SpaceTreeSetup */ +- UCHAR useCoarseQuantCpc; /* Only Used in SpaceTreeSetup */ +- UCHAR useCoarseQuantArbDmx; /* ArbitraryDmx,... not available yet */ +- MP4SPACEENC_QUANTMODE +- quantMode; /* Used for quanitzation and in bitstream writer */ +- INT coreCoderDelay; /* Used in delay compensation */ +- INT timeAlignment; /* Used in delay compensation */ +- +- /* Local Processing Variables */ +- INT independencyCount; +- INT independencyFlag; +- INT **ppTrCurrPos; /* belongs somehow to Onset Detection */ +- INT trPrevPos[2 * MAX_NUM_TRANS]; /* belongs somehow to Onset Detection */ +- +- FRAMEWIN_LIST frameWinList; +- SPATIALFRAME saveFrame; +- +- /* Module-Handles */ +- SPACE_TREE_SETUP spaceTreeSetup; +- MPEG4SPACEENC_SSCBUF sscBuf; +- FIXP_WIN *pFrameWindowAna__FDK[MAX_NUM_PARAMS]; +- HANDLE_QMF_FILTER_BANK *phQmfFiltIn__FDK; +- HANDLE_DC_FILTER phDCFilterSigIn[SACENC_MAX_INPUT_CHANNELS]; +- HANDLE_ONSET_DETECT phOnset[SACENC_MAX_INPUT_CHANNELS]; +- HANDLE_SPACE_TREE hSpaceTree; +- HANDLE_BSF_INSTANCE hBitstreamFormatter; +- HANDLE_STATIC_GAIN_CONFIG hStaticGainConfig; +- HANDLE_STATIC_GAIN hStaticGain; +- HANDLE_DELAY hDelay; +- +- /* enhanced time domain downmix (for stereo input) */ +- HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx; +- +- /* Data Buffers */ +- INT_PCM **ppTimeSigIn__FDK; +- INT_PCM **ppTimeSigDelayIn__FDK; +- INT_PCM **ppTimeSigOut__FDK; +- FIXP_DPK ***pppHybridIn__FDK; +- FIXP_DPK ***pppHybridInStatic__FDK; +- FIXP_DPK ***pppProcDataIn__FDK; +- INT_PCM *pOutputDelayBuffer__FDK; +- +- UCHAR **ppBitstreamDelayBuffer; +- +- UCHAR *pParameterBand2HybridBandOffset; +- INT staticGainScale; +- +- INT *pEncoderInputChScale; +- INT *staticTimeDomainDmxInScale; +-}; +- +-/* Constants *****************************************************************/ +-static const UCHAR pValidBands_Ld[8] = {4, 5, 7, 9, 12, 15, 23, 40}; +- +-static const UCHAR qmf2qmf[] = /* Bypass the HybridAnylyis/Synthesis*/ +- {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, +- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, +- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, +- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, +- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, +- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, +- 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 127}; +- +-/* Function / Class Declarations *********************************************/ +-static FDK_SACENC_ERROR mp4SpaceEnc_create( +- HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc); +- +-static FDK_SACENC_ERROR FillSpatialSpecificConfig( +- const HANDLE_MP4SPACE_ENCODER hEnc, SPATIALSPECIFICCONFIG *const hSsc); +- +-static FDK_SACENC_ERROR mp4SpaceEnc_FillSpaceTreeSetup( +- const HANDLE_MP4SPACE_ENCODER hEnc, +- SPACE_TREE_SETUP *const hSpaceTreeSetup); +- +-static FDK_SACENC_ERROR mp4SpaceEnc_InitDelayCompensation( +- HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, const INT coreCoderDelay); +- +-static FDK_SACENC_ERROR mp4SpaceEnc_InitDefault( +- HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc); +- +-static DECORRCONFIG mp4SpaceEnc_GetDecorrConfig(const MP4SPACEENC_MODE encMode); +- +-static FDK_SACENC_ERROR mp4SpaceEnc_InitNumParamBands( +- HANDLE_MP4SPACE_ENCODER hEnc, const MP4SPACEENC_BANDS_CONFIG nParamBands); +- +-/* Function / Class Definition ***********************************************/ +-static UINT mp4SpaceEnc_GetNumQmfBands(const UINT nSampleRate) { +- UINT nQmfBands = 0; +- +- if (nSampleRate < 27713) +- nQmfBands = 32; +- else if (nSampleRate < 55426) +- nQmfBands = 64; +- +- return nQmfBands; +-} +- +-static UINT updateQmfFlags(const UINT flags, const INT keepStates) { +- UINT qmfFlags = flags; +- +- qmfFlags = (qmfFlags & (~(UINT)QMF_FLAG_LP)); +- qmfFlags = (qmfFlags | QMF_FLAG_MPSLDFB); +- qmfFlags = (keepStates) ? (qmfFlags | QMF_FLAG_KEEP_STATES) +- : (qmfFlags & (~(UINT)QMF_FLAG_KEEP_STATES)); +- +- return qmfFlags; +-} +- +-static INT freq2HybridBand(const UINT nFrequency, const UINT nSampleRate, +- const UINT nQmfBands) { +- /* +- nQmfSlotWidth = (nSampleRate/2) / nQmfBands; +- nQmfBand = nFrequency / nQmfSlotWidth; +- */ +- int nHybridBand = -1; +- int scale = 0; +- const FIXP_DBL temp = fDivNorm((FIXP_DBL)(2 * nFrequency * nQmfBands), +- (FIXP_DBL)nSampleRate, &scale); +- const int nQmfBand = scaleValue(temp, scale - (DFRACT_BITS - 1)); +- +- if ((nQmfBand > -1) && (nQmfBand < (int)nQmfBands)) { +- nHybridBand = qmf2qmf[nQmfBand]; +- } +- +- return nHybridBand; +-} +- +-/* +- * Examine buffer descriptor regarding choosen type. +- * +- * \param pBufDesc Pointer to buffer descriptor +- * \param type Buffer type to look for. +- +- * \return - Buffer descriptor index. +- * -1, if there is no entry available. +- */ +-static INT getBufDescIdx(const FDK_bufDescr *pBufDesc, const UINT type) { +- INT i, idx = -1; +- +- for (i = 0; i < (int)pBufDesc->numBufs; i++) { +- if (pBufDesc->pBufType[i] == type) { +- idx = i; +- break; +- } +- } +- return idx; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_open(HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc) { +- return mp4SpaceEnc_create(phMp4SpaceEnc); +-} +- +-static FDK_SACENC_ERROR mp4SpaceEnc_create( +- HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc) { +- FDK_SACENC_ERROR error = SACENC_OK; +- HANDLE_MP4SPACE_ENCODER hEnc = NULL; +- ENC_CONFIG_SETUP setup; +- +- if (NULL == phMp4SpaceEnc) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i, ch; +- FDKmemclear(&setup, sizeof(ENC_CONFIG_SETUP)); +- +- /* Allocate Encoder Instance */ +- FDK_ALLOCATE_MEMORY_1D(hEnc, 1, struct MP4SPACE_ENCODER); +- +- /* Clear everything, also pointers. */ +- if (NULL != hEnc) { +- FDKmemclear(hEnc, sizeof(struct MP4SPACE_ENCODER)); +- } +- +- setup.maxSamplingrate = 48000; +- setup.maxFrameTimeSlots = 16; +- +- setup.maxAnalysisLengthTimeSlots = 3 * setup.maxFrameTimeSlots; +- setup.maxQmfBands = mp4SpaceEnc_GetNumQmfBands(setup.maxSamplingrate); +- ; +- setup.maxHybridBands = setup.maxQmfBands; +- setup.maxFrameLength = setup.maxQmfBands * setup.maxFrameTimeSlots; +- +- setup.maxChIn = 2; +- setup.maxChOut = 1; +- setup.maxChTotOut = setup.maxChOut; +- setup.bEncMode_212 = 1; +- setup.maxHybridInStaticSlots = 24; +- +- /* Open Static Gain*/ +- if (SACENC_OK != +- (error = fdk_sacenc_staticGain_OpenConfig(&hEnc->hStaticGainConfig))) { +- goto bail; +- } +- +- /* enhanced time domain downmix (for stereo input) */ +- if (SACENC_OK != (error = fdk_sacenc_open_enhancedTimeDomainDmx( +- &hEnc->hEnhancedTimeDmx, setup.maxFrameLength))) { +- goto bail; +- } +- +- FDK_ALLOCATE_MEMORY_1D(hEnc->pParameterBand2HybridBandOffset, +- MAX_NUM_PARAM_BANDS, UCHAR); +- +- /* Create Space Tree first, to get number of in-/output channels */ +- if (SACENC_OK != (error = fdk_sacenc_spaceTree_Open(&hEnc->hSpaceTree))) { +- goto bail; +- } +- +- FDK_ALLOCATE_MEMORY_1D(hEnc->pEncoderInputChScale, setup.maxChIn, INT); +- FDK_ALLOCATE_MEMORY_1D(hEnc->staticTimeDomainDmxInScale, setup.maxChIn, +- INT); +- +- FDK_ALLOCATE_MEMORY_1D(hEnc->phQmfFiltIn__FDK, setup.maxChIn, +- HANDLE_QMF_FILTER_BANK); +- +- /* Allocate Analysis Filterbank Structs */ +- for (ch = 0; ch < setup.maxChIn; ch++) { +- FDK_ALLOCATE_MEMORY_1D_INT(hEnc->phQmfFiltIn__FDK[ch], 1, +- struct QMF_FILTER_BANK, SECT_DATA_L2) +- FDK_ALLOCATE_MEMORY_1D_INT(hEnc->phQmfFiltIn__FDK[ch]->FilterStates, +- 2 * 5 * setup.maxQmfBands, FIXP_QAS, +- SECT_DATA_L2) +- } +- +- /* Allocate Synthesis Filterbank Structs for arbitrary downmix */ +- +- /* Allocate DC Filter Struct for normal signal input */ +- for (ch = 0; ch < setup.maxChIn; ch++) { +- if (SACENC_OK != +- (error = fdk_sacenc_createDCFilter(&hEnc->phDCFilterSigIn[ch]))) { +- goto bail; +- } +- } +- +- /* Open Onset Detection */ +- for (ch = 0; ch < setup.maxChIn; ch++) { +- if (SACENC_OK != (error = fdk_sacenc_onsetDetect_Open( +- &hEnc->phOnset[ch], setup.maxFrameTimeSlots))) { +- goto bail; +- } +- } +- +- FDK_ALLOCATE_MEMORY_2D(hEnc->ppTrCurrPos, setup.maxChIn, MAX_NUM_TRANS, +- INT); +- +- /* Create Windowing */ +- if (SACENC_OK != +- (error = fdk_sacenc_frameWindow_Create(&hEnc->hFrameWindow))) { +- goto bail; +- } +- +- /* Open static gain */ +- if (SACENC_OK != (error = fdk_sacenc_staticGain_Open(&hEnc->hStaticGain))) { +- goto bail; +- } +- +- /* create bitstream encoder */ +- if (SACENC_OK != (error = fdk_sacenc_createSpatialBitstreamEncoder( +- &hEnc->hBitstreamFormatter))) { +- goto bail; +- } +- +- FDK_ALLOCATE_MEMORY_1D(hEnc->sscBuf.pSsc, MAX_SSC_BYTES, UCHAR); +- +- { +- FDK_ALLOCATE_MEMORY_2D(hEnc->ppTimeSigIn__FDK, setup.maxChIn, +- setup.maxFrameLength + MAX_DELAY_SURROUND_ANALYSIS, +- INT_PCM); +- } +- FDK_ALLOCATE_MEMORY_2D(hEnc->ppTimeSigDelayIn__FDK, setup.maxChIn, +- MAX_DELAY_SURROUND_ANALYSIS, INT_PCM); +- +- /* Create new buffers for several signals (including arbitrary downmix) */ +- if (setup.bEncMode_212 == 0) { +- /* pOutputDelayBuffer__FDK buffer is not needed for SACENC_212 mode */ +- FDK_ALLOCATE_MEMORY_1D( +- hEnc->pOutputDelayBuffer__FDK, +- (setup.maxFrameLength + MAX_DELAY_OUTPUT) * setup.maxChOut, INT_PCM); +- } +- +- /* allocate buffers */ +- if (setup.bEncMode_212 == 0) { +- /* ppTimeSigOut__FDK buffer is not needed for SACENC_212 mode */ +- FDK_ALLOCATE_MEMORY_2D(hEnc->ppTimeSigOut__FDK, setup.maxChTotOut, +- setup.maxFrameLength, INT_PCM); +- } +- +- if (setup.bEncMode_212 == 1) { +- /* pppHybridIn__FDK buffer can be reduced by maxFrameTimeSlots/2 slots for +- * SACENC_212 mode */ +- FDK_ALLOCATE_MEMORY_3D( +- hEnc->pppHybridIn__FDK, setup.maxChIn, +- setup.maxAnalysisLengthTimeSlots - (setup.maxFrameTimeSlots >> 1), +- setup.maxHybridBands, FIXP_DPK); +- FDK_ALLOCATE_MEMORY_3D(hEnc->pppHybridInStatic__FDK, setup.maxChIn, +- setup.maxHybridInStaticSlots, setup.maxHybridBands, +- FIXP_DPK); +- } else { +- FDK_ALLOCATE_MEMORY_3D(hEnc->pppHybridIn__FDK, setup.maxChIn, +- setup.maxAnalysisLengthTimeSlots, +- setup.maxHybridBands, FIXP_DPK); +- } +- +- if (setup.bEncMode_212 == 0) { +- /* pppProcDataIn__FDK buffer is not needed for SACENC_212 mode */ +- FDK_ALLOCATE_MEMORY_3D(hEnc->pppProcDataIn__FDK, MAX_SPACE_TREE_CHANNELS, +- setup.maxAnalysisLengthTimeSlots, +- setup.maxHybridBands, FIXP_DPK); +- } +- for (i = 0; i < MAX_NUM_PARAMS; i++) { +- FDK_ALLOCATE_MEMORY_1D(hEnc->pFrameWindowAna__FDK[i], +- setup.maxAnalysisLengthTimeSlots, FIXP_WIN); +- } /* for i */ +- +- if (SACENC_OK != (error = fdk_sacenc_delay_Open(&hEnc->hDelay))) { +- goto bail; +- } +- +- if (setup.bEncMode_212 == 0) { +- /* ppBitstreamDelayBuffer buffer is not needed for SACENC_212 mode */ +- FDK_ALLOCATE_MEMORY_2D(hEnc->ppBitstreamDelayBuffer, MAX_BITSTREAM_DELAY, +- MAX_MPEGS_BYTES, UCHAR); +- } +- FDK_ALLOCATE_MEMORY_1D(hEnc->pnOutputBits, MAX_BITSTREAM_DELAY, INT); +- +- hEnc->setup = setup; /* save configuration used while encoder allocation. */ +- mp4SpaceEnc_InitDefault(hEnc); +- +- if (NULL != phMp4SpaceEnc) { +- *phMp4SpaceEnc = hEnc; /* return encoder handle */ +- } +- +- } /* valid handle */ +- +- return error; +- +-bail: +- if (NULL != hEnc) { +- hEnc->setup = setup; +- FDK_sacenc_close(&hEnc); +- } +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-static FDK_SACENC_ERROR mp4SpaceEnc_InitDefault(HANDLE_MP4SPACE_ENCODER hEnc) { +- FDK_SACENC_ERROR err = SACENC_OK; +- +- /* Get default static gain configuration. */ +- if (SACENC_OK != (err = fdk_sacenc_staticGain_InitDefaultConfig( +- hEnc->hStaticGainConfig))) { +- goto bail; +- } +- +-bail: +- return err; +-} +- +-static FDK_SACENC_ERROR FDK_sacenc_configure( +- HANDLE_MP4SPACE_ENCODER hEnc, const HANDLE_MP4SPACEENC_SETUP hSetup) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- hEnc->nSampleRate = hSetup->sampleRate; +- hEnc->encMode = hSetup->encMode; +- hEnc->nQmfBands = mp4SpaceEnc_GetNumQmfBands(hEnc->nSampleRate); +- +- /* Make sure that we have set time domain downmix for 212 */ +- if (hSetup->encMode == SACENC_212 && hSetup->bTimeDomainDmx == 0) { +- error = SACENC_INVALID_CONFIG; +- } else { +- hEnc->useTimeDomDownmix = hSetup->bTimeDomainDmx; +- } +- +- hEnc->timeAlignment = hSetup->timeAlignment; +- hEnc->quantMode = hSetup->quantMode; +- +- hEnc->useCoarseQuantCld = hSetup->bUseCoarseQuant; +- hEnc->useCoarseQuantCpc = hSetup->bUseCoarseQuant; +- hEnc->useFrameKeep = (hSetup->bLdMode == 2); +- hEnc->useCoarseQuantIcc = 0; /* not available */ +- hEnc->useCoarseQuantArbDmx = 0; /* not available for user right now */ +- hEnc->independencyFactor = hSetup->independencyFactor; +- hEnc->independencyCount = 0; +- hEnc->independencyFlag = 1; +- +- /* set number of Hybrid bands */ +- hEnc->nHybridBands = hEnc->nQmfBands; +- hEnc->nFrameTimeSlots = hSetup->frameTimeSlots; +- mp4SpaceEnc_InitNumParamBands(hEnc, hSetup->nParamBands); +- +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_init(HANDLE_MP4SPACE_ENCODER hEnc, +- const INT dmxDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- /* Sanity Checks */ +- if (NULL == hEnc) { +- error = SACENC_INVALID_HANDLE; +- } else { +- const int initStatesFlag = 1; +- +- int ch; /* loop counter */ +- int nChInArbDmx; +- +- if (SACENC_OK != (error = FDK_sacenc_configure(hEnc, &hEnc->user))) { +- goto bail; +- } +- +- hEnc->bEncMode_212_only = hEnc->setup.bEncMode_212; +- +- /* Slots per Frame and Frame Length */ +- if (hEnc->nFrameTimeSlots < 1) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- hEnc->nFrameLength = hEnc->nQmfBands * hEnc->nFrameTimeSlots; +- +- if (hEnc->useFrameKeep == 1) { +- hEnc->nAnalysisLengthTimeSlots = 3 * hEnc->nFrameTimeSlots; +- hEnc->nUpdateHybridPositionTimeSlots = hEnc->nFrameTimeSlots; +- } else { +- hEnc->nAnalysisLengthTimeSlots = 2 * hEnc->nFrameTimeSlots; +- hEnc->nUpdateHybridPositionTimeSlots = 0; +- } +- +- { +- hEnc->nAnalysisLookaheadTimeSlots = +- hEnc->nAnalysisLengthTimeSlots - 3 * hEnc->nFrameTimeSlots / 2; +- } +- +- /* init parameterBand2hybridBandOffset table */ +- fdk_sacenc_calcParameterBand2HybridBandOffset( +- (BOX_SUBBAND_CONFIG)hEnc->nParamBands, hEnc->nHybridBands, +- hEnc->pParameterBand2HybridBandOffset); +- +- /* Fill Setup structure for Space Tree */ +- if (SACENC_OK != +- (error = mp4SpaceEnc_FillSpaceTreeSetup(hEnc, &hEnc->spaceTreeSetup))) { +- goto bail; +- } +- +- /* Init space tree configuration */ +- if (SACENC_OK != +- (error = fdk_sacenc_spaceTree_Init( +- hEnc->hSpaceTree, &hEnc->spaceTreeSetup, +- hEnc->pParameterBand2HybridBandOffset, hEnc->useFrameKeep))) { +- goto bail; +- } +- +- /* Get space tree description and resulting number of input/output channels +- */ +- { +- SPACE_TREE_DESCRIPTION spaceTreeDescription; +- +- if (SACENC_OK != (error = fdk_sacenc_spaceTree_GetDescription( +- hEnc->hSpaceTree, &spaceTreeDescription))) { +- goto bail; +- } +- +- hEnc->nInputChannels = +- spaceTreeDescription.nOutChannels; /* space tree description +- describes decoder +- configuration */ +- hEnc->nOutputChannels = +- spaceTreeDescription.nInChannels; /* space tree description +- describes decoder +- configuration */ +- } +- +- nChInArbDmx = 0; +- +- /* INITIALIZATION */ +- for (ch = 0; ch < hEnc->nInputChannels; ch++) { +- /* scaling in analysis qmf filterbank (7) */ +- hEnc->pEncoderInputChScale[ch] = 7; +- +- { +- /* additional scaling in qmf prototype filter for low delay */ +- hEnc->pEncoderInputChScale[ch] += 1; +- } +- +- { hEnc->pEncoderInputChScale[ch] += DC_FILTER_SF; } +- } /* nInputChannels */ +- +- /* Init analysis filterbank */ +- for (ch = 0; ch < hEnc->nInputChannels; ch++) { +- hEnc->phQmfFiltIn__FDK[ch]->flags = +- updateQmfFlags(hEnc->phQmfFiltIn__FDK[ch]->flags, !initStatesFlag); +- +- if (0 != qmfInitAnalysisFilterBank( +- hEnc->phQmfFiltIn__FDK[ch], +- (FIXP_QAS *)hEnc->phQmfFiltIn__FDK[ch]->FilterStates, 1, +- hEnc->nQmfBands, hEnc->nQmfBands, hEnc->nQmfBands, +- hEnc->phQmfFiltIn__FDK[ch]->flags)) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- } +- +- /* Initialize DC Filter. */ +- { +- for (ch = 0; ch < hEnc->nInputChannels; ch++) { +- if (SACENC_OK != (error = fdk_sacenc_initDCFilter( +- hEnc->phDCFilterSigIn[ch], hEnc->nSampleRate))) { +- goto bail; +- } +- } +- } +- +- /* Init onset detect. */ +- { +- /* init onset detect configuration struct */ +- ONSET_DETECT_CONFIG onsetDetectConfig; +- onsetDetectConfig.maxTimeSlots = hEnc->nFrameTimeSlots; +- onsetDetectConfig.lowerBoundOnsetDetection = +- freq2HybridBand(1725, hEnc->nSampleRate, hEnc->nQmfBands); +- onsetDetectConfig.upperBoundOnsetDetection = hEnc->nHybridBands; +- +- for (ch = 0; ch < hEnc->nInputChannels; ch++) { +- if (SACENC_OK != (error = fdk_sacenc_onsetDetect_Init( +- hEnc->phOnset[ch], &onsetDetectConfig, 1))) { +- goto bail; +- } +- } +- } +- +- { +- /* init windowing */ +- FRAMEWINDOW_CONFIG framewindowConfig; +- framewindowConfig.nTimeSlotsMax = hEnc->nFrameTimeSlots; +- framewindowConfig.bFrameKeep = hEnc->useFrameKeep; +- +- if (SACENC_OK != (error = fdk_sacenc_frameWindow_Init( +- hEnc->hFrameWindow, &framewindowConfig))) { +- goto bail; +- } +- } +- +- /* Set encoder mode for static gain initialization. */ +- if (SACENC_OK != (error = fdk_sacenc_staticGain_SetEncMode( +- hEnc->hStaticGainConfig, hEnc->encMode))) { +- goto bail; +- } +- +- /* Init static gain. */ +- if (SACENC_OK != (error = fdk_sacenc_staticGain_Init( +- hEnc->hStaticGain, hEnc->hStaticGainConfig, +- &(hEnc->staticGainScale)))) { +- goto bail; +- } +- +- for (ch = 0; ch < hEnc->nInputChannels; ch++) { +- hEnc->pEncoderInputChScale[ch] += hEnc->staticGainScale; +- } +- +- /* enhanced downmix for stereo input*/ +- if (hEnc->useTimeDomDownmix != 0) { +- if (SACENC_OK != (error = fdk_sacenc_init_enhancedTimeDomainDmx( +- hEnc->hEnhancedTimeDmx, +- fdk_sacenc_getPreGainPtrFDK(hEnc->hStaticGain), +- hEnc->staticGainScale, +- fdk_sacenc_getPostGainFDK(hEnc->hStaticGain), +- hEnc->staticGainScale, hEnc->nFrameLength))) { +- goto bail; +- } +- } +- +- /* Create config structure for bitstream formatter including arbitrary +- * downmix residual */ +- if (SACENC_OK != (error = fdk_sacenc_initSpatialBitstreamEncoder( +- hEnc->hBitstreamFormatter))) { +- goto bail; +- } +- +- if (SACENC_OK != (error = FillSpatialSpecificConfig( +- hEnc, fdk_sacenc_getSpatialSpecificConfig( +- hEnc->hBitstreamFormatter)))) { +- goto bail; +- } +- +- if (SACENC_OK != +- (error = fdk_sacenc_writeSpatialSpecificConfig( +- fdk_sacenc_getSpatialSpecificConfig(hEnc->hBitstreamFormatter), +- hEnc->sscBuf.pSsc, MAX_SSC_BYTES, &hEnc->sscBuf.nSscSizeBits))) { +- goto bail; +- } +- +- /* init delay compensation with dmx core coder delay; if no core coder is +- * used, many other buffers are initialized nevertheless */ +- if (SACENC_OK != +- (error = mp4SpaceEnc_InitDelayCompensation(hEnc, dmxDelay))) { +- goto bail; +- } +- +- /* How much input do we need? */ +- hEnc->nSamplesNext = +- hEnc->nFrameLength * (hEnc->nInputChannels + nChInArbDmx); +- hEnc->nSamplesValid = 0; +- } /* valid handle */ +- +-bail: +- return error; +-} +- +-static INT getAnalysisLengthTimeSlots(FIXP_WIN *pFrameWindowAna, +- INT nTimeSlots) { +- int i; +- for (i = nTimeSlots - 1; i >= 0; i--) { +- if (pFrameWindowAna[i] != (FIXP_WIN)0) { +- break; +- } +- } +- nTimeSlots = i + 1; +- return nTimeSlots; +-} +- +-static INT getAnalysisStartTimeSlot(FIXP_WIN *pFrameWindowAna, INT nTimeSlots) { +- int startTimeSlot = 0; +- int i; +- for (i = 0; i < nTimeSlots; i++) { +- if (pFrameWindowAna[i] != (FIXP_WIN)0) { +- break; +- } +- } +- startTimeSlot = i; +- return startTimeSlot; +-} +- +-static FDK_SACENC_ERROR __FeedDeinterPreScale( +- HANDLE_MP4SPACE_ENCODER hEnc, INT_PCM const *const pSamples, +- INT_PCM *const pOutputSamples, INT const nSamples, +- UINT const isInputInterleaved, UINT const inputBufferSizePerChannel, +- UINT *const pnSamplesFed) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hEnc == NULL) || (pSamples == NULL) || (pnSamplesFed == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else if (nSamples == 0) { +- error = SACENC_INVALID_CONFIG; /* Flushing not implemented */ +- } else { +- int ch; +- const INT nChIn = hEnc->nInputChannels; +- const INT nChInWithDmx = nChIn; +- const INT samplesToFeed = +- FDKmin(nSamples, hEnc->nSamplesNext - hEnc->nSamplesValid); +- const INT nSamplesPerChannel = samplesToFeed / nChInWithDmx; +- +- if ((samplesToFeed < 0) || (samplesToFeed % nChInWithDmx != 0) || +- (samplesToFeed > nChInWithDmx * (INT)hEnc->nFrameLength)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- int i; +- +- const INT_PCM *pInput__FDK; +- const INT_PCM *pInput2__FDK; +- +- { /* no dmx align = default*/ +- pInput__FDK = pSamples; +- pInput2__FDK = pSamples + (hEnc->nInputDelay * nChInWithDmx); +- } +- +- for (i = 0; i < hEnc->nInputChannels; i++) { +- hEnc->staticTimeDomainDmxInScale[i] = hEnc->staticGainScale; +- } +- +- /***** N-channel-input *****/ +- for (ch = 0; ch < nChIn; ch++) { +- /* Write delayed time signal into time signal buffer */ +- FDKmemcpy(&(hEnc->ppTimeSigIn__FDK[ch][0]), +- &(hEnc->ppTimeSigDelayIn__FDK[ch][0]), +- hEnc->nSurroundAnalysisBufferDelay * sizeof(INT_PCM)); +- +- if (isInputInterleaved) { +- /* Add the new frame de-interleaved. Apply nSurroundAnalysisBufferDelay. +- */ +- FDKmemcpy_flex( +- &(hEnc->ppTimeSigIn__FDK[ch][hEnc->nSurroundAnalysisBufferDelay]), +- 1, pInput__FDK + ch, nChInWithDmx, hEnc->nInputDelay); +- FDKmemcpy_flex( +- &(hEnc->ppTimeSigIn__FDK[ch][hEnc->nSurroundAnalysisBufferDelay + +- hEnc->nInputDelay]), +- 1, pInput2__FDK + ch, nChInWithDmx, +- nSamplesPerChannel - hEnc->nInputDelay); +- } else { +- /* Input is already deinterleaved, just copy */ +- FDKmemcpy( +- &(hEnc->ppTimeSigIn__FDK[ch][hEnc->nSurroundAnalysisBufferDelay]), +- pInput__FDK + ch * inputBufferSizePerChannel, +- hEnc->nInputDelay * sizeof(INT_PCM)); +- FDKmemcpy( +- &(hEnc->ppTimeSigIn__FDK[ch][hEnc->nSurroundAnalysisBufferDelay + +- hEnc->nInputDelay]), +- pInput2__FDK + ch * inputBufferSizePerChannel, +- (nSamplesPerChannel - hEnc->nInputDelay) * sizeof(INT_PCM)); +- } +- +- /* Update time signal delay buffer */ +- FDKmemcpy(&(hEnc->ppTimeSigDelayIn__FDK[ch][0]), +- &(hEnc->ppTimeSigIn__FDK[ch][hEnc->nFrameLength]), +- hEnc->nSurroundAnalysisBufferDelay * sizeof(INT_PCM)); +- } /* for ch */ +- +- /***** No Arbitrary Downmix *****/ +- /* "Crude TD Dmx": Time DomainDownmix + NO Arbitrary Downmix, Delay Added at +- * pOutputBuffer */ +- if ((hEnc->useTimeDomDownmix > 0)) { +- if ((hEnc->useTimeDomDownmix == 1) || (hEnc->nInputChannels != 2)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } else { +- /* enhanced time domain downmix (for stereo input) */ +- if (hEnc->encMode == SACENC_212) { +- if (pOutputSamples == NULL) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- fdk_sacenc_apply_enhancedTimeDomainDmx( +- hEnc->hEnhancedTimeDmx, hEnc->ppTimeSigIn__FDK, pOutputSamples, +- hEnc->nSurroundAnalysisBufferDelay); +- } else { +- if (&hEnc->ppTimeSigOut__FDK[0][0] == NULL) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- fdk_sacenc_apply_enhancedTimeDomainDmx( +- hEnc->hEnhancedTimeDmx, hEnc->ppTimeSigIn__FDK, +- &hEnc->ppTimeSigOut__FDK[0][0], +- hEnc->nSurroundAnalysisBufferDelay); +- } +- } +- } +- +- /* update number of samples still to process */ +- hEnc->nSamplesValid += samplesToFeed; +- +- /*return number of fed samples */ +- *pnSamplesFed = samplesToFeed; +- } +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_encode(const HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- const FDK_bufDescr *inBufDesc, +- const FDK_bufDescr *outBufDesc, +- const SACENC_InArgs *inargs, +- SACENC_OutArgs *outargs) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- const INT_PCM *pInputSamples = +- (const INT_PCM *)inBufDesc->ppBase[getBufDescIdx( +- inBufDesc, (FDK_BUF_TYPE_INPUT | FDK_BUF_TYPE_PCM_DATA))]; +- +- INT_PCM *const pOutputSamples = (INT_PCM *)outBufDesc->ppBase[getBufDescIdx( +- outBufDesc, (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_PCM_DATA))]; +- +- const int nOutputSamplesBufferSize = +- outBufDesc->pBufSize[getBufDescIdx( +- outBufDesc, (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_PCM_DATA))] / +- outBufDesc->pEleSize[getBufDescIdx( +- outBufDesc, (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_PCM_DATA))]; +- +- if ((hMp4SpaceEnc == NULL) || (pInputSamples == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int nOutputSamples; +- int i, ch, ps, winCnt, ts, slot; +- INT currTransPos = -1; +- SPATIALFRAME *pFrameData = NULL; +- +- /* Improve Code Readability */ +- const int nChIn = hMp4SpaceEnc->nInputChannels; +- const int nChInWithDmx = nChIn; +- const int nChOut = hMp4SpaceEnc->nOutputChannels; +- const int nSamplesPerChannel = inargs->nInputSamples / nChInWithDmx; +- const int nOutputSamplesMax = nSamplesPerChannel * nChOut; +- const int nFrameTimeSlots = hMp4SpaceEnc->nFrameTimeSlots; +- +- INT encoderInputChScale[SACENC_MAX_INPUT_CHANNELS]; +- INT nFrameTimeSlotsReduction = 0; +- +- if (hMp4SpaceEnc->encMode == SACENC_212) { +- nFrameTimeSlotsReduction = hMp4SpaceEnc->nFrameTimeSlots >> 1; +- } +- +- for (i = 0; i < nChIn; i++) +- encoderInputChScale[i] = hMp4SpaceEnc->pEncoderInputChScale[i]; +- +- /* Sanity Check */ +- if ((0 != inargs->nInputSamples % nChInWithDmx)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* +- * Get Frame Data Handle. +- */ +- +- /* get bitstream handle (for storage of cld's, icc's and so on) +- * get spatialframe 2 frames in the future; NOTE: this is necessary to +- * synchronise spatial data and audio data */ +- if (NULL == (pFrameData = fdk_sacenc_getSpatialFrame( +- hMp4SpaceEnc->hBitstreamFormatter, WRITE_SPATIALFRAME))) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- /* Independent Frames Counters*/ +- if (hMp4SpaceEnc->nDiscardOutFrames > +- 0) { /* Independent Frames if they should be discarded, Reset Counter*/ +- hMp4SpaceEnc->independencyCount = +- 0; /* Reset the counter, first valid frame is an independent one*/ +- hMp4SpaceEnc->independencyFlag = 1; +- } else { /*hMp4SpaceEnc->nDiscardOutFrames == 0*/ +- hMp4SpaceEnc->independencyFlag = +- (hMp4SpaceEnc->independencyCount == 0) ? 1 : 0; +- if (hMp4SpaceEnc->independencyFactor > 0) { +- hMp4SpaceEnc->independencyCount++; +- hMp4SpaceEnc->independencyCount = +- hMp4SpaceEnc->independencyCount % +- ((int)hMp4SpaceEnc->independencyFactor); +- } else { /* independencyFactor == 0 */ +- hMp4SpaceEnc->independencyCount = -1; +- } +- } +- +- /* +- * Time signal preprocessing: +- * - Feed input buffer +- * - Prescale time signal +- * - Apply DC filter on input signal +- */ +- +- /* Feed, Deinterleave, Pre-Scale the input time signals */ +- if (SACENC_OK != +- (error = __FeedDeinterPreScale( +- hMp4SpaceEnc, pInputSamples, pOutputSamples, inargs->nInputSamples, +- inargs->isInputInterleaved, inargs->inputBufferSizePerChannel, +- &outargs->nSamplesConsumed))) { +- goto bail; +- } +- +- if (hMp4SpaceEnc->nSamplesNext != hMp4SpaceEnc->nSamplesValid) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- if (hMp4SpaceEnc->encMode == SACENC_212 && +- hMp4SpaceEnc->bEncMode_212_only) { +- for (ch = 0; ch < nChIn; ch++) { +- for (slot = 0; slot < nFrameTimeSlots; slot++) { +- setCplxVec( +- hMp4SpaceEnc->pppHybridIn__FDK +- [ch][hMp4SpaceEnc->nUpdateHybridPositionTimeSlots + +- nFrameTimeSlots - nFrameTimeSlotsReduction + slot], +- (FIXP_DBL)0, hMp4SpaceEnc->nHybridBands); +- } +- } +- } +- +- /* +- * Time / Frequency: +- * - T/F audio input channels +- * - T/F arbitrary downmix input channels +- */ +- for (ch = 0; ch < nChIn; ch++) { +- C_AALLOC_SCRATCH_START(pQmfInReal, FIXP_DBL, MAX_QMF_BANDS) +- C_AALLOC_SCRATCH_START(pQmfInImag, FIXP_DBL, MAX_QMF_BANDS) +- FIXP_GAIN *pPreGain = +- fdk_sacenc_getPreGainPtrFDK(hMp4SpaceEnc->hStaticGain); +- +- for (ts = 0; ts < nFrameTimeSlots; ts++) { +- FIXP_DBL *pSpecReal; +- FIXP_DBL *pSpecImag; +- +- INT_PCM *pTimeIn = +- &hMp4SpaceEnc->ppTimeSigIn__FDK[ch][(ts * hMp4SpaceEnc->nQmfBands)]; +- +- { +- /* Apply DC filter on input channels */ +- if (SACENC_OK != (error = fdk_sacenc_applyDCFilter( +- hMp4SpaceEnc->phDCFilterSigIn[ch], pTimeIn, +- pTimeIn, hMp4SpaceEnc->nQmfBands))) { +- goto bail; +- } +- } +- +- /* QMF filterbank */ +- C_ALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (MAX_QMF_BANDS << 1)); +- +- qmfAnalysisFilteringSlot(hMp4SpaceEnc->phQmfFiltIn__FDK[ch], pQmfInReal, +- pQmfInImag, pTimeIn, 1, pWorkBuffer); +- +- C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (MAX_QMF_BANDS << 1)); +- +- pSpecReal = pQmfInReal; +- pSpecImag = pQmfInImag; +- +- /* Apply pre-scale after filterbank */ +- if (MAXVAL_GAIN != pPreGain[ch]) { +- for (i = 0; i < hMp4SpaceEnc->nHybridBands; i++) { +- hMp4SpaceEnc +- ->pppHybridIn__FDK[ch] +- [hMp4SpaceEnc->nAnalysisLookaheadTimeSlots + +- ts][i] +- .v.re = fMult(pSpecReal[i], pPreGain[ch]); +- hMp4SpaceEnc +- ->pppHybridIn__FDK[ch] +- [hMp4SpaceEnc->nAnalysisLookaheadTimeSlots + +- ts][i] +- .v.im = fMult(pSpecImag[i], pPreGain[ch]); +- } +- } else { +- for (i = 0; i < hMp4SpaceEnc->nHybridBands; i++) { +- hMp4SpaceEnc +- ->pppHybridIn__FDK[ch] +- [hMp4SpaceEnc->nAnalysisLookaheadTimeSlots + +- ts][i] +- .v.re = pSpecReal[i]; +- hMp4SpaceEnc +- ->pppHybridIn__FDK[ch] +- [hMp4SpaceEnc->nAnalysisLookaheadTimeSlots + +- ts][i] +- .v.im = pSpecImag[i]; +- } +- } +- } /* ts */ +- C_AALLOC_SCRATCH_END(pQmfInImag, FIXP_DBL, MAX_QMF_BANDS) +- C_AALLOC_SCRATCH_END(pQmfInReal, FIXP_DBL, MAX_QMF_BANDS) +- +- if (SACENC_OK != error) { +- goto bail; +- } +- } /* ch */ +- +- if (hMp4SpaceEnc->encMode == SACENC_212 && +- hMp4SpaceEnc->bEncMode_212_only) { +- for (ch = 0; ch < nChIn; ch++) { +- for (slot = 0; +- slot < (int)(hMp4SpaceEnc->nUpdateHybridPositionTimeSlots + +- nFrameTimeSlots - nFrameTimeSlotsReduction); +- slot++) { +- copyCplxVec(hMp4SpaceEnc->pppHybridIn__FDK[ch][slot], +- hMp4SpaceEnc->pppHybridInStatic__FDK[ch][slot], +- hMp4SpaceEnc->nHybridBands); +- } +- } +- for (ch = 0; ch < nChIn; ch++) { +- for (slot = 0; +- slot < (int)(hMp4SpaceEnc->nUpdateHybridPositionTimeSlots + +- nFrameTimeSlots - nFrameTimeSlotsReduction); +- slot++) { +- copyCplxVec( +- hMp4SpaceEnc->pppHybridInStatic__FDK[ch][slot], +- hMp4SpaceEnc->pppHybridIn__FDK[ch][nFrameTimeSlots + slot], +- hMp4SpaceEnc->nHybridBands); +- } +- } +- } +- +- /* +- * Onset Detection: +- * - detection of transients +- * - build framing +- */ +- for (ch = 0; ch < nChIn; ch++) { +- if (ch != 3) { /* !LFE */ +- if (SACENC_OK != +- (error = fdk_sacenc_onsetDetect_Apply( +- hMp4SpaceEnc->phOnset[ch], nFrameTimeSlots, +- hMp4SpaceEnc->nHybridBands, +- &hMp4SpaceEnc->pppHybridIn__FDK +- [ch][hMp4SpaceEnc->nAnalysisLookaheadTimeSlots], +- encoderInputChScale[ch], +- hMp4SpaceEnc->trPrevPos[1], /* contains previous Transient */ +- hMp4SpaceEnc->ppTrCurrPos[ch]))) { +- goto bail; +- } +- +- if ((1) && (hMp4SpaceEnc->useFrameKeep == 0)) { +- hMp4SpaceEnc->ppTrCurrPos[ch][0] = -1; +- } +- +- /* Find first Transient Position */ +- if ((hMp4SpaceEnc->ppTrCurrPos[ch][0] >= 0) && +- ((currTransPos < 0) || +- (hMp4SpaceEnc->ppTrCurrPos[ch][0] < currTransPos))) { +- currTransPos = hMp4SpaceEnc->ppTrCurrPos[ch][0]; +- } +- } /* !LFE */ +- } /* ch */ +- +- if (hMp4SpaceEnc->useFrameKeep == 1) { +- if ((currTransPos != -1) || (hMp4SpaceEnc->independencyFlag == 1)) { +- hMp4SpaceEnc->avoid_keep = NUM_KEEP_WINDOWS; +- currTransPos = -1; +- } +- } +- +- /* Save previous Transient Position */ +- hMp4SpaceEnc->trPrevPos[0] = +- FDKmax(-1, hMp4SpaceEnc->trPrevPos[1] - (INT)nFrameTimeSlots); +- hMp4SpaceEnc->trPrevPos[1] = currTransPos; +- +- /* Update Onset Detection Energy Buffer */ +- for (ch = 0; ch < nChIn; ch++) { +- if (SACENC_OK != (error = fdk_sacenc_onsetDetect_Update( +- hMp4SpaceEnc->phOnset[ch], nFrameTimeSlots))) { +- goto bail; +- } +- } +- +- /* Framing */ +- if (SACENC_OK != +- (error = fdk_sacenc_frameWindow_GetWindow( +- hMp4SpaceEnc->hFrameWindow, hMp4SpaceEnc->trPrevPos, +- nFrameTimeSlots, &pFrameData->framingInfo, +- hMp4SpaceEnc->pFrameWindowAna__FDK, &hMp4SpaceEnc->frameWinList, +- hMp4SpaceEnc->avoid_keep))) { +- goto bail; +- } +- +- /* +- * MPS Processing: +- */ +- for (ps = 0, winCnt = 0; ps < hMp4SpaceEnc->frameWinList.n; ++ps) { +- /* Analysis Windowing */ +- if (hMp4SpaceEnc->frameWinList.dat[ps].hold == FW_HOLD) { +- /* ************************************** */ +- /* ONLY COPY AND HOLD PREVIOUS PARAMETERS */ +- if (SACENC_OK != (error = fdk_sacenc_duplicateParameterSet( +- &hMp4SpaceEnc->saveFrame, 0, pFrameData, ps))) { +- goto bail; +- } +- +- } else { /* !FW_HOLD */ +- /* ************************************** */ +- /* NEW WINDOW */ +- +- INT nAnalysisLengthTimeSlots, analysisStartTimeSlot; +- +- nAnalysisLengthTimeSlots = getAnalysisLengthTimeSlots( +- hMp4SpaceEnc->pFrameWindowAna__FDK[winCnt], +- hMp4SpaceEnc->nAnalysisLengthTimeSlots); +- +- analysisStartTimeSlot = +- getAnalysisStartTimeSlot(hMp4SpaceEnc->pFrameWindowAna__FDK[winCnt], +- hMp4SpaceEnc->nAnalysisLengthTimeSlots); +- +- /* perform main signal analysis windowing in +- * fdk_sacenc_spaceTree_Apply() */ +- FIXP_WIN *pFrameWindowAna__FDK = +- hMp4SpaceEnc->pFrameWindowAna__FDK[winCnt]; +- FIXP_DPK ***pppHybridIn__FDK = hMp4SpaceEnc->pppHybridIn__FDK; +- FIXP_DPK ***pppProcDataIn__FDK = hMp4SpaceEnc->pppProcDataIn__FDK; +- +- if (hMp4SpaceEnc->encMode == SACENC_212 && +- hMp4SpaceEnc->bEncMode_212_only) { +- pppProcDataIn__FDK = pppHybridIn__FDK; +- } +- +- if (SACENC_OK != +- (error = fdk_sacenc_spaceTree_Apply( +- hMp4SpaceEnc->hSpaceTree, ps, nChIn, nAnalysisLengthTimeSlots, +- analysisStartTimeSlot, hMp4SpaceEnc->nHybridBands, +- pFrameWindowAna__FDK, pppHybridIn__FDK, +- pppProcDataIn__FDK, /* multi-channel input */ +- pFrameData, hMp4SpaceEnc->avoid_keep, encoderInputChScale))) { +- goto bail; +- } +- +- /* Save spatial frame for potential hold parameter set */ +- if (SACENC_OK != (error = fdk_sacenc_duplicateParameterSet( +- pFrameData, ps, &hMp4SpaceEnc->saveFrame, 0))) { +- goto bail; +- } +- +- ++winCnt; +- } +- if (hMp4SpaceEnc->avoid_keep > 0) { +- hMp4SpaceEnc->avoid_keep--; +- } +- } /* Loop over Parameter Sets */ +- /* ---- End of Processing Loop ---- */ +- +- /* +- * Update hybridInReal/Imag buffer and do the same for arbDmx +- * this means to move the hybrid data of the current frame to the beginning +- * of the 2*nFrameLength-long buffer +- */ +- if (!(hMp4SpaceEnc->encMode == SACENC_212 && +- hMp4SpaceEnc->bEncMode_212_only)) { +- for (ch = 0; ch < nChIn; ch++) { /* for automatic downmix */ +- for (slot = 0; +- slot < (int)(hMp4SpaceEnc->nUpdateHybridPositionTimeSlots + +- nFrameTimeSlots - nFrameTimeSlotsReduction); +- slot++) { +- copyCplxVec( +- hMp4SpaceEnc->pppHybridIn__FDK[ch][slot], +- hMp4SpaceEnc->pppHybridIn__FDK[ch][nFrameTimeSlots + slot], +- hMp4SpaceEnc->nHybridBands); +- } +- for (slot = 0; slot < nFrameTimeSlots; slot++) { +- setCplxVec( +- hMp4SpaceEnc->pppHybridIn__FDK +- [ch][hMp4SpaceEnc->nUpdateHybridPositionTimeSlots + +- nFrameTimeSlots - nFrameTimeSlotsReduction + slot], +- (FIXP_DBL)0, hMp4SpaceEnc->nHybridBands); +- } +- } +- } +- /* +- * Spatial Tonality: +- */ +- { +- /* Smooth config off. */ +- FDKmemclear(&pFrameData->smgData, sizeof(pFrameData->smgData)); +- } +- +- /* +- * Create bitstream +- * - control independecy flag +- * - write spatial frame +- * - return bitstream +- */ +- UCHAR *pBitstreamDelayBuffer; +- +- if (hMp4SpaceEnc->encMode == SACENC_212) { +- /* no bitstream delay buffer for SACENC_212 mode, write bitstream directly +- * into the sacOutBuffer buffer which is provided by the core routine */ +- pBitstreamDelayBuffer = (UCHAR *)outBufDesc->ppBase[1]; +- } else { +- /* bitstream delay is handled in ppBitstreamDelayBuffer buffer */ +- pBitstreamDelayBuffer = +- hMp4SpaceEnc +- ->ppBitstreamDelayBuffer[hMp4SpaceEnc->nBitstreamBufferWrite]; +- } +- if (pBitstreamDelayBuffer == NULL) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- pFrameData->bsIndependencyFlag = hMp4SpaceEnc->independencyFlag; +- +- if (SACENC_OK != +- (error = fdk_sacenc_writeSpatialFrame( +- pBitstreamDelayBuffer, MAX_MPEGS_BYTES, +- &hMp4SpaceEnc->pnOutputBits[hMp4SpaceEnc->nBitstreamBufferWrite], +- hMp4SpaceEnc->hBitstreamFormatter))) { +- goto bail; +- } +- +- /* return bitstream info */ +- if ((hMp4SpaceEnc->nDiscardOutFrames == 0) && +- (getBufDescIdx(outBufDesc, +- (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_BS_DATA)) != -1)) { +- const INT idx = getBufDescIdx( +- outBufDesc, (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_BS_DATA)); +- const INT outBits = +- hMp4SpaceEnc->pnOutputBits[hMp4SpaceEnc->nBitstreamBufferRead]; +- +- if (((outBits + 7) / 8) > +- (INT)(outBufDesc->pBufSize[idx] / outBufDesc->pEleSize[idx])) { +- outargs->nOutputBits = 0; +- error = SACENC_ENCODE_ERROR; +- goto bail; +- } +- +- /* return bitstream buffer, copy delayed bitstream for all configurations +- * except for the SACENC_212 mode */ +- if (hMp4SpaceEnc->encMode != SACENC_212) { +- FDKmemcpy( +- outBufDesc->ppBase[idx], +- hMp4SpaceEnc +- ->ppBitstreamDelayBuffer[hMp4SpaceEnc->nBitstreamBufferRead], +- (outBits + 7) / 8); +- } +- +- /* return number of valid bits */ +- outargs->nOutputBits = outBits; +- } else { /* No spatial data should be returned if the current frame is to be +- discarded. */ +- outargs->nOutputBits = 0; +- } +- +- /* update pointers */ +- hMp4SpaceEnc->nBitstreamBufferRead = +- (hMp4SpaceEnc->nBitstreamBufferRead + 1) % +- hMp4SpaceEnc->nBitstreamDelayBuffer; +- hMp4SpaceEnc->nBitstreamBufferWrite = +- (hMp4SpaceEnc->nBitstreamBufferWrite + 1) % +- hMp4SpaceEnc->nBitstreamDelayBuffer; +- +- /* Set Output Parameters */ +- nOutputSamples = +- (hMp4SpaceEnc->nDiscardOutFrames == 0) +- ? (nOutputSamplesMax) +- : 0; /* don't output samples in case frames to be discarded */ +- if (nOutputSamples > nOutputSamplesBufferSize) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- outargs->nOutputSamples = nOutputSamples; +- +- { /* !bQmfOutput */ +- +- if (hMp4SpaceEnc->encMode != SACENC_212) { +- /* delay output samples and interleave them */ +- /* note: in case of arbitrary downmix this will always be processed, +- * because nOutputSamples != 0, even if bDMXAlign is switched on */ +- /* always run copy-func, so nOutputSamplesMax instead of nOutputSamples +- */ +- for (ch = 0; ch < nChOut; ch++) { +- FDKmemcpy_flex( +- &hMp4SpaceEnc->pOutputDelayBuffer__FDK +- [ch + (hMp4SpaceEnc->nOutputBufferDelay) * nChOut], +- nChOut, hMp4SpaceEnc->ppTimeSigOut__FDK[ch], 1, +- nOutputSamplesMax / nChOut); +- } +- +- /* write delayed data in output pcm stream */ +- /* always calculate, limiter must have a lookahead!!! */ +- FDKmemcpy(pOutputSamples, hMp4SpaceEnc->pOutputDelayBuffer__FDK, +- nOutputSamplesMax * sizeof(INT_PCM)); +- +- /* update delay buffer (move back end to the beginning of the buffer) */ +- FDKmemmove( +- hMp4SpaceEnc->pOutputDelayBuffer__FDK, +- &hMp4SpaceEnc->pOutputDelayBuffer__FDK[nOutputSamplesMax], +- nChOut * (hMp4SpaceEnc->nOutputBufferDelay) * sizeof(INT_PCM)); +- } +- +- if (hMp4SpaceEnc->useTimeDomDownmix <= 0) { +- if (SACENC_OK != (error = fdk_sacenc_staticPostGain_ApplyFDK( +- hMp4SpaceEnc->hStaticGain, pOutputSamples, +- nOutputSamplesMax, 0))) { +- goto bail; +- } +- } +- +- } /* !bQmfOutput */ +- +- if (hMp4SpaceEnc->nDiscardOutFrames > 0) { +- hMp4SpaceEnc->nDiscardOutFrames--; +- } +- +- /* Invalidate Input Buffer */ +- hMp4SpaceEnc->nSamplesValid = 0; +- +- } /* valid handle */ +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_close(HANDLE_MP4SPACE_ENCODER *phMp4SpaceEnc) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL != phMp4SpaceEnc) { +- if (NULL != *phMp4SpaceEnc) { +- int ch, i; +- HANDLE_MP4SPACE_ENCODER const hEnc = *phMp4SpaceEnc; +- +- if (hEnc->pParameterBand2HybridBandOffset != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->pParameterBand2HybridBandOffset); +- } +- /* Free Analysis Filterbank Structs */ +- if (hEnc->pEncoderInputChScale != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->pEncoderInputChScale); +- } +- if (hEnc->staticTimeDomainDmxInScale != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->staticTimeDomainDmxInScale); +- } +- if (hEnc->phQmfFiltIn__FDK != NULL) { +- for (ch = 0; ch < hEnc->setup.maxChIn; ch++) { +- if (hEnc->phQmfFiltIn__FDK[ch] != NULL) { +- if (hEnc->phQmfFiltIn__FDK[ch]->FilterStates != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->phQmfFiltIn__FDK[ch]->FilterStates); +- } +- FDK_FREE_MEMORY_1D(hEnc->phQmfFiltIn__FDK[ch]); +- } +- } +- FDK_FREE_MEMORY_1D(hEnc->phQmfFiltIn__FDK); +- } +- for (ch = 0; ch < hEnc->setup.maxChIn; ch++) { +- if (NULL != hEnc->phDCFilterSigIn[ch]) { +- fdk_sacenc_destroyDCFilter(&hEnc->phDCFilterSigIn[ch]); +- } +- } +- /* Close Onset Detection */ +- for (ch = 0; ch < hEnc->setup.maxChIn; ch++) { +- if (NULL != hEnc->phOnset[ch]) { +- fdk_sacenc_onsetDetect_Close(&hEnc->phOnset[ch]); +- } +- } +- if (hEnc->ppTrCurrPos) { +- FDK_FREE_MEMORY_2D(hEnc->ppTrCurrPos); +- } +- if (hEnc->hFrameWindow) { +- fdk_sacenc_frameWindow_Destroy(&hEnc->hFrameWindow); +- } +- /* Close Space Tree */ +- if (NULL != hEnc->hSpaceTree) { +- fdk_sacenc_spaceTree_Close(&hEnc->hSpaceTree); +- } +- if (NULL != hEnc->hEnhancedTimeDmx) { +- fdk_sacenc_close_enhancedTimeDomainDmx(&hEnc->hEnhancedTimeDmx); +- } +- /* Close Static Gain */ +- if (NULL != hEnc->hStaticGain) { +- fdk_sacenc_staticGain_Close(&hEnc->hStaticGain); +- } +- if (NULL != hEnc->hStaticGainConfig) { +- fdk_sacenc_staticGain_CloseConfig(&hEnc->hStaticGainConfig); +- } +- /* Close Delay*/ +- if (NULL != hEnc->hDelay) { +- fdk_sacenc_delay_Close(&hEnc->hDelay); +- } +- /* Delete Bitstream Stuff */ +- if (NULL != hEnc->hBitstreamFormatter) { +- fdk_sacenc_destroySpatialBitstreamEncoder(&(hEnc->hBitstreamFormatter)); +- } +- if (hEnc->pppHybridIn__FDK != NULL) { +- if (hEnc->setup.bEncMode_212 == 1) { +- FDK_FREE_MEMORY_3D(hEnc->pppHybridIn__FDK); +- FDK_FREE_MEMORY_3D(hEnc->pppHybridInStatic__FDK); +- } else { +- FDK_FREE_MEMORY_3D(hEnc->pppHybridIn__FDK); +- } +- } +- if (hEnc->pppProcDataIn__FDK != NULL) { +- FDK_FREE_MEMORY_3D(hEnc->pppProcDataIn__FDK); +- } +- if (hEnc->pOutputDelayBuffer__FDK != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->pOutputDelayBuffer__FDK); +- } +- if (hEnc->ppTimeSigIn__FDK != NULL) { +- { FDK_FREE_MEMORY_2D(hEnc->ppTimeSigIn__FDK); } +- } +- if (hEnc->ppTimeSigDelayIn__FDK != NULL) { +- FDK_FREE_MEMORY_2D(hEnc->ppTimeSigDelayIn__FDK); +- } +- if (hEnc->ppTimeSigOut__FDK != NULL) { +- FDK_FREE_MEMORY_2D(hEnc->ppTimeSigOut__FDK); +- } +- for (i = 0; i < MAX_NUM_PARAMS; i++) { +- if (hEnc->pFrameWindowAna__FDK[i] != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->pFrameWindowAna__FDK[i]); +- } +- } +- if (hEnc->pnOutputBits != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->pnOutputBits); +- } +- if (hEnc->ppBitstreamDelayBuffer != NULL) { +- FDK_FREE_MEMORY_2D(hEnc->ppBitstreamDelayBuffer); +- } +- if (hEnc->sscBuf.pSsc != NULL) { +- FDK_FREE_MEMORY_1D(hEnc->sscBuf.pSsc); +- } +- FDK_FREE_MEMORY_1D(*phMp4SpaceEnc); +- } +- } +- +- return error; +-} +- +-/*----------------------------------------------------------------------------- +- functionname: mp4SpaceEnc_InitDelayCompensation() +- description: initialzes delay compensation +- returns: noError on success, an apropriate error code else +- -----------------------------------------------------------------------------*/ +-static FDK_SACENC_ERROR mp4SpaceEnc_InitDelayCompensation( +- HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, const INT coreCoderDelay) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- /* Sanity Check */ +- if (hMp4SpaceEnc == NULL) { +- error = SACENC_INVALID_HANDLE; +- } else { +- hMp4SpaceEnc->coreCoderDelay = coreCoderDelay; +- +- if (SACENC_OK != (error = fdk_sacenc_delay_Init( +- hMp4SpaceEnc->hDelay, hMp4SpaceEnc->nQmfBands, +- hMp4SpaceEnc->nFrameLength, coreCoderDelay, +- hMp4SpaceEnc->timeAlignment))) { +- goto bail; +- } +- +- fdk_sacenc_delay_SetDmxAlign(hMp4SpaceEnc->hDelay, 0); +- fdk_sacenc_delay_SetTimeDomDmx( +- hMp4SpaceEnc->hDelay, (hMp4SpaceEnc->useTimeDomDownmix >= 1) ? 1 : 0); +- fdk_sacenc_delay_SetMinimizeDelay(hMp4SpaceEnc->hDelay, 1); +- +- if (SACENC_OK != (error = fdk_sacenc_delay_SubCalulateBufferDelays( +- hMp4SpaceEnc->hDelay))) { +- goto bail; +- } +- +- /* init output delay compensation */ +- hMp4SpaceEnc->nBitstreamDelayBuffer = +- fdk_sacenc_delay_GetBitstreamFrameBufferSize(hMp4SpaceEnc->hDelay); +- hMp4SpaceEnc->nOutputBufferDelay = +- fdk_sacenc_delay_GetOutputAudioBufferDelay(hMp4SpaceEnc->hDelay); +- hMp4SpaceEnc->nSurroundAnalysisBufferDelay = +- fdk_sacenc_delay_GetSurroundAnalysisBufferDelay(hMp4SpaceEnc->hDelay); +- hMp4SpaceEnc->nBitstreamBufferRead = 0; +- hMp4SpaceEnc->nBitstreamBufferWrite = +- hMp4SpaceEnc->nBitstreamDelayBuffer - 1; +- +- if (hMp4SpaceEnc->encMode == SACENC_212) { +- /* mode 212 expects no bitstream delay */ +- if (hMp4SpaceEnc->nBitstreamBufferWrite != +- hMp4SpaceEnc->nBitstreamBufferRead) { +- error = SACENC_PARAM_ERROR; +- goto bail; +- } +- +- /* mode 212 expects no output buffer delay */ +- if (hMp4SpaceEnc->nOutputBufferDelay != 0) { +- error = SACENC_PARAM_ERROR; +- goto bail; +- } +- } +- +- /*** Input delay to obtain a net encoder delay that is a multiple +- of the used framelength to ensure synchronization of framing +- in artistic down-mix with the corresponding spatial data. ***/ +- hMp4SpaceEnc->nDiscardOutFrames = +- fdk_sacenc_delay_GetDiscardOutFrames(hMp4SpaceEnc->hDelay); +- hMp4SpaceEnc->nInputDelay = +- fdk_sacenc_delay_GetDmxAlignBufferDelay(hMp4SpaceEnc->hDelay); +- +- /* reset independency Flag counter */ +- hMp4SpaceEnc->independencyCount = 0; +- hMp4SpaceEnc->independencyFlag = 1; +- +- int i; +- +- /* write some parameters to bitstream */ +- for (i = 0; i < hMp4SpaceEnc->nBitstreamDelayBuffer - 1; i++) { +- SPATIALFRAME *pFrameData = NULL; +- +- if (NULL == (pFrameData = fdk_sacenc_getSpatialFrame( +- hMp4SpaceEnc->hBitstreamFormatter, READ_SPATIALFRAME))) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- pFrameData->bsIndependencyFlag = 1; +- pFrameData->framingInfo.numParamSets = 1; +- pFrameData->framingInfo.bsFramingType = 0; +- +- fdk_sacenc_writeSpatialFrame( +- hMp4SpaceEnc->ppBitstreamDelayBuffer[i], MAX_MPEGS_BYTES, +- &hMp4SpaceEnc->pnOutputBits[i], hMp4SpaceEnc->hBitstreamFormatter); +- } +- +- if ((hMp4SpaceEnc->nInputDelay > MAX_DELAY_INPUT) || +- (hMp4SpaceEnc->nOutputBufferDelay > MAX_DELAY_OUTPUT) || +- (hMp4SpaceEnc->nSurroundAnalysisBufferDelay > +- MAX_DELAY_SURROUND_ANALYSIS) || +- (hMp4SpaceEnc->nBitstreamDelayBuffer > MAX_BITSTREAM_DELAY)) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- } +- +-bail: +- +- return error; +-} +- +-static QUANTMODE __mapQuantMode(const MP4SPACEENC_QUANTMODE quantMode) { +- QUANTMODE bsQuantMode = QUANTMODE_INVALID; +- +- switch (quantMode) { +- case SACENC_QUANTMODE_FINE: +- bsQuantMode = QUANTMODE_FINE; +- break; +- case SACENC_QUANTMODE_EBQ1: +- bsQuantMode = QUANTMODE_EBQ1; +- break; +- case SACENC_QUANTMODE_EBQ2: +- bsQuantMode = QUANTMODE_EBQ2; +- break; +- case SACENC_QUANTMODE_RSVD3: +- case SACENC_QUANTMODE_INVALID: +- default: +- bsQuantMode = QUANTMODE_INVALID; +- } /* switch hEnc->quantMode */ +- +- return bsQuantMode; +-} +- +-static FDK_SACENC_ERROR FillSpatialSpecificConfig( +- const HANDLE_MP4SPACE_ENCODER hEnc, SPATIALSPECIFICCONFIG *const hSsc) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hEnc) || (NULL == hSsc)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- SPACE_TREE_DESCRIPTION spaceTreeDescription; +- int i; +- +- /* Get tree description */ +- if (SACENC_OK != (error = fdk_sacenc_spaceTree_GetDescription( +- hEnc->hSpaceTree, &spaceTreeDescription))) { +- goto bail; +- } +- +- /* Fill SSC */ +- FDKmemclear(hSsc, sizeof(SPATIALSPECIFICCONFIG)); /* reset */ +- +- hSsc->numBands = hEnc->spaceTreeSetup.nParamBands; /* for bsFreqRes */ +- +- /* Fill tree configuration */ +- hSsc->treeDescription.numOttBoxes = spaceTreeDescription.nOttBoxes; +- hSsc->treeDescription.numInChan = spaceTreeDescription.nInChannels; +- hSsc->treeDescription.numOutChan = spaceTreeDescription.nOutChannels; +- +- for (i = 0; i < SACENC_MAX_NUM_BOXES; i++) { +- hSsc->ottConfig[i].bsOttBands = hSsc->numBands; +- } +- +- switch (hEnc->encMode) { +- case SACENC_212: +- hSsc->bsTreeConfig = TREE_212; +- break; +- case SACENC_INVALID_MODE: +- default: +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- hSsc->bsSamplingFrequency = +- hEnc->nSampleRate; /* for bsSamplingFrequencyIndex */ +- hSsc->bsFrameLength = hEnc->nFrameTimeSlots - 1; +- +- /* map decorr type */ +- if (DECORR_INVALID == +- (hSsc->bsDecorrConfig = mp4SpaceEnc_GetDecorrConfig(hEnc->encMode))) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* map quantMode */ +- if (QUANTMODE_INVALID == +- (hSsc->bsQuantMode = __mapQuantMode(hEnc->quantMode))) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* Configure Gains*/ +- hSsc->bsFixedGainDMX = fdk_sacenc_staticGain_GetDmxGain(hEnc->hStaticGain); +- hSsc->bsEnvQuantMode = 0; +- +- } /* valid handle */ +- +-bail: +- return error; +-} +- +-static FDK_SACENC_ERROR mp4SpaceEnc_FillSpaceTreeSetup( +- const HANDLE_MP4SPACE_ENCODER hEnc, +- SPACE_TREE_SETUP *const hSpaceTreeSetup) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- /* Sanity Check */ +- if (NULL == hEnc || NULL == hSpaceTreeSetup) { +- error = SACENC_INVALID_HANDLE; +- } else { +- QUANTMODE tmpQuantmode = QUANTMODE_INVALID; +- +- /* map quantMode */ +- if (QUANTMODE_INVALID == (tmpQuantmode = __mapQuantMode(hEnc->quantMode))) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- hSpaceTreeSetup->nParamBands = hEnc->nParamBands; +- hSpaceTreeSetup->bUseCoarseQuantTtoCld = hEnc->useCoarseQuantCld; +- hSpaceTreeSetup->bUseCoarseQuantTtoIcc = hEnc->useCoarseQuantIcc; +- hSpaceTreeSetup->quantMode = tmpQuantmode; +- hSpaceTreeSetup->nHybridBandsMax = hEnc->nHybridBands; +- +- switch (hEnc->encMode) { +- case SACENC_212: +- hSpaceTreeSetup->mode = SPACETREE_212; +- hSpaceTreeSetup->nChannelsInMax = 2; +- break; +- case SACENC_INVALID_MODE: +- default: +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } /* switch hEnc->encMode */ +- +- } /* valid handle */ +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_getInfo(const HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- MP4SPACEENC_INFO *const pInfo) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hMp4SpaceEnc) || (NULL == pInfo)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- pInfo->nSampleRate = hMp4SpaceEnc->nSampleRate; +- pInfo->nSamplesFrame = hMp4SpaceEnc->nFrameLength; +- pInfo->nTotalInputChannels = hMp4SpaceEnc->nInputChannels; +- pInfo->nDmxDelay = fdk_sacenc_delay_GetInfoDmxDelay(hMp4SpaceEnc->hDelay); +- pInfo->nCodecDelay = +- fdk_sacenc_delay_GetInfoCodecDelay(hMp4SpaceEnc->hDelay); +- pInfo->nDecoderDelay = +- fdk_sacenc_delay_GetInfoDecoderDelay(hMp4SpaceEnc->hDelay); +- pInfo->nPayloadDelay = +- fdk_sacenc_delay_GetBitstreamFrameBufferSize(hMp4SpaceEnc->hDelay) - 1; +- pInfo->nDiscardOutFrames = hMp4SpaceEnc->nDiscardOutFrames; +- +- pInfo->pSscBuf = &hMp4SpaceEnc->sscBuf; +- } +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_setParam(HANDLE_MP4SPACE_ENCODER hMp4SpaceEnc, +- const SPACEENC_PARAM param, +- const UINT value) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- /* check encoder handle */ +- if (hMp4SpaceEnc == NULL) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- /* apply param value */ +- switch (param) { +- case SACENC_LOWDELAY: +- if (!((value == 0) || (value == 1) || (value == 2))) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.bLdMode = value; +- break; +- +- case SACENC_ENC_MODE: +- switch ((MP4SPACEENC_MODE)value) { +- case SACENC_212: +- hMp4SpaceEnc->user.encMode = (MP4SPACEENC_MODE)value; +- break; +- default: +- error = SACENC_INVALID_CONFIG; +- } +- break; +- +- case SACENC_SAMPLERATE: +- if (((int)value < 0) || +- ((int)value > hMp4SpaceEnc->setup.maxSamplingrate)) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.sampleRate = value; +- break; +- +- case SACENC_FRAME_TIME_SLOTS: +- if (((int)value < 0) || +- ((int)value > hMp4SpaceEnc->setup.maxFrameTimeSlots)) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.frameTimeSlots = value; +- break; +- +- case SACENC_PARAM_BANDS: +- switch ((MP4SPACEENC_BANDS_CONFIG)value) { +- case SACENC_BANDS_4: +- case SACENC_BANDS_5: +- case SACENC_BANDS_7: +- case SACENC_BANDS_9: +- case SACENC_BANDS_12: +- case SACENC_BANDS_15: +- case SACENC_BANDS_23: +- hMp4SpaceEnc->user.nParamBands = (MP4SPACEENC_BANDS_CONFIG)value; +- break; +- default: +- error = SACENC_INVALID_CONFIG; +- } +- break; +- +- case SACENC_TIME_DOM_DMX: +- if (!((value == 0) || (value == 2))) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.bTimeDomainDmx = value; +- break; +- +- case SACENC_DMX_GAIN: +- if (!((value == 0) || (value == 1) || (value == 2) || (value == 3) || +- (value == 4) || (value == 5) || (value == 6) || (value == 7))) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- error = fdk_sacenc_staticGain_SetDmxGain(hMp4SpaceEnc->hStaticGainConfig, +- (MP4SPACEENC_DMX_GAIN)value); +- break; +- +- case SACENC_COARSE_QUANT: +- if (!((value == 0) || (value == 1))) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.bUseCoarseQuant = value; +- break; +- +- case SACENC_QUANT_MODE: +- switch ((MP4SPACEENC_QUANTMODE)value) { +- case SACENC_QUANTMODE_FINE: +- case SACENC_QUANTMODE_EBQ1: +- case SACENC_QUANTMODE_EBQ2: +- hMp4SpaceEnc->user.quantMode = (MP4SPACEENC_QUANTMODE)value; +- break; +- default: +- error = SACENC_INVALID_CONFIG; +- } +- break; +- +- case SACENC_TIME_ALIGNMENT: +- if ((INT)value < -32768 || (INT)value > 32767) { +- error = SACENC_INVALID_CONFIG; +- break; +- } +- hMp4SpaceEnc->user.timeAlignment = value; +- break; +- +- case SACENC_INDEPENDENCY_COUNT: +- hMp4SpaceEnc->independencyCount = value; +- break; +- +- case SACENC_INDEPENDENCY_FACTOR: +- hMp4SpaceEnc->user.independencyFactor = value; +- break; +- +- default: +- error = SACENC_UNSUPPORTED_PARAMETER; +- break; +- } /* switch(param) */ +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR FDK_sacenc_getLibInfo(LIB_INFO *info) { +- int i = 0; +- +- if (info == NULL) { +- return SACENC_INVALID_HANDLE; +- } +- +- FDK_toolsGetLibInfo(info); +- +- /* search for next free tab */ +- for (i = 0; i < FDK_MODULE_LAST; i++) { +- if (info[i].module_id == FDK_NONE) break; +- } +- if (i == FDK_MODULE_LAST) { +- return SACENC_INIT_ERROR; +- } +- +- info[i].module_id = FDK_MPSENC; +- info[i].build_date = SACENC_LIB_BUILD_DATE; +- info[i].build_time = SACENC_LIB_BUILD_TIME; +- info[i].title = SACENC_LIB_TITLE; +- info[i].version = LIB_VERSION(SACENC_LIB_VL0, SACENC_LIB_VL1, SACENC_LIB_VL2); +- LIB_VERSION_STRING(&info[i]); +- +- /* Capability flags */ +- info[i].flags = 0; +- /* End of flags */ +- +- return SACENC_OK; +-} +- +-static DECORRCONFIG mp4SpaceEnc_GetDecorrConfig( +- const MP4SPACEENC_MODE encMode) { +- DECORRCONFIG decorrConfig = DECORR_INVALID; +- +- /* set decorrConfig dependent on tree mode */ +- switch (encMode) { +- case SACENC_212: +- decorrConfig = DECORR_QMFSPLIT0; +- break; +- case SACENC_INVALID_MODE: +- default: +- decorrConfig = DECORR_INVALID; +- } +- return decorrConfig; +-} +- +-static FDK_SACENC_ERROR mp4SpaceEnc_InitNumParamBands( +- HANDLE_MP4SPACE_ENCODER hEnc, const MP4SPACEENC_BANDS_CONFIG nParamBands) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- /* Set/Check nParamBands */ +- int k = 0; +- const int n = sizeof(pValidBands_Ld) / sizeof(UCHAR); +- const UCHAR *pBands = pValidBands_Ld; +- +- while (k < n && pBands[k] != (UCHAR)nParamBands) ++k; +- if (k == n) { +- hEnc->nParamBands = SACENC_BANDS_INVALID; +- } else { +- hEnc->nParamBands = nParamBands; +- } +- return error; +-} +diff --git a/libSACenc/src/sacenc_nlc_enc.cpp b/libSACenc/src/sacenc_nlc_enc.cpp +deleted file mode 100644 +index 0ba6cc9..0000000 +--- a/libSACenc/src/sacenc_nlc_enc.cpp ++++ /dev/null +@@ -1,1442 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Karsten Linzmeier +- +- Description: Noiseless Coding +- Huffman encoder +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_nlc_enc.h" +- +-#include "genericStds.h" +-#include "fixpoint_math.h" +- +-#include "sacenc_const.h" +-#include "sacenc_huff_tab.h" +-#include "sacenc_paramextract.h" +- +-/* Defines *******************************************************************/ +-#define PAIR_SHIFT 4 +-#define PAIR_MASK 0xf +- +-#define PBC_MIN_BANDS 5 +- +-typedef enum { +- BACKWARDS = 0x0, +- FORWARDS = 0x1 +- +-} DIRECTION; +- +-typedef enum { +- DIFF_FREQ = 0x0, +- DIFF_TIME = 0x1 +- +-} DIFF_TYPE; +- +-typedef enum { +- HUFF_1D = 0x0, +- HUFF_2D = 0x1 +- +-} CODING_SCHEME; +- +-typedef enum { +- FREQ_PAIR = 0x0, +- TIME_PAIR = 0x1 +- +-} PAIRING; +- +-/* Data Types ****************************************************************/ +- +-/* Constants *****************************************************************/ +-static const UCHAR lavHuffVal[4] = {0, 2, 6, 7}; +-static const UCHAR lavHuffLen[4] = {1, 2, 3, 3}; +- +-static const UCHAR lav_step_CLD[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3}; +-static const UCHAR lav_step_ICC[] = {0, 0, 1, 1, 2, 2, 3, 3}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static void split_lsb(const SHORT *const in_data, SHORT offset, +- const INT num_val, SHORT *const out_data_lsb, +- SHORT *const out_data_msb) { +- int i; +- +- for (i = 0; i < num_val; i++) { +- SHORT val = in_data[i] + offset; +- if (out_data_lsb != NULL) out_data_lsb[i] = val & 0x0001; +- if (out_data_msb != NULL) out_data_msb[i] = val >> 1; +- } +-} +- +-static void apply_lsb_coding(HANDLE_FDK_BITSTREAM strm, +- const SHORT *const in_data_lsb, const UINT num_lsb, +- const INT num_val) { +- int i; +- +- for (i = 0; i < num_val; i++) { +- FDKwriteBits(strm, in_data_lsb[i], num_lsb); +- } +-} +- +-static void calc_diff_freq(const SHORT *const in_data, SHORT *const out_data, +- const INT num_val) { +- int i; +- out_data[0] = in_data[0]; +- +- for (i = 1; i < num_val; i++) { +- out_data[i] = in_data[i] - in_data[i - 1]; +- } +-} +- +-static void calc_diff_time(const SHORT *const in_data, +- const SHORT *const prev_data, SHORT *const out_data, +- const INT num_val) { +- int i; +- out_data[0] = in_data[0]; +- out_data[1] = prev_data[0]; +- +- for (i = 0; i < num_val; i++) { +- out_data[i + 2] = in_data[i] - prev_data[i]; +- } +-} +- +-static INT sym_check(SHORT data[2], const INT lav, SHORT *const pSym_bits) { +- UCHAR symBits = 0; +- int sum_val = data[0] + data[1]; +- int diff_val = data[0] - data[1]; +- int num_sbits = 0; +- +- if (sum_val != 0) { +- int sum_neg = (sum_val < 0) ? 1 : 0; +- if (sum_neg) { +- sum_val = -sum_val; +- diff_val = -diff_val; +- } +- symBits = (symBits << 1) | sum_neg; +- num_sbits++; +- } +- +- if (diff_val != 0) { +- int diff_neg = (diff_val < 0) ? 1 : 0; +- if (diff_neg) { +- diff_val = -diff_val; +- } +- symBits = (symBits << 1) | diff_neg; +- num_sbits++; +- } +- +- if (pSym_bits != NULL) { +- *pSym_bits = symBits; +- } +- +- if (sum_val % 2) { +- data[0] = lav - sum_val / 2; +- data[1] = lav - diff_val / 2; +- } else { +- data[0] = sum_val / 2; +- data[1] = diff_val / 2; +- } +- +- return num_sbits; +-} +- +-static INT ilog2(UINT i) { +- int l = 0; +- +- if (i) i--; +- while (i > 0) { +- i >>= 1; +- l++; +- } +- +- return l; +-} +- +-static SHORT calc_pcm_bits(const SHORT num_val, const SHORT num_levels) { +- SHORT num_complete_chunks = 0, rest_chunk_size = 0; +- SHORT max_grp_len = 0, bits_pcm = 0; +- int chunk_levels, i; +- +- switch (num_levels) { +- case 3: +- max_grp_len = 5; +- break; +- case 6: +- max_grp_len = 5; +- break; +- case 7: +- max_grp_len = 6; +- break; +- case 11: +- max_grp_len = 2; +- break; +- case 13: +- max_grp_len = 4; +- break; +- case 19: +- max_grp_len = 4; +- break; +- case 25: +- max_grp_len = 3; +- break; +- case 51: +- max_grp_len = 4; +- break; +- default: +- max_grp_len = 1; +- } +- +- num_complete_chunks = num_val / max_grp_len; +- rest_chunk_size = num_val % max_grp_len; +- +- chunk_levels = 1; +- for (i = 1; i <= max_grp_len; i++) { +- chunk_levels *= num_levels; +- } +- +- bits_pcm = (SHORT)(ilog2(chunk_levels) * num_complete_chunks); +- bits_pcm += (SHORT)(ilog2(num_levels) * rest_chunk_size); +- +- return bits_pcm; +-} +- +-static void apply_pcm_coding(HANDLE_FDK_BITSTREAM strm, +- const SHORT *const in_data_1, +- const SHORT *const in_data_2, const SHORT offset, +- const SHORT num_val, const SHORT num_levels) { +- SHORT i = 0, j = 0, idx = 0; +- SHORT max_grp_len = 0, grp_len = 0, next_val = 0; +- int grp_val = 0, chunk_levels = 0; +- +- SHORT pcm_chunk_size[7] = {0}; +- +- switch (num_levels) { +- case 3: +- max_grp_len = 5; +- break; +- case 5: +- max_grp_len = 3; +- break; +- case 6: +- max_grp_len = 5; +- break; +- case 7: +- max_grp_len = 6; +- break; +- case 9: +- max_grp_len = 5; +- break; +- case 11: +- max_grp_len = 2; +- break; +- case 13: +- max_grp_len = 4; +- break; +- case 19: +- max_grp_len = 4; +- break; +- case 25: +- max_grp_len = 3; +- break; +- case 51: +- max_grp_len = 4; +- break; +- default: +- max_grp_len = 1; +- } +- +- chunk_levels = 1; +- for (i = 1; i <= max_grp_len; i++) { +- chunk_levels *= num_levels; +- pcm_chunk_size[i] = ilog2(chunk_levels); +- } +- +- for (i = 0; i < num_val; i += max_grp_len) { +- grp_len = FDKmin(max_grp_len, num_val - i); +- grp_val = 0; +- for (j = 0; j < grp_len; j++) { +- idx = i + j; +- if (in_data_2 == NULL) { +- next_val = in_data_1[idx]; +- } else if (in_data_1 == NULL) { +- next_val = in_data_2[idx]; +- } else { +- next_val = ((idx % 2) ? in_data_2[idx / 2] : in_data_1[idx / 2]); +- } +- next_val += offset; +- grp_val = grp_val * num_levels + next_val; +- } +- +- FDKwriteBits(strm, grp_val, pcm_chunk_size[grp_len]); +- } +-} +- +-static UINT huff_enc_1D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type, +- const INT dim1, SHORT *const in_data, +- const SHORT num_val, const SHORT p0_flag) { +- int i, offset = 0; +- UINT huffBits = 0; +- +- HUFF_ENTRY part0 = {0}; +- const HUFF_ENTRY *pHuffTab = NULL; +- +- switch (data_type) { +- case t_CLD: +- pHuffTab = fdk_sacenc_huffCLDTab.h1D[dim1]; +- break; +- case t_ICC: +- pHuffTab = fdk_sacenc_huffICCTab.h1D[dim1]; +- break; +- } +- +- if (p0_flag) { +- switch (data_type) { +- case t_CLD: +- part0 = fdk_sacenc_huffPart0Tab.cld[in_data[0]]; +- break; +- case t_ICC: +- part0 = fdk_sacenc_huffPart0Tab.icc[in_data[0]]; +- break; +- } +- huffBits += FDKwriteBits(strm, HUFF_VALUE(part0), HUFF_LENGTH(part0)); +- offset = 1; +- } +- +- for (i = offset; i < num_val; i++) { +- int id_sign = 0; +- int id = in_data[i]; +- +- if (id != 0) { +- id_sign = 0; +- if (id < 0) { +- id = -id; +- id_sign = 1; +- } +- } +- +- huffBits += +- FDKwriteBits(strm, HUFF_VALUE(pHuffTab[id]), HUFF_LENGTH(pHuffTab[id])); +- +- if (id != 0) { +- huffBits += FDKwriteBits(strm, id_sign, 1); +- } +- } /* for i */ +- +- return huffBits; +-} +- +-static void getHuffEntry(const INT lav, const DATA_TYPE data_type, const INT i, +- const SHORT tab_idx_2D[2], const SHORT in_data[][2], +- HUFF_ENTRY *const pEntry, HUFF_ENTRY *const pEscape) { +- const HUFF_CLD_TAB_2D *pCLD2dTab = +- &fdk_sacenc_huffCLDTab.h2D[tab_idx_2D[0]][tab_idx_2D[1]]; +- const HUFF_ICC_TAB_2D *pICC2dTab = +- &fdk_sacenc_huffICCTab.h2D[tab_idx_2D[0]][tab_idx_2D[1]]; +- +- switch (lav) { +- case 1: { +- const LAV1_2D *pLav1 = NULL; +- switch (data_type) { +- case t_CLD: +- pLav1 = NULL; +- break; +- case t_ICC: +- pLav1 = &pICC2dTab->lav1; +- break; +- } +- if (pLav1 != NULL) { +- *pEntry = pLav1->entry[in_data[i][0]][in_data[i][1]]; +- *pEscape = pLav1->escape; +- } +- } break; +- case 3: { +- const LAV3_2D *pLav3 = NULL; +- switch (data_type) { +- case t_CLD: +- pLav3 = &pCLD2dTab->lav3; +- break; +- case t_ICC: +- pLav3 = &pICC2dTab->lav3; +- break; +- } +- if (pLav3 != NULL) { +- *pEntry = pLav3->entry[in_data[i][0]][in_data[i][1]]; +- *pEscape = pLav3->escape; +- } +- } break; +- case 5: { +- const LAV5_2D *pLav5 = NULL; +- switch (data_type) { +- case t_CLD: +- pLav5 = &pCLD2dTab->lav5; +- break; +- case t_ICC: +- pLav5 = &pICC2dTab->lav5; +- break; +- } +- if (pLav5 != NULL) { +- *pEntry = pLav5->entry[in_data[i][0]][in_data[i][1]]; +- *pEscape = pLav5->escape; +- } +- } break; +- case 7: { +- const LAV7_2D *pLav7 = NULL; +- switch (data_type) { +- case t_CLD: +- pLav7 = &pCLD2dTab->lav7; +- break; +- case t_ICC: +- pLav7 = &pICC2dTab->lav7; +- break; +- } +- if (pLav7 != NULL) { +- *pEntry = pLav7->entry[in_data[i][0]][in_data[i][1]]; +- *pEscape = pLav7->escape; +- } +- } break; +- case 9: { +- const LAV9_2D *pLav9 = NULL; +- switch (data_type) { +- case t_CLD: +- pLav9 = &pCLD2dTab->lav9; +- break; +- case t_ICC: +- pLav9 = NULL; +- break; +- } +- if (pLav9 != NULL) { +- *pEntry = pLav9->entry[in_data[i][0]][in_data[i][1]]; +- *pEscape = pLav9->escape; +- } +- } break; +- } +-} +- +-static UINT huff_enc_2D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type, +- SHORT tab_idx_2D[2], SHORT lav_idx, SHORT in_data[][2], +- SHORT num_val, SHORT stride, SHORT *p0_data[2]) { +- SHORT i = 0, lav = 0, num_sbits = 0, sym_bits = 0, escIdx = 0; +- SHORT esc_data[2][MAXBANDS] = {{0}}; +- +- UINT huffBits = 0; +- +- const HUFF_ENTRY *pHuffEntry = NULL; +- +- switch (data_type) { +- case t_CLD: +- lav = 2 * lav_idx + 3; /* LAV */ +- pHuffEntry = fdk_sacenc_huffPart0Tab.cld; +- break; +- case t_ICC: +- lav = 2 * lav_idx + 1; /* LAV */ +- pHuffEntry = fdk_sacenc_huffPart0Tab.icc; +- break; +- } +- +- /* Partition 0 */ +- if (p0_data[0] != NULL) { +- HUFF_ENTRY entry = pHuffEntry[*p0_data[0]]; +- huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry)); +- } +- if (p0_data[1] != NULL) { +- HUFF_ENTRY entry = pHuffEntry[*p0_data[1]]; +- huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry)); +- } +- +- for (i = 0; i < num_val; i += stride) { +- HUFF_ENTRY entry = {0}; +- HUFF_ENTRY escape = {0}; +- +- esc_data[0][escIdx] = in_data[i][0] + lav; +- esc_data[1][escIdx] = in_data[i][1] + lav; +- +- num_sbits = sym_check(in_data[i], lav, &sym_bits); +- +- getHuffEntry(lav, data_type, i, tab_idx_2D, in_data, &entry, &escape); +- +- huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry)); +- +- if ((HUFF_VALUE(entry) == HUFF_VALUE(escape)) && +- (HUFF_LENGTH(entry) == HUFF_LENGTH(escape))) { +- escIdx++; +- } else { +- huffBits += FDKwriteBits(strm, sym_bits, num_sbits); +- } +- } /* for i */ +- +- if (escIdx > 0) { +- huffBits += calc_pcm_bits(2 * escIdx, (2 * lav + 1)); +- if (strm != NULL) { +- apply_pcm_coding(strm, esc_data[0], esc_data[1], 0 /*offset*/, 2 * escIdx, +- (2 * lav + 1)); +- } +- } +- +- return huffBits; +-} +- +-static SCHAR get_next_lav_step(const INT lav, const DATA_TYPE data_type) { +- SCHAR lav_step = 0; +- +- switch (data_type) { +- case t_CLD: +- lav_step = (lav > 9) ? -1 : lav_step_CLD[lav]; +- break; +- case t_ICC: +- lav_step = (lav > 7) ? -1 : lav_step_ICC[lav]; +- break; +- } +- +- return lav_step; +-} +- +-static INT diff_type_offset(const DIFF_TYPE diff_type) { +- int offset = 0; +- switch (diff_type) { +- case DIFF_FREQ: +- offset = 0; +- break; +- case DIFF_TIME: +- offset = 2; +- break; +- } +- return offset; +-} +- +-static SHORT calc_huff_bits(SHORT *in_data_1, SHORT *in_data_2, +- const DATA_TYPE data_type, +- const DIFF_TYPE diff_type_1, +- const DIFF_TYPE diff_type_2, const SHORT num_val, +- SHORT *const lav_idx, SHORT *const cdg_scheme) { +- SHORT tab_idx_2D[2][2] = {{0}}; +- SHORT tab_idx_1D[2] = {0}; +- SHORT df_rest_flag[2] = {0}; +- SHORT p0_flag[2] = {0}; +- +- SHORT pair_vec[MAXBANDS][2] = {{0}}; +- +- SHORT *p0_data_1[2] = {NULL}; +- SHORT *p0_data_2[2] = {NULL}; +- +- SHORT i = 0; +- SHORT lav_fp[2] = {0}; +- +- SHORT bit_count_1D = 0; +- SHORT bit_count_2D_freq = 0; +- SHORT bit_count_min = 0; +- +- SHORT num_val_1_short = 0; +- SHORT num_val_2_short = 0; +- +- SHORT *in_data_1_short = NULL; +- SHORT *in_data_2_short = NULL; +- +- /* 1D Huffman coding */ +- bit_count_1D = 1; /* HUFF_1D */ +- +- num_val_1_short = num_val; +- num_val_2_short = num_val; +- +- if (in_data_1 != NULL) { +- in_data_1_short = in_data_1 + diff_type_offset(diff_type_1); +- } +- if (in_data_2 != NULL) { +- in_data_2_short = in_data_2 + diff_type_offset(diff_type_2); +- } +- +- p0_flag[0] = (diff_type_1 == DIFF_FREQ); +- p0_flag[1] = (diff_type_2 == DIFF_FREQ); +- +- tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1; +- tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1; +- +- if (in_data_1 != NULL) { +- bit_count_1D += huff_enc_1D(NULL, data_type, tab_idx_1D[0], in_data_1_short, +- num_val_1_short, p0_flag[0]); +- } +- if (in_data_2 != NULL) { +- bit_count_1D += huff_enc_1D(NULL, data_type, tab_idx_1D[1], in_data_2_short, +- num_val_2_short, p0_flag[1]); +- } +- +- bit_count_min = bit_count_1D; +- *cdg_scheme = HUFF_1D << PAIR_SHIFT; +- lav_idx[0] = lav_idx[1] = -1; +- +- /* Huffman 2D frequency pairs */ +- bit_count_2D_freq = 1; /* HUFF_2D */ +- +- num_val_1_short = num_val; +- num_val_2_short = num_val; +- +- if (in_data_1 != NULL) { +- in_data_1_short = in_data_1 + diff_type_offset(diff_type_1); +- } +- if (in_data_2 != NULL) { +- in_data_2_short = in_data_2 + diff_type_offset(diff_type_2); +- } +- +- lav_fp[0] = lav_fp[1] = 0; +- +- p0_data_1[0] = NULL; +- p0_data_1[1] = NULL; +- p0_data_2[0] = NULL; +- p0_data_2[1] = NULL; +- +- if (in_data_1 != NULL) { +- if (diff_type_1 == DIFF_FREQ) { +- p0_data_1[0] = &in_data_1[0]; +- p0_data_1[1] = NULL; +- +- num_val_1_short -= 1; +- in_data_1_short += 1; +- } +- +- df_rest_flag[0] = num_val_1_short % 2; +- +- if (df_rest_flag[0]) num_val_1_short -= 1; +- +- for (i = 0; i < num_val_1_short - 1; i += 2) { +- pair_vec[i][0] = in_data_1_short[i]; +- pair_vec[i][1] = in_data_1_short[i + 1]; +- +- lav_fp[0] = FDKmax(lav_fp[0], fAbs(pair_vec[i][0])); +- lav_fp[0] = FDKmax(lav_fp[0], fAbs(pair_vec[i][1])); +- } +- +- tab_idx_2D[0][0] = (diff_type_1 == DIFF_TIME) ? 1 : 0; +- tab_idx_2D[0][1] = 0; +- +- tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1; +- +- lav_fp[0] = get_next_lav_step(lav_fp[0], data_type); +- +- if (lav_fp[0] != -1) bit_count_2D_freq += lavHuffLen[lav_fp[0]]; +- } +- +- if (in_data_2 != NULL) { +- if (diff_type_2 == DIFF_FREQ) { +- p0_data_2[0] = NULL; +- p0_data_2[1] = &in_data_2[0]; +- +- num_val_2_short -= 1; +- in_data_2_short += 1; +- } +- +- df_rest_flag[1] = num_val_2_short % 2; +- +- if (df_rest_flag[1]) num_val_2_short -= 1; +- +- for (i = 0; i < num_val_2_short - 1; i += 2) { +- pair_vec[i + 1][0] = in_data_2_short[i]; +- pair_vec[i + 1][1] = in_data_2_short[i + 1]; +- +- lav_fp[1] = FDKmax(lav_fp[1], fAbs(pair_vec[i + 1][0])); +- lav_fp[1] = FDKmax(lav_fp[1], fAbs(pair_vec[i + 1][1])); +- } +- +- tab_idx_2D[1][0] = (diff_type_2 == DIFF_TIME) ? 1 : 0; +- tab_idx_2D[1][1] = 0; +- +- tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1; +- +- lav_fp[1] = get_next_lav_step(lav_fp[1], data_type); +- +- if (lav_fp[1] != -1) bit_count_2D_freq += lavHuffLen[lav_fp[1]]; +- } +- +- if ((lav_fp[0] != -1) && (lav_fp[1] != -1)) { +- if (in_data_1 != NULL) { +- bit_count_2D_freq += +- huff_enc_2D(NULL, data_type, tab_idx_2D[0], lav_fp[0], pair_vec, +- num_val_1_short, 2, p0_data_1); +- } +- if (in_data_2 != NULL) { +- bit_count_2D_freq += +- huff_enc_2D(NULL, data_type, tab_idx_2D[1], lav_fp[1], pair_vec + 1, +- num_val_2_short, 2, p0_data_2); +- } +- if (in_data_1 != NULL) { +- if (df_rest_flag[0]) +- bit_count_2D_freq += +- huff_enc_1D(NULL, data_type, tab_idx_1D[0], +- in_data_1_short + num_val_1_short, 1, 0); +- } +- if (in_data_2 != NULL) { +- if (df_rest_flag[1]) +- bit_count_2D_freq += +- huff_enc_1D(NULL, data_type, tab_idx_1D[1], +- in_data_2_short + num_val_2_short, 1, 0); +- } +- +- if (bit_count_2D_freq < bit_count_min) { +- bit_count_min = bit_count_2D_freq; +- *cdg_scheme = HUFF_2D << PAIR_SHIFT | FREQ_PAIR; +- lav_idx[0] = lav_fp[0]; +- lav_idx[1] = lav_fp[1]; +- } +- } +- +- return bit_count_min; +-} +- +-static void apply_huff_coding(HANDLE_FDK_BITSTREAM strm, SHORT *const in_data_1, +- SHORT *const in_data_2, const DATA_TYPE data_type, +- const DIFF_TYPE diff_type_1, +- const DIFF_TYPE diff_type_2, const SHORT num_val, +- const SHORT *const lav_idx, +- const SHORT cdg_scheme) { +- SHORT tab_idx_2D[2][2] = {{0}}; +- SHORT tab_idx_1D[2] = {0}; +- SHORT df_rest_flag[2] = {0}; +- SHORT p0_flag[2] = {0}; +- +- SHORT pair_vec[MAXBANDS][2] = {{0}}; +- +- SHORT *p0_data_1[2] = {NULL}; +- SHORT *p0_data_2[2] = {NULL}; +- +- SHORT i = 0; +- +- SHORT num_val_1_short = num_val; +- SHORT num_val_2_short = num_val; +- +- SHORT *in_data_1_short = NULL; +- SHORT *in_data_2_short = NULL; +- +- /* Offset */ +- if (in_data_1 != NULL) { +- in_data_1_short = in_data_1 + diff_type_offset(diff_type_1); +- } +- if (in_data_2 != NULL) { +- in_data_2_short = in_data_2 + diff_type_offset(diff_type_2); +- } +- +- /* Signalize coding scheme */ +- FDKwriteBits(strm, cdg_scheme >> PAIR_SHIFT, 1); +- +- switch (cdg_scheme >> PAIR_SHIFT) { +- case HUFF_1D: +- +- p0_flag[0] = (diff_type_1 == DIFF_FREQ); +- p0_flag[1] = (diff_type_2 == DIFF_FREQ); +- +- tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1; +- tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1; +- +- if (in_data_1 != NULL) { +- huff_enc_1D(strm, data_type, tab_idx_1D[0], in_data_1_short, +- num_val_1_short, p0_flag[0]); +- } +- if (in_data_2 != NULL) { +- huff_enc_1D(strm, data_type, tab_idx_1D[1], in_data_2_short, +- num_val_2_short, p0_flag[1]); +- } +- break; /* HUFF_1D */ +- +- case HUFF_2D: +- +- switch (cdg_scheme & PAIR_MASK) { +- case FREQ_PAIR: +- +- if (in_data_1 != NULL) { +- if (diff_type_1 == DIFF_FREQ) { +- p0_data_1[0] = &in_data_1[0]; +- p0_data_1[1] = NULL; +- +- num_val_1_short -= 1; +- in_data_1_short += 1; +- } +- +- df_rest_flag[0] = num_val_1_short % 2; +- +- if (df_rest_flag[0]) num_val_1_short -= 1; +- +- for (i = 0; i < num_val_1_short - 1; i += 2) { +- pair_vec[i][0] = in_data_1_short[i]; +- pair_vec[i][1] = in_data_1_short[i + 1]; +- } +- +- tab_idx_2D[0][0] = (diff_type_1 == DIFF_TIME) ? 1 : 0; +- tab_idx_2D[0][1] = 0; +- +- tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1; +- } /* if( in_data_1 != NULL ) */ +- +- if (in_data_2 != NULL) { +- if (diff_type_2 == DIFF_FREQ) { +- p0_data_2[0] = NULL; +- p0_data_2[1] = &in_data_2[0]; +- +- num_val_2_short -= 1; +- in_data_2_short += 1; +- } +- +- df_rest_flag[1] = num_val_2_short % 2; +- +- if (df_rest_flag[1]) num_val_2_short -= 1; +- +- for (i = 0; i < num_val_2_short - 1; i += 2) { +- pair_vec[i + 1][0] = in_data_2_short[i]; +- pair_vec[i + 1][1] = in_data_2_short[i + 1]; +- } +- +- tab_idx_2D[1][0] = (diff_type_2 == DIFF_TIME) ? 1 : 0; +- tab_idx_2D[1][1] = 0; +- +- tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1; +- } /* if( in_data_2 != NULL ) */ +- +- if (in_data_1 != NULL) { +- FDKwriteBits(strm, lavHuffVal[lav_idx[0]], lavHuffLen[lav_idx[0]]); +- huff_enc_2D(strm, data_type, tab_idx_2D[0], lav_idx[0], pair_vec, +- num_val_1_short, 2, p0_data_1); +- if (df_rest_flag[0]) { +- huff_enc_1D(strm, data_type, tab_idx_1D[0], +- in_data_1_short + num_val_1_short, 1, 0); +- } +- } +- if (in_data_2 != NULL) { +- FDKwriteBits(strm, lavHuffVal[lav_idx[1]], lavHuffLen[lav_idx[1]]); +- huff_enc_2D(strm, data_type, tab_idx_2D[1], lav_idx[1], +- pair_vec + 1, num_val_2_short, 2, p0_data_2); +- if (df_rest_flag[1]) { +- huff_enc_1D(strm, data_type, tab_idx_1D[1], +- in_data_2_short + num_val_2_short, 1, 0); +- } +- } +- break; /* FREQ_PAIR */ +- +- case TIME_PAIR: +- +- if ((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ)) { +- p0_data_1[0] = &in_data_1[0]; +- p0_data_1[1] = &in_data_2[0]; +- +- in_data_1_short += 1; +- in_data_2_short += 1; +- +- num_val_1_short -= 1; +- } +- +- for (i = 0; i < num_val_1_short; i++) { +- pair_vec[i][0] = in_data_1_short[i]; +- pair_vec[i][1] = in_data_2_short[i]; +- } +- +- tab_idx_2D[0][0] = +- ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) ? 1 +- : 0; +- tab_idx_2D[0][1] = 1; +- +- FDKwriteBits(strm, lavHuffVal[lav_idx[0]], lavHuffLen[lav_idx[0]]); +- +- huff_enc_2D(strm, data_type, tab_idx_2D[0], lav_idx[0], pair_vec, +- num_val_1_short, 1, p0_data_1); +- +- break; /* TIME_PAIR */ +- } /* switch( cdg_scheme & PAIR_MASK ) */ +- +- break; /* HUFF_2D */ +- +- default: +- break; +- } /* switch( cdg_scheme >> PAIR_SHIFT ) */ +-} +- +-INT fdk_sacenc_ecDataPairEnc(HANDLE_FDK_BITSTREAM strm, +- SHORT aaInData[][MAXBANDS], +- SHORT aHistory[MAXBANDS], +- const DATA_TYPE data_type, const INT setIdx, +- const INT startBand, const INT dataBands, +- const INT coarse_flag, +- const INT independency_flag) { +- SHORT reset = 0, pb = 0; +- SHORT quant_levels = 0, quant_offset = 0, num_pcm_val = 0; +- +- SHORT splitLsb_flag = 0; +- SHORT pcmCoding_flag = 0; +- +- SHORT allowDiffTimeBack_flag = !independency_flag || (setIdx > 0); +- +- SHORT num_lsb_bits = -1; +- SHORT num_pcm_bits = -1; +- +- SHORT quant_data_lsb[2][MAXBANDS]; +- SHORT quant_data_msb[2][MAXBANDS]; +- +- SHORT quant_data_hist_lsb[MAXBANDS]; +- SHORT quant_data_hist_msb[MAXBANDS]; +- +- SHORT data_diff_freq[2][MAXBANDS]; +- SHORT data_diff_time[2][MAXBANDS + 2]; +- +- SHORT *p_quant_data_msb[2]; +- SHORT *p_quant_data_hist_msb = NULL; +- +- SHORT min_bits_all = 0; +- SHORT min_found = 0; +- +- SHORT min_bits_df_df = -1; +- SHORT min_bits_df_dt = -1; +- SHORT min_bits_dtbw_df = -1; +- SHORT min_bits_dt_dt = -1; +- +- SHORT lav_df_df[2] = {-1, -1}; +- SHORT lav_df_dt[2] = {-1, -1}; +- SHORT lav_dtbw_df[2] = {-1, -1}; +- SHORT lav_dt_dt[2] = {-1, -1}; +- +- SHORT coding_scheme_df_df = 0; +- SHORT coding_scheme_df_dt = 0; +- SHORT coding_scheme_dtbw_df = 0; +- SHORT coding_scheme_dt_dt = 0; +- +- switch (data_type) { +- case t_CLD: +- if (coarse_flag) { +- splitLsb_flag = 0; +- quant_levels = 15; +- quant_offset = 7; +- } else { +- splitLsb_flag = 0; +- quant_levels = 31; +- quant_offset = 15; +- } +- break; +- case t_ICC: +- if (coarse_flag) { +- splitLsb_flag = 0; +- quant_levels = 4; +- quant_offset = 0; +- } else { +- splitLsb_flag = 0; +- quant_levels = 8; +- quant_offset = 0; +- } +- break; +- } /* switch( data_type ) */ +- +- /* Split off LSB */ +- if (splitLsb_flag) { +- split_lsb(aaInData[setIdx] + startBand, quant_offset, dataBands, +- quant_data_lsb[0], quant_data_msb[0]); +- +- split_lsb(aaInData[setIdx + 1] + startBand, quant_offset, dataBands, +- quant_data_lsb[1], quant_data_msb[1]); +- +- p_quant_data_msb[0] = quant_data_msb[0]; +- p_quant_data_msb[1] = quant_data_msb[1]; +- +- num_lsb_bits = 2 * dataBands; +- } else if (quant_offset != 0) { +- for (pb = 0; pb < dataBands; pb++) { +- quant_data_msb[0][pb] = aaInData[setIdx][startBand + pb] + quant_offset; +- quant_data_msb[1][pb] = +- aaInData[setIdx + 1][startBand + pb] + quant_offset; +- } +- +- p_quant_data_msb[0] = quant_data_msb[0]; +- p_quant_data_msb[1] = quant_data_msb[1]; +- +- num_lsb_bits = 0; +- } else { +- p_quant_data_msb[0] = aaInData[setIdx] + startBand; +- p_quant_data_msb[1] = aaInData[setIdx + 1] + startBand; +- +- num_lsb_bits = 0; +- } +- +- if (allowDiffTimeBack_flag) { +- if (splitLsb_flag) { +- split_lsb(aHistory + startBand, quant_offset, dataBands, +- quant_data_hist_lsb, quant_data_hist_msb); +- +- p_quant_data_hist_msb = quant_data_hist_msb; +- } else if (quant_offset != 0) { +- for (pb = 0; pb < dataBands; pb++) { +- quant_data_hist_msb[pb] = aHistory[startBand + pb] + quant_offset; +- } +- p_quant_data_hist_msb = quant_data_hist_msb; +- } else { +- p_quant_data_hist_msb = aHistory + startBand; +- } +- } +- +- /* Calculate frequency differences */ +- calc_diff_freq(p_quant_data_msb[0], data_diff_freq[0], dataBands); +- +- calc_diff_freq(p_quant_data_msb[1], data_diff_freq[1], dataBands); +- +- /* Calculate time differences */ +- if (allowDiffTimeBack_flag) { +- calc_diff_time(p_quant_data_msb[0], p_quant_data_hist_msb, +- data_diff_time[0], dataBands); +- } +- +- calc_diff_time(p_quant_data_msb[1], p_quant_data_msb[0], data_diff_time[1], +- dataBands); +- +- /* Calculate coding scheme with minumum bit consumption */ +- +- /**********************************************************/ +- num_pcm_bits = calc_pcm_bits(2 * dataBands, quant_levels); +- num_pcm_val = 2 * dataBands; +- +- /**********************************************************/ +- +- min_bits_all = num_pcm_bits; +- +- /**********************************************************/ +- /**********************************************************/ +- +- /**********************************************************/ +- min_bits_df_df = +- calc_huff_bits(data_diff_freq[0], data_diff_freq[1], data_type, DIFF_FREQ, +- DIFF_FREQ, dataBands, lav_df_df, &coding_scheme_df_df); +- +- min_bits_df_df += 2; +- +- min_bits_df_df += num_lsb_bits; +- +- if (min_bits_df_df < min_bits_all) { +- min_bits_all = min_bits_df_df; +- } +- /**********************************************************/ +- +- /**********************************************************/ +- min_bits_df_dt = +- calc_huff_bits(data_diff_freq[0], data_diff_time[1], data_type, DIFF_FREQ, +- DIFF_TIME, dataBands, lav_df_dt, &coding_scheme_df_dt); +- +- min_bits_df_dt += 2; +- +- min_bits_df_dt += num_lsb_bits; +- +- if (min_bits_df_dt < min_bits_all) { +- min_bits_all = min_bits_df_dt; +- } +- /**********************************************************/ +- +- /**********************************************************/ +- /**********************************************************/ +- +- if (allowDiffTimeBack_flag) { +- /**********************************************************/ +- min_bits_dtbw_df = calc_huff_bits( +- data_diff_time[0], data_diff_freq[1], data_type, DIFF_TIME, DIFF_FREQ, +- dataBands, lav_dtbw_df, &coding_scheme_dtbw_df); +- +- min_bits_dtbw_df += 2; +- +- min_bits_dtbw_df += num_lsb_bits; +- +- if (min_bits_dtbw_df < min_bits_all) { +- min_bits_all = min_bits_dtbw_df; +- } +- /**********************************************************/ +- +- /**********************************************************/ +- min_bits_dt_dt = calc_huff_bits(data_diff_time[0], data_diff_time[1], +- data_type, DIFF_TIME, DIFF_TIME, dataBands, +- lav_dt_dt, &coding_scheme_dt_dt); +- +- min_bits_dt_dt += 2; +- +- min_bits_dt_dt += num_lsb_bits; +- +- if (min_bits_dt_dt < min_bits_all) { +- min_bits_all = min_bits_dt_dt; +- } +- /**********************************************************/ +- +- } /* if( allowDiffTimeBack_flag ) */ +- +- /***************************/ +- /* Start actual coding now */ +- /***************************/ +- +- /* PCM or Diff/Huff Coding? */ +- pcmCoding_flag = (min_bits_all == num_pcm_bits); +- +- FDKwriteBits(strm, pcmCoding_flag, 1); +- +- if (pcmCoding_flag) { +- /* Grouped PCM Coding */ +- apply_pcm_coding(strm, aaInData[setIdx] + startBand, +- aaInData[setIdx + 1] + startBand, quant_offset, +- num_pcm_val, quant_levels); +- } else { +- /* Diff/Huff Coding */ +- +- min_found = 0; +- +- /*******************************************/ +- if (min_bits_all == min_bits_df_df) { +- FDKwriteBits(strm, DIFF_FREQ, 1); +- FDKwriteBits(strm, DIFF_FREQ, 1); +- +- apply_huff_coding(strm, data_diff_freq[0], data_diff_freq[1], data_type, +- DIFF_FREQ, DIFF_FREQ, dataBands, lav_df_df, +- coding_scheme_df_df); +- +- min_found = 1; +- } +- /*******************************************/ +- +- /*******************************************/ +- if (!min_found && (min_bits_all == min_bits_df_dt)) { +- FDKwriteBits(strm, DIFF_FREQ, 1); +- FDKwriteBits(strm, DIFF_TIME, 1); +- +- apply_huff_coding(strm, data_diff_freq[0], data_diff_time[1], data_type, +- DIFF_FREQ, DIFF_TIME, dataBands, lav_df_dt, +- coding_scheme_df_dt); +- +- min_found = 1; +- } +- /*******************************************/ +- +- /*******************************************/ +- /*******************************************/ +- +- if (allowDiffTimeBack_flag) { +- /*******************************************/ +- if (!min_found && (min_bits_all == min_bits_dtbw_df)) { +- FDKwriteBits(strm, DIFF_TIME, 1); +- FDKwriteBits(strm, DIFF_FREQ, 1); +- +- apply_huff_coding(strm, data_diff_time[0], data_diff_freq[1], data_type, +- DIFF_TIME, DIFF_FREQ, dataBands, lav_dtbw_df, +- coding_scheme_dtbw_df); +- +- min_found = 1; +- } +- /*******************************************/ +- +- /*******************************************/ +- if (!min_found && (min_bits_all == min_bits_dt_dt)) { +- FDKwriteBits(strm, DIFF_TIME, 1); +- FDKwriteBits(strm, DIFF_TIME, 1); +- +- apply_huff_coding(strm, data_diff_time[0], data_diff_time[1], data_type, +- DIFF_TIME, DIFF_TIME, dataBands, lav_dt_dt, +- coding_scheme_dt_dt); +- } +- /*******************************************/ +- +- } /* if( allowDiffTimeBack_flag ) */ +- +- /* LSB coding */ +- if (splitLsb_flag) { +- apply_lsb_coding(strm, quant_data_lsb[0], 1, dataBands); +- +- apply_lsb_coding(strm, quant_data_lsb[1], 1, dataBands); +- } +- +- } /* Diff/Huff/LSB coding */ +- +- return reset; +-} +- +-INT fdk_sacenc_ecDataSingleEnc(HANDLE_FDK_BITSTREAM strm, +- SHORT aaInData[][MAXBANDS], +- SHORT aHistory[MAXBANDS], +- const DATA_TYPE data_type, const INT setIdx, +- const INT startBand, const INT dataBands, +- const INT coarse_flag, +- const INT independency_flag) { +- SHORT reset = 0, pb = 0; +- SHORT quant_levels = 0, quant_offset = 0, num_pcm_val = 0; +- +- SHORT splitLsb_flag = 0; +- SHORT pcmCoding_flag = 0; +- +- SHORT allowDiffTimeBack_flag = !independency_flag || (setIdx > 0); +- +- SHORT num_lsb_bits = -1; +- SHORT num_pcm_bits = -1; +- +- SHORT quant_data_lsb[MAXBANDS]; +- SHORT quant_data_msb[MAXBANDS]; +- +- SHORT quant_data_hist_lsb[MAXBANDS]; +- SHORT quant_data_hist_msb[MAXBANDS]; +- +- SHORT data_diff_freq[MAXBANDS]; +- SHORT data_diff_time[MAXBANDS + 2]; +- +- SHORT *p_quant_data_msb; +- SHORT *p_quant_data_hist_msb = NULL; +- +- SHORT min_bits_all = 0; +- SHORT min_found = 0; +- +- SHORT min_bits_df = -1; +- SHORT min_bits_dt = -1; +- +- SHORT lav_df[2] = {-1, -1}; +- SHORT lav_dt[2] = {-1, -1}; +- +- SHORT coding_scheme_df = 0; +- SHORT coding_scheme_dt = 0; +- +- switch (data_type) { +- case t_CLD: +- if (coarse_flag) { +- splitLsb_flag = 0; +- quant_levels = 15; +- quant_offset = 7; +- } else { +- splitLsb_flag = 0; +- quant_levels = 31; +- quant_offset = 15; +- } +- break; +- case t_ICC: +- if (coarse_flag) { +- splitLsb_flag = 0; +- quant_levels = 4; +- quant_offset = 0; +- } else { +- splitLsb_flag = 0; +- quant_levels = 8; +- quant_offset = 0; +- } +- break; +- } /* switch( data_type ) */ +- +- /* Split off LSB */ +- if (splitLsb_flag) { +- split_lsb(aaInData[setIdx] + startBand, quant_offset, dataBands, +- quant_data_lsb, quant_data_msb); +- +- p_quant_data_msb = quant_data_msb; +- num_lsb_bits = dataBands; +- } else if (quant_offset != 0) { +- for (pb = 0; pb < dataBands; pb++) { +- quant_data_msb[pb] = aaInData[setIdx][startBand + pb] + quant_offset; +- } +- +- p_quant_data_msb = quant_data_msb; +- num_lsb_bits = 0; +- } else { +- p_quant_data_msb = aaInData[setIdx] + startBand; +- num_lsb_bits = 0; +- } +- +- if (allowDiffTimeBack_flag) { +- if (splitLsb_flag) { +- split_lsb(aHistory + startBand, quant_offset, dataBands, +- quant_data_hist_lsb, quant_data_hist_msb); +- +- p_quant_data_hist_msb = quant_data_hist_msb; +- } else if (quant_offset != 0) { +- for (pb = 0; pb < dataBands; pb++) { +- quant_data_hist_msb[pb] = aHistory[startBand + pb] + quant_offset; +- } +- p_quant_data_hist_msb = quant_data_hist_msb; +- } else { +- p_quant_data_hist_msb = aHistory + startBand; +- } +- } +- +- /* Calculate frequency differences */ +- calc_diff_freq(p_quant_data_msb, data_diff_freq, dataBands); +- +- /* Calculate time differences */ +- if (allowDiffTimeBack_flag) { +- calc_diff_time(p_quant_data_msb, p_quant_data_hist_msb, data_diff_time, +- dataBands); +- } +- +- /* Calculate coding scheme with minumum bit consumption */ +- +- /**********************************************************/ +- num_pcm_bits = calc_pcm_bits(dataBands, quant_levels); +- num_pcm_val = dataBands; +- +- /**********************************************************/ +- +- min_bits_all = num_pcm_bits; +- +- /**********************************************************/ +- /**********************************************************/ +- +- /**********************************************************/ +- min_bits_df = calc_huff_bits(data_diff_freq, NULL, data_type, DIFF_FREQ, +- DIFF_FREQ, dataBands, lav_df, &coding_scheme_df); +- +- if (allowDiffTimeBack_flag) min_bits_df += 1; +- +- min_bits_df += num_lsb_bits; +- +- if (min_bits_df < min_bits_all) { +- min_bits_all = min_bits_df; +- } +- /**********************************************************/ +- +- /**********************************************************/ +- if (allowDiffTimeBack_flag) { +- min_bits_dt = +- calc_huff_bits(data_diff_time, NULL, data_type, DIFF_TIME, DIFF_TIME, +- dataBands, lav_dt, &coding_scheme_dt); +- +- min_bits_dt += 1; +- min_bits_dt += num_lsb_bits; +- +- if (min_bits_dt < min_bits_all) { +- min_bits_all = min_bits_dt; +- } +- } /* if( allowDiffTimeBack_flag ) */ +- +- /***************************/ +- /* Start actual coding now */ +- /***************************/ +- +- /* PCM or Diff/Huff Coding? */ +- pcmCoding_flag = (min_bits_all == num_pcm_bits); +- +- FDKwriteBits(strm, pcmCoding_flag, 1); +- +- if (pcmCoding_flag) { +- /* Grouped PCM Coding */ +- apply_pcm_coding(strm, aaInData[setIdx] + startBand, NULL, quant_offset, +- num_pcm_val, quant_levels); +- } else { +- /* Diff/Huff Coding */ +- +- min_found = 0; +- +- /*******************************************/ +- if (min_bits_all == min_bits_df) { +- if (allowDiffTimeBack_flag) { +- FDKwriteBits(strm, DIFF_FREQ, 1); +- } +- +- apply_huff_coding(strm, data_diff_freq, NULL, data_type, DIFF_FREQ, +- DIFF_FREQ, dataBands, lav_df, coding_scheme_df); +- +- min_found = 1; +- } /* if( min_bits_all == min_bits_df ) */ +- /*******************************************/ +- +- /*******************************************/ +- if (allowDiffTimeBack_flag) { +- /*******************************************/ +- if (!min_found && (min_bits_all == min_bits_dt)) { +- FDKwriteBits(strm, DIFF_TIME, 1); +- +- apply_huff_coding(strm, data_diff_time, NULL, data_type, DIFF_TIME, +- DIFF_TIME, dataBands, lav_dt, coding_scheme_dt); +- } +- /*******************************************/ +- +- } /* if( allowDiffTimeBack_flag ) */ +- +- /* LSB coding */ +- if (splitLsb_flag) { +- apply_lsb_coding(strm, quant_data_lsb, 1, dataBands); +- } +- +- } /* Diff/Huff/LSB coding */ +- +- return reset; +-} +diff --git a/libSACenc/src/sacenc_nlc_enc.h b/libSACenc/src/sacenc_nlc_enc.h +deleted file mode 100644 +index 506b308..0000000 +--- a/libSACenc/src/sacenc_nlc_enc.h ++++ /dev/null +@@ -1,141 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Karsten Linzmeier +- +- Description: Noiseless Coding +- Huffman encoder +- +-*******************************************************************************/ +- +-#ifndef SACENC_NLC_ENC_H +-#define SACENC_NLC_ENC_H +- +-/* Includes ******************************************************************/ +-#include "sacenc_const.h" +-#include "FDK_bitstream.h" +-#include "sacenc_bitstream.h" +- +-/* Defines *******************************************************************/ +-#define MAXBANDS MAX_NUM_BINS /* maximum number of frequency bands */ +- +-/* Data Types ****************************************************************/ +-typedef enum { +- t_CLD, +- t_ICC +- +-} DATA_TYPE; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-INT fdk_sacenc_ecDataPairEnc(HANDLE_FDK_BITSTREAM strm, +- SHORT aaInData[][MAXBANDS], +- SHORT aHistory[MAXBANDS], +- const DATA_TYPE data_type, const INT setIdx, +- const INT startBand, const INT dataBands, +- const INT coarse_flag, +- const INT independency_flag); +- +-INT fdk_sacenc_ecDataSingleEnc(HANDLE_FDK_BITSTREAM strm, +- SHORT aaInData[][MAXBANDS], +- SHORT aHistory[MAXBANDS], +- const DATA_TYPE data_type, const INT setIdx, +- const INT startBand, const INT dataBands, +- const INT coarse_flag, +- const INT independency_flag); +- +-#endif /* SACENC_NLC_ENC_H */ +diff --git a/libSACenc/src/sacenc_onsetdetect.cpp b/libSACenc/src/sacenc_onsetdetect.cpp +deleted file mode 100644 +index 7e9aee1..0000000 +--- a/libSACenc/src/sacenc_onsetdetect.cpp ++++ /dev/null +@@ -1,381 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Detect Onset in current frame +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- Description of file contents +- ******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_onsetdetect.h" +-#include "genericStds.h" +-#include "sacenc_vectorfunctions.h" +- +-/* Defines *******************************************************************/ +-#define SPACE_ONSET_THRESHOLD (3.0) +-#define SPACE_ONSET_THRESHOLD_SF (3) +-#define SPACE_ONSET_THRESHOLD_SQUARE \ +- (FL2FXCONST_DBL((1.0 / (SPACE_ONSET_THRESHOLD * SPACE_ONSET_THRESHOLD)) * \ +- (float)(1 << SPACE_ONSET_THRESHOLD_SF))) +- +-/* Data Types ****************************************************************/ +-struct ONSET_DETECT { +- INT maxTimeSlots; +- INT minTransientDistance; +- INT avgEnergyDistance; +- INT lowerBoundOnsetDetection; +- INT upperBoundOnsetDetection; +- FIXP_DBL *pEnergyHist__FDK; +- SCHAR *pEnergyHistScale; +- SCHAR avgEnergyDistanceScale; +-}; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Open(HANDLE_ONSET_DETECT *phOnset, +- const UINT maxTimeSlots) { +- FDK_SACENC_ERROR error = SACENC_OK; +- HANDLE_ONSET_DETECT hOnset = NULL; +- +- if (NULL == phOnset) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* Memory Allocation */ +- FDK_ALLOCATE_MEMORY_1D(hOnset, 1, struct ONSET_DETECT); +- FDK_ALLOCATE_MEMORY_1D(hOnset->pEnergyHist__FDK, 16 + maxTimeSlots, +- FIXP_DBL); +- FDK_ALLOCATE_MEMORY_1D(hOnset->pEnergyHistScale, 16 + maxTimeSlots, SCHAR); +- +- hOnset->maxTimeSlots = maxTimeSlots; +- hOnset->minTransientDistance = +- 8; /* minimum distance between detected transients */ +- hOnset->avgEnergyDistance = 16; /* average energy distance */ +- +- hOnset->avgEnergyDistanceScale = 4; +- *phOnset = hOnset; +- } +- return error; +- +-bail: +- fdk_sacenc_onsetDetect_Close(&hOnset); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Init( +- HANDLE_ONSET_DETECT hOnset, +- const ONSET_DETECT_CONFIG *const pOnsetDetectConfig, const UINT initFlags) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL == hOnset) || (pOnsetDetectConfig == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if ((pOnsetDetectConfig->maxTimeSlots > hOnset->maxTimeSlots) || +- (pOnsetDetectConfig->upperBoundOnsetDetection < +- hOnset->lowerBoundOnsetDetection)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- hOnset->maxTimeSlots = pOnsetDetectConfig->maxTimeSlots; +- hOnset->lowerBoundOnsetDetection = +- pOnsetDetectConfig->lowerBoundOnsetDetection; +- hOnset->upperBoundOnsetDetection = +- pOnsetDetectConfig->upperBoundOnsetDetection; +- +- hOnset->minTransientDistance = +- 8; /* minimum distance between detected transients */ +- hOnset->avgEnergyDistance = 16; /* average energy distance */ +- +- hOnset->avgEnergyDistanceScale = 4; +- +- /* Init / Reset */ +- if (initFlags) { +- int i; +- for (i = 0; i < hOnset->avgEnergyDistance + hOnset->maxTimeSlots; i++) +- hOnset->pEnergyHistScale[i] = -(DFRACT_BITS - 3); +- +- FDKmemset_flex( +- hOnset->pEnergyHist__FDK, +- FL2FXCONST_DBL(SACENC_FLOAT_EPSILON * (1 << (DFRACT_BITS - 3))), +- hOnset->avgEnergyDistance + hOnset->maxTimeSlots); +- } +- } +- +-bail: +- return error; +-} +- +-/**************************************************************************/ +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Close(HANDLE_ONSET_DETECT *phOnset) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((NULL != phOnset) && (NULL != *phOnset)) { +- if (NULL != (*phOnset)->pEnergyHist__FDK) { +- FDKfree((*phOnset)->pEnergyHist__FDK); +- } +- (*phOnset)->pEnergyHist__FDK = NULL; +- +- if (NULL != (*phOnset)->pEnergyHistScale) { +- FDKfree((*phOnset)->pEnergyHistScale); +- } +- (*phOnset)->pEnergyHistScale = NULL; +- FDKfree(*phOnset); +- *phOnset = NULL; +- } +- return error; +-} +- +-/**************************************************************************/ +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Update(HANDLE_ONSET_DETECT hOnset, +- const INT timeSlots) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hOnset) { +- error = SACENC_INVALID_HANDLE; +- } else { +- if (timeSlots > hOnset->maxTimeSlots) { +- error = SACENC_INVALID_CONFIG; +- } else { +- int i; +- /* Shift old data */ +- for (i = 0; i < hOnset->avgEnergyDistance; i++) { +- hOnset->pEnergyHist__FDK[i] = hOnset->pEnergyHist__FDK[i + timeSlots]; +- hOnset->pEnergyHistScale[i] = hOnset->pEnergyHistScale[i + timeSlots]; +- } +- +- /* Clear for new data */ +- FDKmemset_flex(&hOnset->pEnergyHist__FDK[hOnset->avgEnergyDistance], +- FL2FXCONST_DBL(SACENC_FLOAT_EPSILON), timeSlots); +- } +- } +- return error; +-} +- +-/**************************************************************************/ +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Apply( +- HANDLE_ONSET_DETECT hOnset, const INT nTimeSlots, const INT nHybridBands, +- FIXP_DPK *const *const ppHybridData__FDK, const INT hybridDataScale, +- const INT prevPos, INT pTransientPos[MAX_NUM_TRANS]) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- C_ALLOC_SCRATCH_START(envs, FIXP_DBL, (16 + MAX_TIME_SLOTS)) +- FDKmemclear(envs, (16 + MAX_TIME_SLOTS) * sizeof(FIXP_DBL)); +- +- if ((hOnset == NULL) || (pTransientPos == NULL) || +- (ppHybridData__FDK == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i, ts, trCnt, currPos; +- +- if ((nTimeSlots < 0) || (nTimeSlots > hOnset->maxTimeSlots) || +- (hOnset->lowerBoundOnsetDetection < -1) || +- (hOnset->upperBoundOnsetDetection > nHybridBands)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- const int lowerBoundOnsetDetection = hOnset->lowerBoundOnsetDetection; +- const int upperBoundOnsetDetection = hOnset->upperBoundOnsetDetection; +- const int M = hOnset->avgEnergyDistance; +- +- { +- SCHAR *envScale = hOnset->pEnergyHistScale; +- FIXP_DBL *env = hOnset->pEnergyHist__FDK; +- const FIXP_DBL threshold_square = SPACE_ONSET_THRESHOLD_SQUARE; +- +- trCnt = 0; +- +- /* reset transient array */ +- FDKmemset_flex(pTransientPos, -1, MAX_NUM_TRANS); +- +- /* minimum transient distance of minTransDist QMF samples */ +- if (prevPos > 0) { +- currPos = FDKmax(nTimeSlots, +- prevPos - nTimeSlots + hOnset->minTransientDistance); +- } else { +- currPos = nTimeSlots; +- } +- +- /* get energy and scalefactor for each time slot */ +- int outScale; +- int inScale = 3; /* scale factor determined empirically */ +- for (ts = 0; ts < nTimeSlots; ts++) { +- env[M + ts] = sumUpCplxPow2( +- &ppHybridData__FDK[ts][lowerBoundOnsetDetection + 1], +- SUM_UP_DYNAMIC_SCALE, inScale, &outScale, +- upperBoundOnsetDetection - lowerBoundOnsetDetection - 1); +- envScale[M + ts] = outScale + (hybridDataScale << 1); +- } +- +- /* calculate common scale for all time slots */ +- SCHAR maxScale = -(DFRACT_BITS - 1); +- for (i = 0; i < (nTimeSlots + M); i++) { +- maxScale = fixMax(maxScale, envScale[i]); +- } +- +- /* apply common scale and store energy in temporary buffer */ +- for (i = 0; i < (nTimeSlots + M); i++) { +- envs[i] = env[i] >> fixMin((maxScale - envScale[i]), (DFRACT_BITS - 1)); +- } +- +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- for (i = 0; i < (nTimeSlots + M); i++) { +- maxVal |= fAbs(envs[i]); +- } +- +- int s = fixMax(0, CntLeadingZeros(maxVal) - 1); +- +- for (i = 0; i < (nTimeSlots + M); i++) { +- envs[i] = envs[i] << s; +- } +- +- int currPosPrev = currPos; +- FIXP_DBL p1, p2; +- p2 = FL2FXCONST_DBL(0.0f); +- for (; (currPos < (nTimeSlots << 1)) && (trCnt < MAX_NUM_TRANS); +- currPos++) { +- p1 = fMultDiv2(envs[currPos - nTimeSlots + M], threshold_square) >> +- (SPACE_ONSET_THRESHOLD_SF - 1); +- +- /* Calculate average of past M energy values */ +- if (currPosPrev == (currPos - 1)) { +- /* remove last and add new element */ +- p2 -= (envs[currPosPrev - nTimeSlots] >> +- (int)hOnset->avgEnergyDistanceScale); +- p2 += (envs[currPos - nTimeSlots + M - 1] >> +- (int)hOnset->avgEnergyDistanceScale); +- } else { +- /* calculate complete vector */ +- p2 = FL2FXCONST_DBL(0.0f); +- for (ts = 0; ts < M; ts++) { +- p2 += (envs[currPos - nTimeSlots + ts] >> +- (int)hOnset->avgEnergyDistanceScale); +- } +- } +- currPosPrev = currPos; +- +- { +- /* save position if transient found */ +- if (p1 > p2) { +- pTransientPos[trCnt++] = currPos; +- currPos += hOnset->minTransientDistance; +- } +- } +- } /* for currPos */ +- } +- +- } /* valid handle*/ +-bail: +- +- C_ALLOC_SCRATCH_END(envs, FIXP_DBL, (16 + MAX_TIME_SLOTS)) +- +- return error; +-} +- +-/**************************************************************************/ +diff --git a/libSACenc/src/sacenc_onsetdetect.h b/libSACenc/src/sacenc_onsetdetect.h +deleted file mode 100644 +index 5f3f0bd..0000000 +--- a/libSACenc/src/sacenc_onsetdetect.h ++++ /dev/null +@@ -1,154 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Determine TES flags +- +-*******************************************************************************/ +- +-#ifndef SACENC_ONSETDETECT_H +-#define SACENC_ONSETDETECT_H +- +-/**************************************************************************/ /** +- \file +- Description of file contents +- ******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "common_fix.h" +-#include "FDK_matrixCalloc.h" +-#include "sacenc_lib.h" +-#include "sacenc_bitstream.h" /* for def. of MAX_NUM_PARAMS */ +- +-/* Defines *******************************************************************/ +-#define MAX_NUM_TRANS (MAX_NUM_PARAMS / 2) +- +-/* Data Types ****************************************************************/ +-typedef struct T_ONSET_DETECT_CONFIG { +- INT maxTimeSlots; +- +- /* calc transien detection in ]lowerBoundOnsetDetection; +- * upperBoundOnsetDetection[ */ +- INT lowerBoundOnsetDetection; +- INT upperBoundOnsetDetection; +- +-} ONSET_DETECT_CONFIG; +- +-typedef struct ONSET_DETECT *HANDLE_ONSET_DETECT; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Open(HANDLE_ONSET_DETECT *phOnset, +- const UINT maxTimeSlots); +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Init( +- HANDLE_ONSET_DETECT hOnset, +- const ONSET_DETECT_CONFIG *const pOnsetDetectConfig, const UINT initFlags); +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Close(HANDLE_ONSET_DETECT *phOnset); +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Update(HANDLE_ONSET_DETECT hOnset, +- const INT timeSlots); +- +-FDK_SACENC_ERROR fdk_sacenc_onsetDetect_Apply( +- HANDLE_ONSET_DETECT hOnset, const INT nTimeSlots, const INT nHybridBands, +- FIXP_DPK *const *const ppHybridData__FDK, const INT hybridDataScale, +- const INT prevPos, INT pTransientPos[MAX_NUM_TRANS]); +- +-#endif /* SACENC_ONSETDETECT_H */ +diff --git a/libSACenc/src/sacenc_paramextract.cpp b/libSACenc/src/sacenc_paramextract.cpp +deleted file mode 100644 +index dcbce1e..0000000 +--- a/libSACenc/src/sacenc_paramextract.cpp ++++ /dev/null +@@ -1,725 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Multrus +- +- Description: Parameter Extraction +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_paramextract.h" +-#include "sacenc_tree.h" +-#include "sacenc_vectorfunctions.h" +- +-/* Defines *******************************************************************/ +-#define LOG10_2_10 (3.01029995664f) /* 10.0f*log10(2.f) */ +-#define SCALE_CLDE_SF (7) /* maxVal in Quant tab is +/- 50 */ +-#define SCALE_CLDD_SF (8) /* maxVal in Quant tab is +/- 150 */ +- +-/* Data Types ****************************************************************/ +-typedef struct T_TTO_BOX { +- FIXP_DBL pCld__FDK[MAX_NUM_PARAM_BANDS]; +- FIXP_DBL pIcc__FDK[MAX_NUM_PARAM_BANDS]; +- FIXP_DBL pCldQuant__FDK[MAX_NUM_PARAM_BANDS]; +- +- const FIXP_DBL *pIccQuantTable__FDK; +- const FIXP_DBL *pCldQuantTableDec__FDK; +- const FIXP_DBL *pCldQuantTableEnc__FDK; +- +- SCHAR pCldEbQIdx[MAX_NUM_PARAM_BANDS]; +- SCHAR pIccDownmixIdx[MAX_NUM_PARAM_BANDS]; +- +- UCHAR *pParameterBand2HybridBandOffset; +- const INT *pSubbandImagSign; +- UCHAR nHybridBandsMax; +- UCHAR nParameterBands; +- UCHAR bFrameKeep; +- +- UCHAR iccCorrelationCoherenceBorder; +- BOX_QUANTMODE boxQuantMode; +- +- UCHAR nIccQuantSteps; +- UCHAR nIccQuantOffset; +- +- UCHAR nCldQuantSteps; +- UCHAR nCldQuantOffset; +- +- UCHAR bUseCoarseQuantCld; +- UCHAR bUseCoarseQuantIcc; +- +-} TTO_BOX; +- +-struct BOX_SUBBAND_SETUP { +- BOX_SUBBAND_CONFIG subbandConfig; +- UCHAR nParameterBands; +- const UCHAR *pSubband2ParameterIndexLd; +- UCHAR iccCorrelationCoherenceBorder; +-}; +- +-/* Constants *****************************************************************/ +-static const UCHAR subband2Parameter4_Ld[NUM_QMF_BANDS] = { +- 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; +- +-static const UCHAR subband2Parameter5_Ld[NUM_QMF_BANDS] = { +- 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; +- +-static const UCHAR subband2Parameter7_Ld[NUM_QMF_BANDS] = { +- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, +- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; +- +-static const UCHAR subband2Parameter9_Ld[NUM_QMF_BANDS] = { +- 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, +- 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; +- +-static const UCHAR subband2Parameter12_Ld[NUM_QMF_BANDS] = { +- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, +- 8, 8, 9, 9, 9, 9, 9, 10, 10, 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, 11}; +- +-static const UCHAR subband2Parameter15_Ld[NUM_QMF_BANDS] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11, +- 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, +- 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}; +- +-static const UCHAR subband2Parameter23_Ld[NUM_QMF_BANDS] = { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, +- 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, +- 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, +- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}; +- +-static const INT subbandImagSign_Ld[NUM_QMF_BANDS] = { +- 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, 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, +-}; +- +-#define SCALE_CLDE(a) (FL2FXCONST_DBL(a / (float)(1 << SCALE_CLDE_SF))) +-static const FIXP_DBL cldQuantTableFineEnc__FDK[MAX_CLD_QUANT_FINE] = { +- SCALE_CLDE(-50.0), SCALE_CLDE(-45.0), SCALE_CLDE(-40.0), SCALE_CLDE(-35.0), +- SCALE_CLDE(-30.0), SCALE_CLDE(-25.0), SCALE_CLDE(-22.0), SCALE_CLDE(-19.0), +- SCALE_CLDE(-16.0), SCALE_CLDE(-13.0), SCALE_CLDE(-10.0), SCALE_CLDE(-8.0), +- SCALE_CLDE(-6.0), SCALE_CLDE(-4.0), SCALE_CLDE(-2.0), SCALE_CLDE(0.0), +- SCALE_CLDE(2.0), SCALE_CLDE(4.0), SCALE_CLDE(6.0), SCALE_CLDE(8.0), +- SCALE_CLDE(10.0), SCALE_CLDE(13.0), SCALE_CLDE(16.0), SCALE_CLDE(19.0), +- SCALE_CLDE(22.0), SCALE_CLDE(25.0), SCALE_CLDE(30.0), SCALE_CLDE(35.0), +- SCALE_CLDE(40.0), SCALE_CLDE(45.0), SCALE_CLDE(50.0)}; +- +-static const FIXP_DBL cldQuantTableCoarseEnc__FDK[MAX_CLD_QUANT_COARSE] = { +- SCALE_CLDE(-50.0), SCALE_CLDE(-35.0), SCALE_CLDE(-25.0), SCALE_CLDE(-19.0), +- SCALE_CLDE(-13.0), SCALE_CLDE(-8.0), SCALE_CLDE(-4.0), SCALE_CLDE(0.0), +- SCALE_CLDE(4.0), SCALE_CLDE(8.0), SCALE_CLDE(13.0), SCALE_CLDE(19.0), +- SCALE_CLDE(25.0), SCALE_CLDE(35.0), SCALE_CLDE(50.0)}; +- +-#define SCALE_CLDD(a) (FL2FXCONST_DBL(a / (float)(1 << SCALE_CLDD_SF))) +-static const FIXP_DBL cldQuantTableFineDec__FDK[MAX_CLD_QUANT_FINE] = { +- SCALE_CLDD(-150.0), SCALE_CLDD(-45.0), SCALE_CLDD(-40.0), SCALE_CLDD(-35.0), +- SCALE_CLDD(-30.0), SCALE_CLDD(-25.0), SCALE_CLDD(-22.0), SCALE_CLDD(-19.0), +- SCALE_CLDD(-16.0), SCALE_CLDD(-13.0), SCALE_CLDD(-10.0), SCALE_CLDD(-8.0), +- SCALE_CLDD(-6.0), SCALE_CLDD(-4.0), SCALE_CLDD(-2.0), SCALE_CLDD(0.0), +- SCALE_CLDD(2.0), SCALE_CLDD(4.0), SCALE_CLDD(6.0), SCALE_CLDD(8.0), +- SCALE_CLDD(10.0), SCALE_CLDD(13.0), SCALE_CLDD(16.0), SCALE_CLDD(19.0), +- SCALE_CLDD(22.0), SCALE_CLDD(25.0), SCALE_CLDD(30.0), SCALE_CLDD(35.0), +- SCALE_CLDD(40.0), SCALE_CLDD(45.0), SCALE_CLDD(150.0)}; +- +-static const FIXP_DBL cldQuantTableCoarseDec__FDK[MAX_CLD_QUANT_COARSE] = { +- SCALE_CLDD(-150.0), SCALE_CLDD(-35.0), SCALE_CLDD(-25.0), SCALE_CLDD(-19.0), +- SCALE_CLDD(-13.0), SCALE_CLDD(-8.0), SCALE_CLDD(-4.0), SCALE_CLDD(0.0), +- SCALE_CLDD(4.0), SCALE_CLDD(8.0), SCALE_CLDD(13.0), SCALE_CLDD(19.0), +- SCALE_CLDD(25.0), SCALE_CLDD(35.0), SCALE_CLDD(150.0)}; +- +-#define SCALE_ICC(a) (FL2FXCONST_DBL(a)) +-static const FIXP_DBL iccQuantTableFine__FDK[MAX_ICC_QUANT_FINE] = { +- SCALE_ICC(0.99999999953), SCALE_ICC(0.937f), SCALE_ICC(0.84118f), +- SCALE_ICC(0.60092f), SCALE_ICC(0.36764f), SCALE_ICC(0.0f), +- SCALE_ICC(-0.589f), SCALE_ICC(-0.99f)}; +- +-static const FIXP_DBL iccQuantTableCoarse__FDK[MAX_ICC_QUANT_COARSE] = { +- SCALE_ICC(0.99999999953), SCALE_ICC(0.84118f), SCALE_ICC(0.36764f), +- SCALE_ICC(-0.5890f)}; +- +-static const BOX_SUBBAND_SETUP boxSubbandSetup[] = { +- {BOX_SUBBANDS_4, 4, subband2Parameter4_Ld, 1}, +- {BOX_SUBBANDS_5, 5, subband2Parameter5_Ld, 2}, +- {BOX_SUBBANDS_7, 7, subband2Parameter7_Ld, 3}, +- {BOX_SUBBANDS_9, 9, subband2Parameter9_Ld, 4}, +- {BOX_SUBBANDS_12, 12, subband2Parameter12_Ld, 4}, +- {BOX_SUBBANDS_15, 15, subband2Parameter15_Ld, 5}, +- {BOX_SUBBANDS_23, 23, subband2Parameter23_Ld, 8}}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static const BOX_SUBBAND_SETUP *getBoxSubbandSetup( +- const BOX_SUBBAND_CONFIG subbandConfig) { +- int i; +- const BOX_SUBBAND_SETUP *setup = NULL; +- +- for (i = 0; i < (int)(sizeof(boxSubbandSetup) / sizeof(BOX_SUBBAND_SETUP)); +- i++) { +- if (boxSubbandSetup[i].subbandConfig == subbandConfig) { +- setup = &boxSubbandSetup[i]; +- break; +- } +- } +- return setup; +-} +- +-static inline void ApplyBBCuesFDK(FIXP_DBL *const pData, +- const INT nParamBands) { +- int i, s; +- FIXP_DBL tmp, invParamBands; +- +- invParamBands = fDivNormHighPrec((FIXP_DBL)1, (FIXP_DBL)nParamBands, &s); +- s = -s; +- +- tmp = fMult(pData[0], invParamBands) >> s; +- for (i = 1; i < nParamBands; i++) { +- tmp += fMult(pData[i], invParamBands) >> s; +- } +- +- for (i = 0; i < nParamBands; i++) { +- pData[i] = tmp; +- } +-} +- +-static INT getNumberParameterBands(const BOX_SUBBAND_CONFIG subbandConfig) { +- const BOX_SUBBAND_SETUP *setup = getBoxSubbandSetup(subbandConfig); +- return ((setup == NULL) ? 0 : setup->nParameterBands); +-} +- +-static const UCHAR *getSubband2ParameterIndex( +- const BOX_SUBBAND_CONFIG subbandConfig) { +- const BOX_SUBBAND_SETUP *setup = getBoxSubbandSetup(subbandConfig); +- +- return ((setup == NULL) ? NULL : (setup->pSubband2ParameterIndexLd)); +-} +- +-void fdk_sacenc_calcParameterBand2HybridBandOffset( +- const BOX_SUBBAND_CONFIG subbandConfig, const INT nHybridBands, +- UCHAR *pParameterBand2HybridBandOffset) { +- const BOX_SUBBAND_SETUP *setup = getBoxSubbandSetup(subbandConfig); +- const UCHAR *pSubband2ParameterIndex; +- +- int i, pb; +- +- pSubband2ParameterIndex = setup->pSubband2ParameterIndexLd; +- +- for (pb = 0, i = 0; i < nHybridBands - 1; i++) { +- if (pSubband2ParameterIndex[i + 1] - pSubband2ParameterIndex[i]) { +- pParameterBand2HybridBandOffset[pb++] = (i + 1); +- } +- } +- pParameterBand2HybridBandOffset[pb++] = (i + 1); +-} +- +-const INT *fdk_sacenc_getSubbandImagSign() { +- const INT *pImagSign = NULL; +- +- pImagSign = subbandImagSign_Ld; +- +- return (pImagSign); +-} +- +-static INT getIccCorrelationCoherenceBorder( +- const BOX_SUBBAND_CONFIG subbandConfig, const INT bUseCoherenceOnly) { +- const BOX_SUBBAND_SETUP *setup = getBoxSubbandSetup(subbandConfig); +- return ( +- (setup == NULL) +- ? 0 +- : ((bUseCoherenceOnly) ? 0 : setup->iccCorrelationCoherenceBorder)); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_createTtoBox(HANDLE_TTO_BOX *hTtoBox) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hTtoBox) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDK_ALLOCATE_MEMORY_1D(*hTtoBox, 1, TTO_BOX); +- } +- return error; +- +-bail: +- fdk_sacenc_destroyTtoBox(hTtoBox); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_initTtoBox(HANDLE_TTO_BOX hTtoBox, +- const TTO_BOX_CONFIG *const ttoBoxConfig, +- UCHAR *pParameterBand2HybridBandOffset) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hTtoBox == NULL) || (ttoBoxConfig == NULL) || +- (pParameterBand2HybridBandOffset == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDKmemclear(hTtoBox, sizeof(TTO_BOX)); +- +- hTtoBox->bUseCoarseQuantCld = ttoBoxConfig->bUseCoarseQuantCld; +- hTtoBox->bUseCoarseQuantIcc = ttoBoxConfig->bUseCoarseQuantIcc; +- hTtoBox->boxQuantMode = ttoBoxConfig->boxQuantMode; +- hTtoBox->iccCorrelationCoherenceBorder = getIccCorrelationCoherenceBorder( +- ttoBoxConfig->subbandConfig, ttoBoxConfig->bUseCoherenceIccOnly); +- hTtoBox->nHybridBandsMax = ttoBoxConfig->nHybridBandsMax; +- hTtoBox->nParameterBands = +- getNumberParameterBands(ttoBoxConfig->subbandConfig); +- hTtoBox->bFrameKeep = ttoBoxConfig->bFrameKeep; +- +- hTtoBox->nIccQuantSteps = +- fdk_sacenc_getNumberIccQuantLevels(hTtoBox->bUseCoarseQuantIcc); +- hTtoBox->nIccQuantOffset = +- fdk_sacenc_getIccQuantOffset(hTtoBox->bUseCoarseQuantIcc); +- +- hTtoBox->pIccQuantTable__FDK = hTtoBox->bUseCoarseQuantIcc +- ? iccQuantTableCoarse__FDK +- : iccQuantTableFine__FDK; +- hTtoBox->pCldQuantTableDec__FDK = hTtoBox->bUseCoarseQuantCld +- ? cldQuantTableCoarseDec__FDK +- : cldQuantTableFineDec__FDK; +- hTtoBox->pCldQuantTableEnc__FDK = hTtoBox->bUseCoarseQuantCld +- ? cldQuantTableCoarseEnc__FDK +- : cldQuantTableFineEnc__FDK; +- +- hTtoBox->nCldQuantSteps = +- fdk_sacenc_getNumberCldQuantLevels(hTtoBox->bUseCoarseQuantCld); +- hTtoBox->nCldQuantOffset = +- fdk_sacenc_getCldQuantOffset(hTtoBox->bUseCoarseQuantCld); +- +- /* sanity */ +- if (NULL == (hTtoBox->pParameterBand2HybridBandOffset = +- pParameterBand2HybridBandOffset)) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- +- if (NULL == (hTtoBox->pSubbandImagSign = fdk_sacenc_getSubbandImagSign())) { +- error = SACENC_INIT_ERROR; +- } +- +- if ((hTtoBox->boxQuantMode != BOX_QUANTMODE_FINE) && +- (hTtoBox->boxQuantMode != BOX_QUANTMODE_EBQ1) && +- (hTtoBox->boxQuantMode != BOX_QUANTMODE_EBQ2)) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- } +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_destroyTtoBox(HANDLE_TTO_BOX *hTtoBox) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (*hTtoBox != NULL) { +- FDKfree(*hTtoBox); +- *hTtoBox = NULL; +- } +- +- return error; +-} +- +-static FDK_SACENC_ERROR calculateIccFDK(const INT nParamBand, +- const INT correlationCoherenceBorder, +- const FIXP_DBL *const pPwr1, +- const FIXP_DBL *const pPwr2, +- const FIXP_DBL *const pProdReal, +- FIXP_DBL const *const pProdImag, +- FIXP_DBL *const pIcc) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((pPwr1 == NULL) || (pPwr2 == NULL) || (pProdReal == NULL) || +- (pProdImag == NULL) || (pIcc == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* sanity check border */ +- if (correlationCoherenceBorder > nParamBand) { +- error = SACENC_INVALID_CONFIG; +- } else { +- /* correlation */ +- FDKcalcCorrelationVec(pIcc, pProdReal, pPwr1, pPwr2, +- correlationCoherenceBorder); +- +- /* coherence */ +- calcCoherenceVec(&pIcc[correlationCoherenceBorder], +- &pProdReal[correlationCoherenceBorder], +- &pProdImag[correlationCoherenceBorder], +- &pPwr1[correlationCoherenceBorder], +- &pPwr2[correlationCoherenceBorder], 0, 0, +- nParamBand - correlationCoherenceBorder); +- +- } /* valid configuration */ +- } /* valid handle */ +- +- return error; +-} +- +-static void QuantizeCoefFDK(const FIXP_DBL *const input, const INT nBands, +- const FIXP_DBL *const quantTable, +- const INT idxOffset, const INT nQuantSteps, +- SCHAR *const quantOut) { +- int band; +- const int reverse = (quantTable[0] > quantTable[1]); +- +- for (band = 0; band < nBands; band++) { +- FIXP_DBL qVal; +- FIXP_DBL curVal = input[band]; +- +- int lower = 0; +- int upper = nQuantSteps - 1; +- +- if (reverse) { +- while (upper - lower > 1) { +- int idx = (lower + upper) >> 1; +- qVal = quantTable[idx]; +- if (curVal >= qVal) { +- upper = idx; +- } else { +- lower = idx; +- } +- } /* while */ +- +- if ((curVal - quantTable[lower]) >= (quantTable[upper] - curVal)) { +- quantOut[band] = lower - idxOffset; +- } else { +- quantOut[band] = upper - idxOffset; +- } +- } /* if reverse */ +- else { +- while (upper - lower > 1) { +- int idx = (lower + upper) >> 1; +- qVal = quantTable[idx]; +- if (curVal <= qVal) { +- upper = idx; +- } else { +- lower = idx; +- } +- } /* while */ +- +- if ((curVal - quantTable[lower]) <= (quantTable[upper] - curVal)) { +- quantOut[band] = lower - idxOffset; +- } else { +- quantOut[band] = upper - idxOffset; +- } +- } /* else reverse */ +- } /* for band */ +-} +- +-static void deQuantizeCoefFDK(const SCHAR *const input, const INT nBands, +- const FIXP_DBL *const quantTable, +- const INT idxOffset, FIXP_DBL *const dequantOut) { +- int band; +- +- for (band = 0; band < nBands; band++) { +- dequantOut[band] = quantTable[input[band] + idxOffset]; +- } +-} +- +-static void CalculateCldFDK(FIXP_DBL *const pCld, const FIXP_DBL *const pPwr1, +- const FIXP_DBL *const pPwr2, const INT scaleCh1, +- const INT *const pbScaleCh1, const INT scaleCh2, +- const INT *const pbScaleCh2, const int nParamBand) { +- INT i; +- FIXP_DBL ldPwr1, ldPwr2, cld; +- FIXP_DBL maxPwr = FL2FXCONST_DBL( +- 30.0f / +- (1 << (LD_DATA_SHIFT + +- 1))); /* consider SACENC_FLOAT_EPSILON in power calculation */ +- +- for (i = 0; i < nParamBand; i++) { +- ldPwr1 = +- (CalcLdData(pPwr1[i]) >> 1) + ((FIXP_DBL)(scaleCh1 + pbScaleCh1[i]) +- << (DFRACT_BITS - 1 - LD_DATA_SHIFT)); +- ldPwr2 = +- (CalcLdData(pPwr2[i]) >> 1) + ((FIXP_DBL)(scaleCh2 + pbScaleCh2[i]) +- << (DFRACT_BITS - 1 - LD_DATA_SHIFT)); +- +- ldPwr1 = fixMax(fixMin(ldPwr1, maxPwr), -maxPwr); +- ldPwr2 = fixMax(fixMin(ldPwr2, maxPwr), -maxPwr); +- +- /* ldPwr1 and ldPwr2 are scaled by LD_DATA_SHIFT and additional 1 bit; 1 bit +- * scale by fMultDiv2() */ +- cld = fMultDiv2(FL2FXCONST_DBL(LOG10_2_10 / (1 << SCALE_CLDE_SF)), +- ldPwr1 - ldPwr2); +- +- cld = +- fixMin(cld, (FIXP_DBL)(((FIXP_DBL)MAXVAL_DBL) >> (LD_DATA_SHIFT + 2))); +- cld = +- fixMax(cld, (FIXP_DBL)(((FIXP_DBL)MINVAL_DBL) >> (LD_DATA_SHIFT + 2))); +- pCld[i] = cld << (LD_DATA_SHIFT + 2); +- } +-} +- +-FDK_SACENC_ERROR fdk_sacenc_applyTtoBox( +- HANDLE_TTO_BOX hTtoBox, const INT nTimeSlots, const INT startTimeSlot, +- const INT nHybridBands, const FIXP_DPK *const *const ppHybridData1__FDK, +- const FIXP_DPK *const *const ppHybridData2__FDK, SCHAR *const pIccIdx, +- UCHAR *const pbIccQuantCoarse, SCHAR *const pCldIdx, +- UCHAR *const pbCldQuantCoarse, const INT bUseBBCues, INT *scaleCh1, +- INT *scaleCh2) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- C_ALLOC_SCRATCH_START(powerHybridData1__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(powerHybridData2__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(prodHybridDataReal__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(prodHybridDataImag__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- +- C_ALLOC_SCRATCH_START(IccDownmix__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(IccDownmixQuant__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(pbScaleCh1, INT, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_START(pbScaleCh2, INT, MAX_NUM_PARAM_BANDS) +- +- if ((hTtoBox == NULL) || (pCldIdx == NULL) || (pbCldQuantCoarse == NULL) || +- (ppHybridData1__FDK == NULL) || (ppHybridData2__FDK == NULL) || +- (pIccIdx == NULL) || (pbIccQuantCoarse == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int j, pb; +- const int nParamBands = hTtoBox->nParameterBands; +- const int bUseEbQ = (hTtoBox->boxQuantMode == BOX_QUANTMODE_EBQ1) || +- (hTtoBox->boxQuantMode == BOX_QUANTMODE_EBQ2); +- +- /* sanity check */ +- if ((nHybridBands < 0) || (nHybridBands > hTtoBox->nHybridBandsMax)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- int outScale; /* scalefactor will not be evaluated */ +- int inScale = 5; /* scale factor determined empirically */ +- +- /* calculate the headroom of the hybrid data for each parameter band */ +- FDKcalcPbScaleFactor(ppHybridData1__FDK, +- hTtoBox->pParameterBand2HybridBandOffset, pbScaleCh1, +- startTimeSlot, nTimeSlots, nParamBands); +- FDKcalcPbScaleFactor(ppHybridData2__FDK, +- hTtoBox->pParameterBand2HybridBandOffset, pbScaleCh2, +- startTimeSlot, nTimeSlots, nParamBands); +- +- for (j = 0, pb = 0; pb < nParamBands; pb++) { +- FIXP_DBL data1, data2; +- data1 = data2 = (FIXP_DBL)0; +- for (; j < hTtoBox->pParameterBand2HybridBandOffset[pb]; j++) { +- data1 += sumUpCplxPow2Dim2(ppHybridData1__FDK, SUM_UP_STATIC_SCALE, +- inScale + pbScaleCh1[pb], &outScale, +- startTimeSlot, nTimeSlots, j, j + 1); +- data2 += sumUpCplxPow2Dim2(ppHybridData2__FDK, SUM_UP_STATIC_SCALE, +- inScale + pbScaleCh2[pb], &outScale, +- startTimeSlot, nTimeSlots, j, j + 1); +- } /* for j */ +- powerHybridData1__FDK[pb] = data1; +- powerHybridData2__FDK[pb] = data2; +- } /* pb */ +- +- { +- for (j = 0, pb = 0; pb < nParamBands; pb++) { +- FIXP_DBL dataReal, dataImag; +- dataReal = dataImag = (FIXP_DBL)0; +- for (; j < hTtoBox->pParameterBand2HybridBandOffset[pb]; j++) { +- FIXP_DPK scalarProd; +- cplx_cplxScalarProduct(&scalarProd, ppHybridData1__FDK, +- ppHybridData2__FDK, inScale + pbScaleCh1[pb], +- inScale + pbScaleCh2[pb], &outScale, +- startTimeSlot, nTimeSlots, j, j + 1); +- dataReal += scalarProd.v.re; +- if (hTtoBox->pSubbandImagSign[j] < 0) { +- dataImag -= scalarProd.v.im; +- } else { +- dataImag += scalarProd.v.im; +- } +- } /* for j */ +- prodHybridDataReal__FDK[pb] = dataReal; +- prodHybridDataImag__FDK[pb] = dataImag; +- } /* pb */ +- +- if (SACENC_OK != (error = calculateIccFDK( +- nParamBands, hTtoBox->iccCorrelationCoherenceBorder, +- powerHybridData1__FDK, powerHybridData2__FDK, +- prodHybridDataReal__FDK, prodHybridDataImag__FDK, +- hTtoBox->pIcc__FDK))) { +- goto bail; +- } +- +- /* calculate correlation based Icc for downmix */ +- if (SACENC_OK != (error = calculateIccFDK( +- nParamBands, nParamBands, powerHybridData1__FDK, +- powerHybridData2__FDK, prodHybridDataReal__FDK, +- prodHybridDataImag__FDK, IccDownmix__FDK))) { +- goto bail; +- } +- } +- +- if (!bUseEbQ) { +- CalculateCldFDK(hTtoBox->pCld__FDK, powerHybridData1__FDK, +- powerHybridData2__FDK, *scaleCh1 + inScale + 1, +- pbScaleCh1, *scaleCh2 + inScale + 1, pbScaleCh2, +- nParamBands); +- } +- +- if (bUseBBCues) { +- ApplyBBCuesFDK(&hTtoBox->pCld__FDK[0], nParamBands); +- +- { ApplyBBCuesFDK(&hTtoBox->pIcc__FDK[0], nParamBands); } +- +- } /* bUseBBCues */ +- +- /* quantize/de-quantize icc */ +- { +- QuantizeCoefFDK(hTtoBox->pIcc__FDK, nParamBands, +- hTtoBox->pIccQuantTable__FDK, hTtoBox->nIccQuantOffset, +- hTtoBox->nIccQuantSteps, pIccIdx); +- QuantizeCoefFDK(IccDownmix__FDK, nParamBands, +- hTtoBox->pIccQuantTable__FDK, hTtoBox->nIccQuantOffset, +- hTtoBox->nIccQuantSteps, hTtoBox->pIccDownmixIdx); +- deQuantizeCoefFDK(hTtoBox->pIccDownmixIdx, nParamBands, +- hTtoBox->pIccQuantTable__FDK, hTtoBox->nIccQuantOffset, +- IccDownmixQuant__FDK); +- +- *pbIccQuantCoarse = hTtoBox->bUseCoarseQuantIcc; +- } +- +- /* quantize/de-quantize cld */ +- if (!bUseEbQ) { +- QuantizeCoefFDK(hTtoBox->pCld__FDK, nParamBands, +- hTtoBox->pCldQuantTableEnc__FDK, hTtoBox->nCldQuantOffset, +- hTtoBox->nCldQuantSteps, pCldIdx); +- deQuantizeCoefFDK(pCldIdx, nParamBands, hTtoBox->pCldQuantTableDec__FDK, +- hTtoBox->nCldQuantOffset, hTtoBox->pCldQuant__FDK); +- } else { +- FDKmemcpy(pCldIdx, hTtoBox->pCldEbQIdx, nParamBands * sizeof(SCHAR)); +- } +- *pbCldQuantCoarse = hTtoBox->bUseCoarseQuantCld; +- +- } /* valid handle */ +- +-bail: +- C_ALLOC_SCRATCH_END(pbScaleCh2, INT, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(pbScaleCh1, INT, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(IccDownmixQuant__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(IccDownmix__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- +- C_ALLOC_SCRATCH_END(prodHybridDataImag__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(prodHybridDataReal__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(powerHybridData2__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- C_ALLOC_SCRATCH_END(powerHybridData1__FDK, FIXP_DBL, MAX_NUM_PARAM_BANDS) +- +- return error; +-} +- +-INT fdk_sacenc_subband2ParamBand(const BOX_SUBBAND_CONFIG boxSubbandConfig, +- const INT nSubband) { +- INT nParamBand = -1; +- const UCHAR *pSubband2ParameterIndex = +- getSubband2ParameterIndex(boxSubbandConfig); +- +- if (pSubband2ParameterIndex != NULL) { +- const int hybrid_resolution = 64; +- +- if ((nSubband > -1) && (nSubband < hybrid_resolution)) { +- nParamBand = pSubband2ParameterIndex[nSubband]; +- } +- } +- +- return nParamBand; +-} +diff --git a/libSACenc/src/sacenc_paramextract.h b/libSACenc/src/sacenc_paramextract.h +deleted file mode 100644 +index 9ebb902..0000000 +--- a/libSACenc/src/sacenc_paramextract.h ++++ /dev/null +@@ -1,214 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): M. Multrus +- +- Description: Parameter Extraction +- +-*******************************************************************************/ +- +-#ifndef SACENC_PARAMEXTRACT_H +-#define SACENC_PARAMEXTRACT_H +- +-/* Includes ******************************************************************/ +-#include "common_fix.h" +-#include "sacenc_lib.h" +-#include "sacenc_const.h" +-#include "sacenc_bitstream.h" +- +-/* Defines *******************************************************************/ +-#define MAX_CLD_QUANT_FINE (31) +-#define MAX_CLD_QUANT_COARSE (15) +-#define OFFSET_CLD_QUANT_COARSE (7) +-#define OFFSET_CLD_QUANT_FINE (15) +- +-#define MAX_ICC_QUANT_COARSE (4) +-#define MAX_ICC_QUANT_FINE (8) +-#define OFFSET_ICC_QUANT_COARSE (0) +-#define OFFSET_ICC_QUANT_FINE (0) +- +-#define MAX_NUM_PARAM_BANDS (28) +- +-#define NUM_MAPPED_HYBRID_BANDS (16) +- +-/* Data Types ****************************************************************/ +-typedef struct T_TTO_BOX *HANDLE_TTO_BOX; +- +-typedef enum { +- BOX_SUBBANDS_INVALID = 0, +- BOX_SUBBANDS_4 = 4, +- BOX_SUBBANDS_5 = 5, +- BOX_SUBBANDS_7 = 7, +- BOX_SUBBANDS_9 = 9, +- BOX_SUBBANDS_12 = 12, +- BOX_SUBBANDS_15 = 15, +- BOX_SUBBANDS_23 = 23 +- +-} BOX_SUBBAND_CONFIG; +- +-typedef enum { +- BOX_QUANTMODE_INVALID = -1, +- BOX_QUANTMODE_FINE = 0, +- BOX_QUANTMODE_EBQ1 = 1, +- BOX_QUANTMODE_EBQ2 = 2, +- BOX_QUANTMODE_RESERVED3 = 3, +- BOX_QUANTMODE_RESERVED4 = 4, +- BOX_QUANTMODE_RESERVED5 = 5, +- BOX_QUANTMODE_RESERVED6 = 6, +- BOX_QUANTMODE_RESERVED7 = 7 +- +-} BOX_QUANTMODE; +- +-typedef struct T_TTO_BOX_CONFIG { +- UCHAR bUseCoarseQuantCld; +- UCHAR bUseCoarseQuantIcc; +- UCHAR bUseCoherenceIccOnly; +- +- BOX_SUBBAND_CONFIG subbandConfig; +- BOX_QUANTMODE boxQuantMode; +- +- UCHAR nHybridBandsMax; +- +- UCHAR bFrameKeep; +- +-} TTO_BOX_CONFIG; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_createTtoBox(HANDLE_TTO_BOX *hTtoBox); +- +-FDK_SACENC_ERROR fdk_sacenc_initTtoBox(HANDLE_TTO_BOX hTtoBox, +- const TTO_BOX_CONFIG *const ttoBoxConfig, +- UCHAR *pParameterBand2HybridBandOffset); +- +-FDK_SACENC_ERROR fdk_sacenc_destroyTtoBox(HANDLE_TTO_BOX *hTtoBox); +- +-FDK_SACENC_ERROR fdk_sacenc_applyTtoBox( +- HANDLE_TTO_BOX hTtoBox, const INT nTimeSlots, const INT startTimeSlot, +- const INT nHybridBands, const FIXP_DPK *const *const ppHybridData1__FDK, +- const FIXP_DPK *const *const ppHybridData2__FDK, SCHAR *const pIccIdx, +- UCHAR *const pbIccQuantCoarse, SCHAR *const pCldIdx, +- UCHAR *const pbCldQuantCoarse, const INT bUseBBCues, INT *scaleCh0, +- INT *scaleCh1); +- +-INT fdk_sacenc_subband2ParamBand(const BOX_SUBBAND_CONFIG boxSubbandConfig, +- const INT nSubband); +- +-const INT *fdk_sacenc_getSubbandImagSign(); +- +-void fdk_sacenc_calcParameterBand2HybridBandOffset( +- const BOX_SUBBAND_CONFIG subbandConfig, const INT nHybridBands, +- UCHAR *pParameterBand2HybridBandOffset); +- +-/* Function / Class Definition ***********************************************/ +-static inline UCHAR fdk_sacenc_getCldQuantOffset(const INT bUseCoarseQuant) { +- return ((bUseCoarseQuant) ? OFFSET_CLD_QUANT_COARSE : OFFSET_CLD_QUANT_FINE); +-} +-static inline UCHAR fdk_sacenc_getIccQuantOffset(const INT bUseCoarseQuant) { +- return ((bUseCoarseQuant) ? OFFSET_ICC_QUANT_COARSE : OFFSET_ICC_QUANT_FINE); +-} +- +-static inline UCHAR fdk_sacenc_getNumberCldQuantLevels( +- const INT bUseCoarseQuant) { +- return ((bUseCoarseQuant) ? MAX_CLD_QUANT_COARSE : MAX_CLD_QUANT_FINE); +-} +-static inline UCHAR fdk_sacenc_getNumberIccQuantLevels( +- const INT bUseCoarseQuant) { +- return ((bUseCoarseQuant) ? MAX_ICC_QUANT_COARSE : MAX_ICC_QUANT_FINE); +-} +- +-#endif /* SACENC_PARAMEXTRACT_H */ +diff --git a/libSACenc/src/sacenc_staticgain.cpp b/libSACenc/src/sacenc_staticgain.cpp +deleted file mode 100644 +index fef9f8d..0000000 +--- a/libSACenc/src/sacenc_staticgain.cpp ++++ /dev/null +@@ -1,446 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Christian Goettlinger +- +- Description: Encoder Library Interface +- gain management of the encoder +- +-*******************************************************************************/ +- +-/***************************************************************************** +-\file +-This file contains all static gain infrastructure +-******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_staticgain.h" +- +-/* Defines *******************************************************************/ +-#define MP4SPACEENC_DMX_GAIN_DEFAULT SACENC_DMXGAIN_3_dB +-#define GAINCF_SF (4) +-#define GAINCT1(x) FL2FXCONST_DBL(x) +-#define GAINCF(x) FL2FXCONST_DBL(x) +- +-#define GAINCT2(x) FL2FXCONST_DBL(x) +-#define FX_DBL2FX_GAIN(x) (x) +- +-/* Data Types ****************************************************************/ +-struct STATIC_GAIN { +- /* External Config Values */ +- MP4SPACEENC_MODE encMode; +- MP4SPACEENC_DMX_GAIN fixedGainDMX; +- INT preGainFactorDb; +- +- /* Internal Values */ +- FIXP_GAIN PostGain__FDK; +- FIXP_GAIN pPreGain__FDK[SACENC_MAX_INPUT_CHANNELS]; +-}; +- +-/* Constants *****************************************************************/ +-/* +- preGainFactorTable: +- +- pre calculation: (float)pow(10.f,(((float) x)/20.f))/(float)(1<encMode = SACENC_INVALID_MODE; +- +- /* Optional Configs Set to Default Values */ +- hStaticGainConfig->fixedGainDMX = MP4SPACEENC_DMX_GAIN_DEFAULT; +- hStaticGainConfig->preGainFactorDb = 0; +- } +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_staticGain_CloseConfig() +-description: destructs Static Gain Config Structure +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_CloseConfig( +- HANDLE_STATIC_GAIN_CONFIG *phStaticGainConfig) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((phStaticGainConfig == NULL) || (*phStaticGainConfig == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDKfree(*phStaticGainConfig); +- *phStaticGainConfig = NULL; +- } +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_staticGain_Open() +-description: initializes Static Gains +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Open(HANDLE_STATIC_GAIN *phStaticGain) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == phStaticGain) { +- error = SACENC_INVALID_HANDLE; +- } else { +- /* Allocate Instance */ +- FDK_ALLOCATE_MEMORY_1D(*phStaticGain, 1, struct STATIC_GAIN); +- } +- return error; +- +-bail: +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Init( +- HANDLE_STATIC_GAIN hStaticGain, +- const HANDLE_STATIC_GAIN_CONFIG hStaticGainConfig, INT *const scale) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hStaticGain == NULL) || (hStaticGainConfig == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- hStaticGain->encMode = hStaticGainConfig->encMode; +- hStaticGain->fixedGainDMX = hStaticGainConfig->fixedGainDMX; +- hStaticGain->preGainFactorDb = hStaticGainConfig->preGainFactorDb; +- +- if ((hStaticGain->preGainFactorDb < -20) || +- (hStaticGain->preGainFactorDb > 20)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- FIXP_DBL fPreGainFactor__FDK; +- +- if (hStaticGain->preGainFactorDb == 0) { +- fPreGainFactor__FDK = (FIXP_DBL)MAXVAL_DBL; +- *scale = 0; +- } else { +- int s; +- fPreGainFactor__FDK = +- preGainFactorTable__FDK[hStaticGain->preGainFactorDb + 20]; +- s = fixMax(0, CntLeadingZeros(fPreGainFactor__FDK) - 1); +- fPreGainFactor__FDK = fPreGainFactor__FDK << (s); +- *scale = GAINCF_SF - s; +- } +- +- if (hStaticGain->fixedGainDMX == 0) +- hStaticGain->PostGain__FDK = MAXVAL_GAIN; +- else +- hStaticGain->PostGain__FDK = +- dmxGainTable__FDK[hStaticGain->fixedGainDMX - 1]; +- +- FDKmemclear( +- hStaticGain->pPreGain__FDK, +- sizeof(hStaticGain->pPreGain__FDK)); /* zero all input channels */ +- +- /* Configure PreGain-Vector */ +- if (hStaticGain->encMode == SACENC_212) { +- hStaticGain->pPreGain__FDK[0] = +- FX_DBL2FX_GAIN(fPreGainFactor__FDK); /* L */ +- hStaticGain->pPreGain__FDK[1] = +- FX_DBL2FX_GAIN(fPreGainFactor__FDK); /* R */ +- } else { +- error = SACENC_INVALID_CONFIG; +- } +- +- } /* valid handle */ +- +-bail: +- +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_staticGain_Close() +-description: destructs Static Gains +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Close(HANDLE_STATIC_GAIN *phStaticGain) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((phStaticGain == NULL) || (*phStaticGain == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- FDKfree(*phStaticGain); +- *phStaticGain = NULL; +- } +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_staticPostGain_Apply +-description: multiply the Output samples with the PostGain +-returns: noError on success, an apropriate error code else +------------------------------------------------------------------------------*/ +-FDK_SACENC_ERROR fdk_sacenc_staticPostGain_ApplyFDK( +- const HANDLE_STATIC_GAIN hStaticGain, INT_PCM *const pOutputSamples, +- const INT nOutputSamples, const INT scale) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hStaticGain) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i; +- FIXP_GAIN postGain = hStaticGain->PostGain__FDK; +- +- if (scale < 0) { +- if (postGain == MAXVAL_GAIN) { +- for (i = 0; i < nOutputSamples; i++) { +- pOutputSamples[i] = pOutputSamples[i] >> (-scale); +- } +- } else { +- for (i = 0; i < nOutputSamples; i++) { +- pOutputSamples[i] = FX_DBL2FX_PCM( +- fMult(postGain, FX_PCM2FX_DBL(pOutputSamples[i])) >> (-scale)); +- } +- } +- } else { +- if (postGain == MAXVAL_GAIN) { +- for (i = 0; i < nOutputSamples; i++) { +- pOutputSamples[i] = FX_DBL2FX_PCM(SATURATE_LEFT_SHIFT( +- FX_PCM2FX_DBL(pOutputSamples[i]), scale, DFRACT_BITS)); +- } +- } else { +- for (i = 0; i < nOutputSamples; i++) { +- pOutputSamples[i] = FX_DBL2FX_PCM(SATURATE_LEFT_SHIFT( +- fMult(postGain, FX_PCM2FX_DBL(pOutputSamples[i])), scale, +- DFRACT_BITS)); +- } +- } +- } +- } +- return error; +-} +- +-/*----------------------------------------------------------------------------- +-functionname: fdk_sacenc_getPreGainPtr()/ fdk_sacenc_getPostGain() +-description: get Gain-Pointers from struct +-returns: Pointer to PreGain or postGain +------------------------------------------------------------------------------*/ +-FIXP_GAIN *fdk_sacenc_getPreGainPtrFDK(HANDLE_STATIC_GAIN hStaticGain) { +- return ((hStaticGain == NULL) ? NULL : hStaticGain->pPreGain__FDK); +-} +- +-FIXP_GAIN fdk_sacenc_getPostGainFDK(HANDLE_STATIC_GAIN hStaticGain) { +- return (hStaticGain->PostGain__FDK); +-} +- +-/* get fixed downmix gain and map it to bitstream enum */ +-FIXEDGAINDMXCONFIG fdk_sacenc_staticGain_GetDmxGain( +- const HANDLE_STATIC_GAIN hStaticGain) { +- FIXEDGAINDMXCONFIG dmxGain = FIXEDGAINDMX_INVALID; +- +- switch (hStaticGain->fixedGainDMX) { +- case 0: +- dmxGain = FIXEDGAINDMX_0; +- break; +- case 1: +- dmxGain = FIXEDGAINDMX_1; +- break; +- case 2: +- dmxGain = FIXEDGAINDMX_2; +- break; +- case 3: +- dmxGain = FIXEDGAINDMX_3; +- break; +- case 4: +- dmxGain = FIXEDGAINDMX_4; +- break; +- case 5: +- dmxGain = FIXEDGAINDMX_5; +- break; +- case 6: +- dmxGain = FIXEDGAINDMX_6; +- break; +- case 7: +- dmxGain = FIXEDGAINDMX_7; +- break; +- default: +- dmxGain = FIXEDGAINDMX_INVALID; +- } +- return dmxGain; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_SetDmxGain( +- HANDLE_STATIC_GAIN_CONFIG hStaticGainCfg, +- const MP4SPACEENC_DMX_GAIN dmxGain) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hStaticGainCfg) { +- error = SACENC_INVALID_HANDLE; +- } else { +- hStaticGainCfg->fixedGainDMX = dmxGain; +- } +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_SetEncMode( +- HANDLE_STATIC_GAIN_CONFIG hStaticGainCfg, const MP4SPACEENC_MODE encMode) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if (NULL == hStaticGainCfg) { +- error = SACENC_INVALID_HANDLE; +- } else { +- hStaticGainCfg->encMode = encMode; +- } +- return error; +-} +diff --git a/libSACenc/src/sacenc_staticgain.h b/libSACenc/src/sacenc_staticgain.h +deleted file mode 100644 +index 5db3bec..0000000 +--- a/libSACenc/src/sacenc_staticgain.h ++++ /dev/null +@@ -1,177 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Christian Goettlinger +- +- Description: Encoder Library Interfac +- gain management of the encoder +- +-*******************************************************************************/ +- +-/**************************************************************************/ /** +- \file +- ******************************************************************************/ +- +-#ifndef SACENC_STATICGAIN_H +-#define SACENC_STATICGAIN_H +- +-/* Includes ******************************************************************/ +-#include "common_fix.h" +-#include "sacenc_lib.h" +-#include "sacenc_const.h" +-#include "sacenc_bitstream.h" +- +-/* Defines *******************************************************************/ +-#define FIXP_GAIN FIXP_DBL +-#define MAXVAL_GAIN ((FIXP_DBL)MAXVAL_DBL) +- +-/* Data Types ****************************************************************/ +-struct STATIC_GAIN_CONFIG { +- MP4SPACEENC_MODE encMode; +- MP4SPACEENC_DMX_GAIN fixedGainDMX; +- INT preGainFactorDb; +-}; +- +-typedef struct STATIC_GAIN_CONFIG *HANDLE_STATIC_GAIN_CONFIG; +-typedef struct STATIC_GAIN *HANDLE_STATIC_GAIN; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Initializes Static Gain Computation Config */ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_OpenConfig( +- HANDLE_STATIC_GAIN_CONFIG *phStaticGainConfig); +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_InitDefaultConfig( +- HANDLE_STATIC_GAIN_CONFIG hStaticGainConfig); +- +-/* Deletes Static Gain Computation Config ~Destructor */ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_CloseConfig( +- HANDLE_STATIC_GAIN_CONFIG *phStaticGainConfig); +- +-/* Initializes Static Gain Computation ~Constructor */ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Open(HANDLE_STATIC_GAIN *phStaticGain); +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Init( +- HANDLE_STATIC_GAIN hStaticGain, +- const HANDLE_STATIC_GAIN_CONFIG hStaticGainConfig, INT *const scale); +- +-/* Deletes Static Gain Computation Infrastucture ~Destructor */ +-FDK_SACENC_ERROR fdk_sacenc_staticGain_Close(HANDLE_STATIC_GAIN *phStaticGain); +- +-/* Apply PostGain to the output PCM Downmix-Signal */ +-FDK_SACENC_ERROR fdk_sacenc_staticPostGain_ApplyFDK( +- const HANDLE_STATIC_GAIN hStaticGain, INT_PCM *const pOutputSamples, +- const INT nOutputSamples, const INT scale); +- +-/* Get Pointer to PreGain-vector */ +-FIXP_GAIN *fdk_sacenc_getPreGainPtrFDK(HANDLE_STATIC_GAIN hStaticGain); +- +-/* Get Pointer to PostGain-coef */ +-FIXP_GAIN fdk_sacenc_getPostGainFDK(HANDLE_STATIC_GAIN hStaticGain); +- +-FIXEDGAINDMXCONFIG fdk_sacenc_staticGain_GetDmxGain( +- const HANDLE_STATIC_GAIN hStaticGain); +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_SetDmxGain( +- HANDLE_STATIC_GAIN_CONFIG hStaticGainCfg, +- const MP4SPACEENC_DMX_GAIN dmxGain); +- +-FDK_SACENC_ERROR fdk_sacenc_staticGain_SetEncMode( +- HANDLE_STATIC_GAIN_CONFIG hStaticGainCfg, const MP4SPACEENC_MODE encMode); +- +-#endif /* SACENC_STATICGAIN_H */ +diff --git a/libSACenc/src/sacenc_tree.cpp b/libSACenc/src/sacenc_tree.cpp +deleted file mode 100644 +index c7d3128..0000000 +--- a/libSACenc/src/sacenc_tree.cpp ++++ /dev/null +@@ -1,488 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Tree Structure for Space Encoder +- +-*******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_tree.h" +-#include "genericStds.h" +-#include "sacenc_const.h" +-#include "sacenc_paramextract.h" +-#include "sacenc_framewindowing.h" +-#include "FDK_matrixCalloc.h" +- +-/* Defines *******************************************************************/ +-enum { BOX_0 = 0, BOX_1 = 1 }; +- +-enum { CH_L = 0, CH_R = 1 }; +- +-enum { TTO_CH_0 = 0, TTO_CH_1 = 1 }; +- +-enum { WIN_INACTIV = 0, WIN_ACTIV = 1 }; +- +-enum { MAX_KEEP_FRAMECOUNT = 100 }; +- +-/* Data Types ****************************************************************/ +-struct SPACE_TREE { +- SPACETREE_MODE mode; +- SPACE_TREE_DESCRIPTION descr; +- HANDLE_TTO_BOX ttoBox[SACENC_MAX_NUM_BOXES]; +- UCHAR nParamBands; +- UCHAR bUseCoarseQuantTtoIcc; +- UCHAR bUseCoarseQuantTtoCld; +- QUANTMODE quantMode; +- INT frameCount; +- UCHAR bFrameKeep; +- +- /* Intermediate buffers */ +- UCHAR pCld_prev[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAM_BANDS]; +- UCHAR pIcc_prev[SACENC_MAX_NUM_BOXES][MAX_NUM_PARAM_BANDS]; +- +- UCHAR nChannelsInMax; +- UCHAR nHybridBandsMax; +-}; +- +-typedef struct { +- UCHAR boxId; +- UCHAR inCh1; +- UCHAR inCh2; +- UCHAR inCh3; +- UCHAR inCh4; +- UCHAR wCh1; +- UCHAR wCh2; +- +-} TTO_DESCRIPTOR; +- +-typedef struct { +- SPACETREE_MODE mode; +- SPACE_TREE_DESCRIPTION treeDescription; +- +-} TREE_CONFIG; +- +-typedef struct { +- SPACETREE_MODE mode; +- UCHAR nChannelsIn; +- UCHAR nChannelsOut; +- UCHAR nTtoBoxes; +- TTO_DESCRIPTOR tto_descriptor[1]; +- +-} TREE_SETUP; +- +-/* Constants *****************************************************************/ +-static const TREE_CONFIG treeConfigTable[] = { +- {SPACETREE_INVALID_MODE, {0, 0, 0}}, {SPACETREE_212, {1, 1, 2}}}; +- +-static const TREE_SETUP treeSetupTable[] = { +- {SPACETREE_INVALID_MODE, 0, 0, 0, {{0, 0, 0, 0, 0, 0, 0}}}, +- {SPACETREE_212, +- 2, +- 1, +- 1, +- {{BOX_0, CH_L, CH_R, TTO_CH_0, TTO_CH_1, WIN_ACTIV, WIN_ACTIV}}}}; +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +-static FDK_SACENC_ERROR getTreeConfig( +- const SPACETREE_MODE mode, SPACE_TREE_DESCRIPTION *pTreeDescription) { +- FDK_SACENC_ERROR error = SACENC_INIT_ERROR; +- +- if (pTreeDescription == NULL) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int i; +- for (i = 0; i < (int)(sizeof(treeConfigTable) / sizeof(TREE_CONFIG)); i++) { +- if (treeConfigTable[i].mode == mode) { +- *pTreeDescription = treeConfigTable[i].treeDescription; +- error = SACENC_OK; +- break; +- } +- } +- } /* valid handle */ +- return error; +-} +- +-static const TREE_SETUP *getTreeSetup(const SPACETREE_MODE mode) { +- int i; +- const TREE_SETUP *setup = NULL; +- +- for (i = 0; i < (int)(sizeof(treeSetupTable) / sizeof(TREE_SETUP)); i++) { +- if (treeSetupTable[i].mode == mode) { +- setup = &treeSetupTable[i]; +- break; +- } +- } +- return setup; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Open(HANDLE_SPACE_TREE *phSpaceTree) { +- FDK_SACENC_ERROR error = SACENC_OK; +- HANDLE_SPACE_TREE hSpaceTree = NULL; +- +- if (NULL == phSpaceTree) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int box; +- +- FDK_ALLOCATE_MEMORY_1D(hSpaceTree, 1, struct SPACE_TREE); +- +- for (box = 0; box < SACENC_MAX_NUM_BOXES; box++) { +- HANDLE_TTO_BOX ttoBox = NULL; +- if (SACENC_OK != (error = fdk_sacenc_createTtoBox(&ttoBox))) { +- goto bail; +- } +- if (NULL != hSpaceTree) { +- hSpaceTree->ttoBox[box] = ttoBox; +- } +- } +- *phSpaceTree = hSpaceTree; +- } +- return error; +- +-bail: +- fdk_sacenc_spaceTree_Close(&hSpaceTree); +- return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); +-} +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Init( +- HANDLE_SPACE_TREE hST, const SPACE_TREE_SETUP *const hSetup, +- UCHAR *pParameterBand2HybridBandOffset, const INT bFrameKeep) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hST == NULL) || (hSetup == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int bTtoBoxFrontBackCombin[SACENC_MAX_NUM_BOXES] = {0}; +- int box = 0; +- +- hST->frameCount = 0; +- hST->bFrameKeep = bFrameKeep; +- +- /* Init */ +- hST->mode = hSetup->mode; +- hST->nParamBands = hSetup->nParamBands; +- hST->bUseCoarseQuantTtoIcc = hSetup->bUseCoarseQuantTtoIcc; +- hST->bUseCoarseQuantTtoCld = hSetup->bUseCoarseQuantTtoCld; +- hST->quantMode = hSetup->quantMode; +- hST->nChannelsInMax = hSetup->nChannelsInMax; +- hST->nHybridBandsMax = hSetup->nHybridBandsMax; +- +- if (SACENC_OK != (error = getTreeConfig(hST->mode, &hST->descr))) { +- goto bail; +- } +- +- switch (hST->mode) { +- case SPACETREE_212: +- bTtoBoxFrontBackCombin[BOX_0] = 0; +- break; +- case SPACETREE_INVALID_MODE: +- default: +- error = SACENC_INIT_ERROR; +- goto bail; +- } /* switch (hST->mode) */ +- +- if (hST->descr.nOttBoxes > SACENC_MAX_NUM_BOXES) { +- error = SACENC_INIT_ERROR; +- goto bail; +- } +- +- for (box = 0; box < hST->descr.nOttBoxes; box++) { +- TTO_BOX_CONFIG boxConfig; +- boxConfig.subbandConfig = (BOX_SUBBAND_CONFIG)hST->nParamBands; +- boxConfig.bUseCoarseQuantCld = hST->bUseCoarseQuantTtoCld; +- boxConfig.bUseCoarseQuantIcc = hST->bUseCoarseQuantTtoIcc; +- boxConfig.bUseCoherenceIccOnly = bTtoBoxFrontBackCombin[box]; +- boxConfig.boxQuantMode = (BOX_QUANTMODE)hST->quantMode; +- boxConfig.nHybridBandsMax = hST->nHybridBandsMax; +- boxConfig.bFrameKeep = hST->bFrameKeep; +- +- if (SACENC_OK != +- (error = fdk_sacenc_initTtoBox(hST->ttoBox[box], &boxConfig, +- pParameterBand2HybridBandOffset))) { +- goto bail; +- } +- } /* for box */ +- +- } /* valid handle */ +- +-bail: +- return error; +-} +- +-static void SpaceTree_FrameKeep212(const HANDLE_SPACE_TREE hST, +- SPATIALFRAME *const hSTOut, +- const INT avoid_keep) { +- int pb; +- +- if (avoid_keep == 0) { +- if (hST->frameCount % 2 == 0) { +- for (pb = 0; pb < hST->nParamBands; pb++) { +- hST->pIcc_prev[BOX_0][pb] = hSTOut->ottData.icc[BOX_0][0][pb]; +- hSTOut->ottData.cld[BOX_0][0][pb] = hST->pCld_prev[BOX_0][pb]; +- } +- } else { +- for (pb = 0; pb < hST->nParamBands; pb++) { +- hSTOut->ottData.icc[BOX_0][0][pb] = hST->pIcc_prev[BOX_0][pb]; +- hST->pCld_prev[BOX_0][pb] = hSTOut->ottData.cld[BOX_0][0][pb]; +- } +- } +- } else { +- for (pb = 0; pb < hST->nParamBands; pb++) { +- hST->pIcc_prev[BOX_0][pb] = hSTOut->ottData.icc[BOX_0][0][pb]; +- hST->pCld_prev[BOX_0][pb] = hSTOut->ottData.cld[BOX_0][0][pb]; +- } +- } +- hST->frameCount++; +- if (hST->frameCount == MAX_KEEP_FRAMECOUNT) { +- hST->frameCount = 0; +- } +-} +- +-static FDK_SACENC_ERROR SpaceTree_FrameKeep(const HANDLE_SPACE_TREE hST, +- SPATIALFRAME *const hSTOut, +- const INT avoid_keep) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- switch (hST->mode) { +- case SPACETREE_212: +- SpaceTree_FrameKeep212(hST, hSTOut, avoid_keep); +- break; +- case SPACETREE_INVALID_MODE: +- default: +- error = SACENC_INVALID_CONFIG; +- break; +- } +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Apply( +- HANDLE_SPACE_TREE hST, const INT paramSet, const INT nChannelsIn, +- const INT nTimeSlots, const INT startTimeSlot, const INT nHybridBands, +- FIXP_WIN *pFrameWindowAna__FDK, +- FIXP_DPK *const *const *const pppHybrid__FDK, +- FIXP_DPK *const *const *const pppHybridIn__FDK, SPATIALFRAME *const hSTOut, +- const INT avoid_keep, INT *pEncoderInputChScale) { +- /** \verbatim +- ============================================================================================================================= +- TREE_212 +- ============================================================================================================================= +- _______ +- L -- TTO_CH_0 --| | +- | TTO_0 |-- TTO_CH_0 +- R -- TTO_CH_1 --|_______| +- +- \endverbatim */ +- +- FDK_SACENC_ERROR error = SACENC_OK; +- int k; +- const TREE_SETUP *treeSetup = NULL; +- +- if ((hST == NULL) || (hSTOut == NULL) || (pppHybrid__FDK == NULL) || +- (pppHybridIn__FDK == NULL)) { +- error = SACENC_INVALID_HANDLE; +- goto bail; +- } +- +- if ((treeSetup = getTreeSetup(hST->mode)) == NULL) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* Sanity Checks */ +- if ((nChannelsIn != treeSetup->nChannelsIn) || +- (nChannelsIn > hST->nChannelsInMax) || +- (nHybridBands > hST->nHybridBandsMax)) { +- error = SACENC_INVALID_CONFIG; +- goto bail; +- } +- +- /* Apply all TTO boxes. */ +- for (k = 0; k < treeSetup->nTtoBoxes; k++) { +- const TTO_DESCRIPTOR *pTTO = &treeSetup->tto_descriptor[k]; +- +- int i, inCh[2], outCh[2], win[2]; +- +- inCh[0] = pTTO->inCh1; +- outCh[0] = pTTO->inCh3; +- win[0] = pTTO->wCh1; +- inCh[1] = pTTO->inCh2; +- outCh[1] = pTTO->inCh4; +- win[1] = pTTO->wCh2; +- +- for (i = 0; i < 2; i++) { +- if (win[i] == WIN_ACTIV) { +- fdk_sacenc_analysisWindowing( +- nTimeSlots, startTimeSlot, pFrameWindowAna__FDK, +- pppHybrid__FDK[inCh[i]], pppHybridIn__FDK[outCh[i]], nHybridBands, +- FW_LEAVE_DIM); +- } +- } +- +- /* Calculate output downmix within last TTO box, if no TTT box is applied. +- */ +- if (SACENC_OK != +- (error = fdk_sacenc_applyTtoBox( +- hST->ttoBox[pTTO->boxId], nTimeSlots, startTimeSlot, nHybridBands, +- pppHybridIn__FDK[pTTO->inCh3], pppHybridIn__FDK[pTTO->inCh4], +- hSTOut->ottData.icc[pTTO->boxId][paramSet], +- &(hSTOut->ICCLosslessData.bsQuantCoarseXXX[pTTO->boxId][paramSet]), +- hSTOut->ottData.cld[pTTO->boxId][paramSet], +- &(hSTOut->CLDLosslessData.bsQuantCoarseXXX[pTTO->boxId][paramSet]), +- hSTOut->bUseBBCues, &pEncoderInputChScale[inCh[0]], +- &pEncoderInputChScale[inCh[1]]))) { +- goto bail; +- } +- } +- +- if (hST->bFrameKeep == 1) { +- if (SACENC_OK != (error = SpaceTree_FrameKeep(hST, hSTOut, avoid_keep))) { +- goto bail; +- } +- } +- +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Close(HANDLE_SPACE_TREE *phSpaceTree) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((phSpaceTree == NULL) || (*phSpaceTree == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- int box; +- HANDLE_SPACE_TREE const hST = *phSpaceTree; +- +- /* for (box = 0; box < hST->descr.nOttBoxes; ++box) { */ +- for (box = 0; box < SACENC_MAX_NUM_BOXES; ++box) { +- if (SACENC_OK != (error = fdk_sacenc_destroyTtoBox(&hST->ttoBox[box]))) { +- goto bail; +- } +- } +- +- FDKfree(*phSpaceTree); +- *phSpaceTree = NULL; +- } +-bail: +- return error; +-} +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_GetDescription( +- const HANDLE_SPACE_TREE hSpaceTree, +- SPACE_TREE_DESCRIPTION *pSpaceTreeDescription) { +- FDK_SACENC_ERROR error = SACENC_OK; +- +- if ((hSpaceTree == NULL) || (pSpaceTreeDescription == NULL)) { +- error = SACENC_INVALID_HANDLE; +- } else { +- *pSpaceTreeDescription = hSpaceTree->descr; +- } +- return error; +-} +- +-INT fdk_sacenc_spaceTree_Hybrid2ParamBand(const INT nParamBands, +- const INT nHybridBand) { +- return fdk_sacenc_subband2ParamBand((BOX_SUBBAND_CONFIG)nParamBands, +- nHybridBand); +-} +- +-/***************************************************************************** +-******************************************************************************/ +diff --git a/libSACenc/src/sacenc_tree.h b/libSACenc/src/sacenc_tree.h +deleted file mode 100644 +index 09f5b2b..0000000 +--- a/libSACenc/src/sacenc_tree.h ++++ /dev/null +@@ -1,168 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Max Neuendorf +- +- Description: Encoder Library Interface +- Tree Structure for Space Encoder +- +-*******************************************************************************/ +- +-#ifndef SACENC_TREE_H +-#define SACENC_TREE_H +- +-/* Includes ******************************************************************/ +-#include "sacenc_framewindowing.h" +-#include "sacenc_lib.h" +-#include "sacenc_bitstream.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +-typedef enum { +- SPACETREE_INVALID_MODE = 0, +- SPACETREE_212 = 8 +- +-} SPACETREE_MODE; +- +-typedef struct SPACE_TREE *HANDLE_SPACE_TREE; +- +-typedef struct { +- UCHAR nParamBands; +- UCHAR bUseCoarseQuantTtoCld; +- UCHAR bUseCoarseQuantTtoIcc; +- QUANTMODE quantMode; +- SPACETREE_MODE mode; +- +- UCHAR nChannelsInMax; +- UCHAR nHybridBandsMax; +- +-} SPACE_TREE_SETUP; +- +-typedef struct { +- UCHAR nOttBoxes; +- UCHAR nInChannels; +- UCHAR nOutChannels; +- +-} SPACE_TREE_DESCRIPTION; +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Open(HANDLE_SPACE_TREE *phSpaceTree); +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Init( +- HANDLE_SPACE_TREE hST, const SPACE_TREE_SETUP *const hSetup, +- UCHAR *pParameterBand2HybridBandOffset, const INT bFrameKeep); +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Apply( +- HANDLE_SPACE_TREE hST, const INT paramSet, const INT nChannelsIn, +- const INT nTimeSlots, const INT startTimeSlot, const INT nHybridBands, +- FIXP_WIN *pFrameWindowAna__FDK, +- FIXP_DPK *const *const *const pppHybrid__FDK, +- FIXP_DPK *const *const *const pppHybridIn__FDK, SPATIALFRAME *const hSTOut, +- const INT avoid_keep, INT *pEncoderInputChScale); +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_Close(HANDLE_SPACE_TREE *phSpaceTree); +- +-FDK_SACENC_ERROR fdk_sacenc_spaceTree_GetDescription( +- const HANDLE_SPACE_TREE hSpaceTree, +- SPACE_TREE_DESCRIPTION *pSpaceTreeDescription); +- +-INT fdk_sacenc_spaceTree_Hybrid2ParamBand(const INT nParamBands, +- const INT nHybridBand); +- +-#endif /* SACENC_TREE_H */ +diff --git a/libSACenc/src/sacenc_vectorfunctions.cpp b/libSACenc/src/sacenc_vectorfunctions.cpp +deleted file mode 100644 +index c1e24b7..0000000 +--- a/libSACenc/src/sacenc_vectorfunctions.cpp ++++ /dev/null +@@ -1,450 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Josef Hoepfl +- +- Description: Encoder Library Interface +- vector functions +- +-*******************************************************************************/ +- +-/***************************************************************************** +-\file +-This file contains vector functions +-******************************************************************************/ +- +-/* Includes ******************************************************************/ +-#include "sacenc_vectorfunctions.h" +- +-/* Defines *******************************************************************/ +- +-/* Data Types ****************************************************************/ +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/* Function / Class Definition ***********************************************/ +- +-FIXP_DBL sumUpCplxPow2(const FIXP_DPK *const x, const INT scaleMode, +- const INT inScaleFactor, INT *const outScaleFactor, +- const INT n) { +- int i, cs; +- +- if (scaleMode == SUM_UP_DYNAMIC_SCALE) { +- /* calculate headroom */ +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- for (i = 0; i < n; i++) { +- maxVal |= fAbs(x[i].v.re); +- maxVal |= fAbs(x[i].v.im); +- } +- cs = inScaleFactor - fixMax(0, CntLeadingZeros(maxVal) - 1); +- } else { +- cs = inScaleFactor; +- } +- +- /* consider scaling of energy and scaling in fPow2Div2 and addition */ +- *outScaleFactor = 2 * cs + 2; +- +- /* make sure that the scalefactor is in the range of -(DFRACT_BITS-1), ... , +- * (DFRACT_BITS-1) */ +- cs = fixMax(fixMin(cs, DFRACT_BITS - 1), -(DFRACT_BITS - 1)); +- +- /* sum up complex energy samples */ +- FIXP_DBL re, im, sum; +- +- re = im = sum = FL2FXCONST_DBL(0.0); +- if (cs < 0) { +- cs = -cs; +- for (i = 0; i < n; i++) { +- re += fPow2Div2(x[i].v.re << cs); +- im += fPow2Div2(x[i].v.im << cs); +- } +- } else { +- cs = 2 * cs; +- for (i = 0; i < n; i++) { +- re += fPow2Div2(x[i].v.re) >> cs; +- im += fPow2Div2(x[i].v.im) >> cs; +- } +- } +- +- sum = (re >> 1) + (im >> 1); +- +- return (sum); +-} +- +-FIXP_DBL sumUpCplxPow2Dim2(const FIXP_DPK *const *const x, const INT scaleMode, +- const INT inScaleFactor, INT *const outScaleFactor, +- const INT sDim1, const INT nDim1, const INT sDim2, +- const INT nDim2) { +- int i, j, cs; +- +- if (scaleMode == SUM_UP_DYNAMIC_SCALE) { +- /* calculate headroom */ +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- maxVal |= fAbs(x[i][j].v.re); +- maxVal |= fAbs(x[i][j].v.im); +- } +- } +- cs = inScaleFactor - fixMax(0, CntLeadingZeros(maxVal) - 1); +- } else { +- cs = inScaleFactor; +- } +- +- /* consider scaling of energy and scaling in fPow2Div2 and addition */ +- *outScaleFactor = 2 * cs + 2; +- +- /* make sure that the scalefactor is in the range of -(DFRACT_BITS-1), ... , +- * (DFRACT_BITS-1) */ +- cs = fixMax(fixMin(cs, DFRACT_BITS - 1), -(DFRACT_BITS - 1)); +- +- /* sum up complex energy samples */ +- FIXP_DBL re, im, sum; +- +- re = im = sum = FL2FXCONST_DBL(0.0); +- if (cs < 0) { +- cs = -cs; +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- re += fPow2Div2(x[i][j].v.re << cs); +- im += fPow2Div2(x[i][j].v.im << cs); +- } +- } +- } else { +- cs = 2 * cs; +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- re += fPow2Div2(x[i][j].v.re) >> cs; +- im += fPow2Div2(x[i][j].v.im) >> cs; +- } +- } +- } +- +- sum = (re >> 1) + (im >> 1); +- +- return (sum); +-} +- +-void copyCplxVec(FIXP_DPK *const Z, const FIXP_DPK *const X, const INT n) { +- FDKmemmove(Z, X, sizeof(FIXP_DPK) * n); +-} +- +-void setCplxVec(FIXP_DPK *const Z, const FIXP_DBL a, const INT n) { +- int i; +- +- for (i = 0; i < n; i++) { +- Z[i].v.re = a; +- Z[i].v.im = a; +- } +-} +- +-void cplx_cplxScalarProduct(FIXP_DPK *const Z, const FIXP_DPK *const *const X, +- const FIXP_DPK *const *const Y, const INT scaleX, +- const INT scaleY, INT *const scaleZ, +- const INT sDim1, const INT nDim1, const INT sDim2, +- const INT nDim2) { +- int i, j, sx, sy; +- FIXP_DBL xre, yre, xim, yim, re, im; +- +- /* make sure that the scalefactor is in the range of -(DFRACT_BITS-1), ... , +- * (DFRACT_BITS-1) */ +- sx = fixMax(fixMin(scaleX, DFRACT_BITS - 1), -(DFRACT_BITS - 1)); +- sy = fixMax(fixMin(scaleY, DFRACT_BITS - 1), -(DFRACT_BITS - 1)); +- +- /* consider scaling of energy and scaling in fMultDiv2 and shift of result +- * values */ +- *scaleZ = sx + sy + 2; +- +- re = (FIXP_DBL)0; +- im = (FIXP_DBL)0; +- if ((sx < 0) && (sy < 0)) { +- sx = -sx; +- sy = -sy; +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- xre = X[i][j].v.re << sx; +- xim = X[i][j].v.im << sx; +- yre = Y[i][j].v.re << sy; +- yim = Y[i][j].v.im << sy; +- re += fMultDiv2(xre, yre) + fMultDiv2(xim, yim); +- im += fMultDiv2(xim, yre) - fMultDiv2(xre, yim); +- } +- } +- } else if ((sx >= 0) && (sy >= 0)) { +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- xre = X[i][j].v.re; +- xim = X[i][j].v.im; +- yre = Y[i][j].v.re; +- yim = Y[i][j].v.im; +- re += (fMultDiv2(xre, yre) + fMultDiv2(xim, yim)) >> (sx + sy); +- im += (fMultDiv2(xim, yre) - fMultDiv2(xre, yim)) >> (sx + sy); +- } +- } +- } else if ((sx < 0) && (sy >= 0)) { +- sx = -sx; +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- xre = X[i][j].v.re << sx; +- xim = X[i][j].v.im << sx; +- yre = Y[i][j].v.re; +- yim = Y[i][j].v.im; +- re += (fMultDiv2(xre, yre) + fMultDiv2(xim, yim)) >> sy; +- im += (fMultDiv2(xim, yre) - fMultDiv2(xre, yim)) >> sy; +- } +- } +- } else { +- sy = -sy; +- for (i = sDim1; i < nDim1; i++) { +- for (j = sDim2; j < nDim2; j++) { +- xre = X[i][j].v.re; +- xim = X[i][j].v.im; +- yre = Y[i][j].v.re << sy; +- yim = Y[i][j].v.im << sy; +- re += (fMultDiv2(xre, yre) + fMultDiv2(xim, yim)) >> sx; +- im += (fMultDiv2(xim, yre) - fMultDiv2(xre, yim)) >> sx; +- } +- } +- } +- +- Z->v.re = re >> 1; +- Z->v.im = im >> 1; +-} +- +-void FDKcalcCorrelationVec(FIXP_DBL *const z, const FIXP_DBL *const pr12, +- const FIXP_DBL *const p1, const FIXP_DBL *const p2, +- const INT n) { +- int i, s; +- FIXP_DBL p12, cor; +- +- /* correlation */ +- for (i = 0; i < n; i++) { +- p12 = fMult(p1[i], p2[i]); +- if (p12 > FL2FXCONST_DBL(0.0f)) { +- p12 = invSqrtNorm2(p12, &s); +- cor = fMult(pr12[i], p12); +- z[i] = SATURATE_LEFT_SHIFT(cor, s, DFRACT_BITS); +- } else { +- z[i] = (FIXP_DBL)MAXVAL_DBL; +- } +- } +-} +- +-void calcCoherenceVec(FIXP_DBL *const z, const FIXP_DBL *const p12r, +- const FIXP_DBL *const p12i, const FIXP_DBL *const p1, +- const FIXP_DBL *const p2, const INT scaleP12, +- const INT scaleP, const INT n) { +- int i, s, s1, s2; +- FIXP_DBL coh, p12, p12ri; +- +- for (i = 0; i < n; i++) { +- s2 = fixMin(fixMax(0, CountLeadingBits(p12r[i]) - 1), +- fixMax(0, CountLeadingBits(p12i[i]) - 1)); +- p12ri = sqrtFixp(fPow2Div2(p12r[i] << s2) + fPow2Div2(p12i[i] << s2)); +- s1 = fixMin(fixMax(0, CountLeadingBits(p1[i]) - 1), +- fixMax(0, CountLeadingBits(p2[i]) - 1)); +- p12 = fMultDiv2(p1[i] << s1, p2[i] << s1); +- +- if (p12 > FL2FXCONST_DBL(0.0f)) { +- p12 = invSqrtNorm2(p12, &s); +- coh = fMult(p12ri, p12); +- s = fixMax(fixMin((scaleP12 - scaleP + s + s1 - s2), DFRACT_BITS - 1), +- -(DFRACT_BITS - 1)); +- if (s < 0) { +- z[i] = coh >> (-s); +- } else { +- z[i] = SATURATE_LEFT_SHIFT(coh, s, DFRACT_BITS); +- } +- } else { +- z[i] = (FIXP_DBL)MAXVAL_DBL; +- } +- } +-} +- +-void addWeightedCplxVec(FIXP_DPK *const *const Z, const FIXP_DBL *const a, +- const FIXP_DPK *const *const X, const FIXP_DBL *const b, +- const FIXP_DPK *const *const Y, const INT scale, +- INT *const scaleCh1, const INT scaleCh2, +- const UCHAR *const pParameterBand2HybridBandOffset, +- const INT nParameterBands, const INT nTimeSlots, +- const INT startTimeSlot) { +- int pb, j, i; +- int cs, s1, s2; +- +- /* determine maximum scale of both channels */ +- cs = fixMax(*scaleCh1, scaleCh2); +- s1 = cs - (*scaleCh1); +- s2 = cs - scaleCh2; +- +- /* scalefactor 1 is updated with common scale of channel 1 and channel2 */ +- *scaleCh1 = cs; +- +- /* scale of a and b; additional scale for fMultDiv2() */ +- for (j = 0, pb = 0; pb < nParameterBands; pb++) { +- FIXP_DBL aPb, bPb; +- aPb = a[pb], bPb = b[pb]; +- for (; j < pParameterBand2HybridBandOffset[pb]; j++) { +- for (i = startTimeSlot; i < nTimeSlots; i++) { +- Z[j][i].v.re = ((fMultDiv2(aPb, X[j][i].v.re) >> s1) + +- (fMultDiv2(bPb, Y[j][i].v.re) >> s2)) +- << (scale + 1); +- Z[j][i].v.im = ((fMultDiv2(aPb, X[j][i].v.im) >> s1) + +- (fMultDiv2(bPb, Y[j][i].v.im) >> s2)) +- << (scale + 1); +- } +- } +- } +-} +- +-void FDKcalcPbScaleFactor(const FIXP_DPK *const *const x, +- const UCHAR *const pParameterBand2HybridBandOffset, +- INT *const outScaleFactor, const INT startTimeSlot, +- const INT nTimeSlots, const INT nParamBands) { +- int i, j, pb; +- +- /* calculate headroom */ +- for (j = 0, pb = 0; pb < nParamBands; pb++) { +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- for (; j < pParameterBand2HybridBandOffset[pb]; j++) { +- for (i = startTimeSlot; i < nTimeSlots; i++) { +- maxVal |= fAbs(x[i][j].v.re); +- maxVal |= fAbs(x[i][j].v.im); +- } +- } +- outScaleFactor[pb] = -fixMax(0, CntLeadingZeros(maxVal) - 1); +- } +-} +- +-INT FDKcalcScaleFactor(const FIXP_DBL *const x, const FIXP_DBL *const y, +- const INT n) { +- int i; +- +- /* calculate headroom */ +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- if (x != NULL) { +- for (i = 0; i < n; i++) { +- maxVal |= fAbs(x[i]); +- } +- } +- +- if (y != NULL) { +- for (i = 0; i < n; i++) { +- maxVal |= fAbs(y[i]); +- } +- } +- +- if (maxVal == (FIXP_DBL)0) +- return (-(DFRACT_BITS - 1)); +- else +- return (-CountLeadingBits(maxVal)); +-} +- +-INT FDKcalcScaleFactorDPK(const FIXP_DPK *RESTRICT x, const INT startBand, +- const INT bands) { +- INT qs, clz; +- FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +- +- for (qs = startBand; qs < bands; qs++) { +- maxVal |= fAbs(x[qs].v.re); +- maxVal |= fAbs(x[qs].v.im); +- } +- +- clz = -fixMax(0, CntLeadingZeros(maxVal) - 1); +- +- return (clz); +-} +diff --git a/libSACenc/src/sacenc_vectorfunctions.h b/libSACenc/src/sacenc_vectorfunctions.h +deleted file mode 100644 +index e9c4abd..0000000 +--- a/libSACenc/src/sacenc_vectorfunctions.h ++++ /dev/null +@@ -1,488 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/*********************** MPEG surround encoder library ************************* +- +- Author(s): Josef Hoepfl +- +- Description: Encoder Library Interface +- vector functions +- +-*******************************************************************************/ +- +-/***************************************************************************** +-\file +-This file contains vector functions +-******************************************************************************/ +- +-#ifndef SACENC_VECTORFUNCTIONS_H +-#define SACENC_VECTORFUNCTIONS_H +- +-/* Includes ******************************************************************/ +-#include "common_fix.h" +- +-/* Defines *******************************************************************/ +-#define SUM_UP_STATIC_SCALE 0 +-#define SUM_UP_DYNAMIC_SCALE 1 +- +-/* Data Types ****************************************************************/ +- +-/* Constants *****************************************************************/ +- +-/* Function / Class Declarations *********************************************/ +- +-/** +- * \brief Vector function : Sum up complex power +- * +- * Description : ret = sum( re{X[i]} * re{X[i]} + im{X[i]} * +- * im{X[i]} ), i=0,...,n-1 ret is scaled by outScaleFactor +- * +- * \param const FIXP_DPK x[] +- * Input: complex vector of the length n +- * +- * \param int scaleMode +- * Input: choose static or dynamic scaling +- * (SUM_UP_DYNAMIC_SCALE/SUM_UP_STATIC_SCALE) +- * +- * \param int inScaleFactor +- * Input: determine headroom bits for the complex input vector +- * +- * \param int outScaleFactor +- * Output: complete scaling in energy calculation +- * +- * \return FIXP_DBL ret +- */ +-FIXP_DBL sumUpCplxPow2(const FIXP_DPK *const x, const INT scaleMode, +- const INT inScaleFactor, INT *const outScaleFactor, +- const INT n); +- +-/** +- * \brief Vector function : Sum up complex power +- * +- * Description : ret = sum( re{X[i][j]} * re{X[i][]} + +- * im{X[i][]} * im{X[i][]} ), i=sDim1,...,nDim1-1 i=sDim2,...,nDim2-1 ret is +- * scaled by outScaleFactor +- * +- * \param const FIXP_DPK x[] +- * Input: complex vector of the length n +- * +- * \param int scaleMode +- * Input: choose static or dynamic scaling +- * (SUM_UP_DYNAMIC_SCALE/SUM_UP_STATIC_SCALE) +- * +- * \param int inScaleFactor +- * Input: determine headroom bits for the complex input vector +- * +- * \param int outScaleFactor +- * Output: complete scaling in energy calculation +- * +- * \param int sDim1 +- * Input: start index for loop counter in dimension 1 +- * +- * \param int nDim1 +- * Input: loop counter in dimension 1 +- * +- * \param int sDim2 +- * Input: start index for loop counter in dimension 2 +- * +- * \param int nDim2 +- * Input: loop counter in dimension 2 +- * +- * \return FIXP_DBL ret +- */ +-FIXP_DBL sumUpCplxPow2Dim2(const FIXP_DPK *const *const x, const INT scaleMode, +- const INT inScaleFactor, INT *const outScaleFactor, +- const INT sDim1, const INT nDim1, const INT sDim2, +- const INT nDim2); +- +-/** +- * \brief Vector function : Z[i] = X[i], i=0,...,n-1 +- * +- * Description : re{Z[i]} = re{X[i]}, i=0,...,n-1 +- * im{Z[i]} = im{X[i]}, i=0,...,n-1 +- * +- * Copy complex vector X[] to complex vector Z[]. +- * It is allowed to overlay X[] with Z[]. +- * +- * \param FIXP_DPK Z[] +- * Output: vector of the length n +- * +- * \param const FIXP_DPK X[] +- * Input: vector of the length n +- * +- * \param int n +- * Input: length of vector Z[] and X[] +- * +- * \return void +- */ +-void copyCplxVec(FIXP_DPK *const Z, const FIXP_DPK *const X, const INT n); +- +-/** +- * \brief Vector function : Z[i] = a, i=0,...,n-1 +- * +- * Description : re{Z[i]} = a, i=0,...,n-1 +- * im{Z[i]} = a, i=0,...,n-1 +- * +- * Set real and imaginary part of the complex value Z to a. +- * +- * \param FIPX_DPK Z[] +- * Output: vector of the length n +- * +- * \param const FIXP_DBL a +- * Input: constant value +- * +- * \param int n +- * Input: length of vector Z[] +- * +- * \return void +- */ +-void setCplxVec(FIXP_DPK *const Z, const FIXP_DBL a, const INT n); +- +-/** +- * \brief Vector function : Calculate complex-valued result of complex +- * scalar product +- * +- * Description : re{Z} = sum( re{X[i]} * re{Y[i]} + im{X[i]} * +- * im{Y[i]}, i=0,...,n-1 ) im{Z} = sum( im{X[i]} * re{Y[i]} - re{X[i]} * +- * im{Y[i]}, i=0,...,n-1 ) +- * +- * The function returns the complex-valued result of the complex +- * scalar product at the address of Z. The result is scaled by scaleZ. +- * +- * \param FIXP_DPK *Z +- * Output: pointer to Z +- * +- * \param const FIXP_DPK *const *const X +- * Input: vector of the length n +- * +- * \param const FIXP_DPK *const *const Y +- * Input: vector of the length n +- * +- * \param int scaleX +- * Input: scalefactor of vector X[] +- * +- * \param int scaleY +- * Input: scalefactor of vector Y[] +- * +- * \param int scaleZ +- * Output: scalefactor of vector Z[] +- * +- * \param int sDim1 +- * Input: start index for loop counter in dimension 1 +- * +- * \param int nDim1 +- * Input: loop counter in dimension 1 +- * +- * \param int sDim2 +- * Input: start index for loop counter in dimension 2 +- * +- * \param int nDim2 +- * Input: loop counter in dimension 2 +- * +- * \return void +- */ +-void cplx_cplxScalarProduct(FIXP_DPK *const Z, const FIXP_DPK *const *const X, +- const FIXP_DPK *const *const Y, const INT scaleX, +- const INT scaleY, INT *const scaleZ, +- const INT sDim1, const INT nDim1, const INT sDim2, +- const INT nDim2); +- +-/** +- * \brief Vector function : Calculate correlation +- * +- * Description : z[i] = pr12[i] / sqrt(p1[i]*p2[i]) , +- * i=0,...,n-1 +- * +- * \param FIXP_DBL z[] +- * Output: vector of length n +- * +- * \param const FIXP_DBL pr12[] +- * Input: vector of the length n +- * +- * \param const FIXP_DBL p1[] +- * Input: vector of the length n +- * +- * \param const FIXP_DBL p2[] +- * Input: vector of the length n +- * +- * \param int n +- * Input: length of vector pr12[], p1[] and p2[] +- * +- * \return void +- */ +-void FDKcalcCorrelationVec(FIXP_DBL *const z, const FIXP_DBL *const pr12, +- const FIXP_DBL *const p1, const FIXP_DBL *const p2, +- const INT n); +- +-/** +- * \brief Vector function : Calculate coherence +- * +- * Description : z[i] = sqrt( (p12r[i]*p12r[i] + +- * p12i[i]*p12i[i]) / (p1[i]*p2[i]) ), i=0,...,n-1 +- * +- * \param FIXP_DBL z[] +- * Output: vector of length n +- * +- * \param const FIXP_DBL p12r[] +- * Input: vector of the length n +- * +- * \param const FIXP_DBL p12i[] +- * Input: vector of the length n +- * +- * \param const FIXP_DBL p1[] +- * Input: vector of the length n +- * +- * \param const FIXP_DBL p2[] +- * Input: vector of the length n +- * +- * \param int scaleP12[] +- * Input: scalefactor of p12r and p12i +- * +- * \param int scaleP +- * Input: scalefactor of p1 and p2 +- * +- * \param int n +- * Input: length of vector p12r[], p12i[], p1[] and p2[] +- * +- * \return void +- */ +-void calcCoherenceVec(FIXP_DBL *const z, const FIXP_DBL *const p12r, +- const FIXP_DBL *const p12i, const FIXP_DBL *const p1, +- const FIXP_DBL *const p2, const INT scaleP12, +- const INT scaleP, const INT n); +- +-/** +- * \brief Vector function : Z[j][i] = a[pb] * X[j][i] + b[pb] * +- * Y[j][i], j=0,...,nHybridBands-1; i=startTimeSlot,...,nTimeSlots-1; +- * pb=0,...,nParameterBands-1 +- * +- * Description : re{Z[j][i]} = a[pb] * re{X[j][i]} + b[pb] * +- * re{Y[j][i]}, j=0,...,nHybridBands-1; i=startTimeSlot,...,nTimeSlots-1; +- * pb=0,...,nParameterBands-1 im{Z[j][i]} = a[pb] * im{X[j][i]} + b[pb] * +- * im{Y[j][i]}, j=0,...,nHybridBands-1; +- * i=startTimeSlot,...,nTimeSlots-1; pb=0,...,nParameterBands-1 +- * +- * It is allowed to overlay X[] or Y[] with Z[]. The scalefactor +- * of channel 1 is updated with the common scalefactor of channel 1 and +- * channel 2. +- * +- * \param FIXP_DPK **Z +- * Output: vector of the length nHybridBands*nTimeSlots +- * +- * \param const FIXP_DBL *a +- * Input: vector of length nParameterBands +- * +- * \param const FIXP_DPK **X +- * Input: vector of the length nHybridBands*nTimeSlots +- * +- * \param const FIXP_DBL *b +- * Input: vector of length nParameterBands +- * +- * \param const FIXP_DPK **Y +- * Input: vector of the length nHybridBands*nTimeSlots +- * +- * \param int scale +- * Input: scale of vector a and b +- * +- * \param int *scaleCh1 +- * Input: scale of ch1 +- * +- * \param int scaleCh2 +- * Input: scale of ch2 +- * +- * \param UCHAR *pParameterBand2HybridBandOffset +- * Input: vector of length nParameterBands +- * +- * \param int nTimeSlots +- * Input: number of time slots +- * +- * \param int startTimeSlot +- * Input: start time slot +- * +- * \return void +- */ +-void addWeightedCplxVec(FIXP_DPK *const *const Z, const FIXP_DBL *const a, +- const FIXP_DPK *const *const X, const FIXP_DBL *const b, +- const FIXP_DPK *const *const Y, const INT scale, +- INT *const scaleCh1, const INT scaleCh2, +- const UCHAR *const pParameterBand2HybridBandOffset, +- const INT nParameterBands, const INT nTimeSlots, +- const INT startTimeSlot); +- +-/** +- * \brief Vector function : Calculate the headroom of a complex vector +- * in a parameter band grid +- * +- * \param FIXP_DPK **x +- * Input: pointer to complex input vector +- * +- * \param UCHAR *pParameterBand2HybridBandOffset +- * Input: pointer to hybrid band offsets +- * +- * \param int *outScaleFactor +- * Input: pointer to ouput scalefactor +- * +- * \param int startTimeSlot +- * Input: start time slot +- * +- * \param int nTimeSlots +- * Input: number of time slot +- * +- * \param int nParamBands +- * Input: number of parameter bands +- * +- * \return void +- */ +-void FDKcalcPbScaleFactor(const FIXP_DPK *const *const x, +- const UCHAR *const pParameterBand2HybridBandOffset, +- INT *const outScaleFactor, const INT startTimeSlot, +- const INT nTimeSlots, const INT nParamBands); +- +-/** +- * \brief Vector function : Calculate the common headroom of two +- * sparate vectors +- * +- * \param FIXP_DBL *x +- * Input: pointer to first input vector +- * +- * \param FIXP_DBL *y +- * Input: pointer to second input vector +- * +- * \param int n +- * Input: number of samples +- * +- * \return int headromm in bits +- */ +-INT FDKcalcScaleFactor(const FIXP_DBL *const x, const FIXP_DBL *const y, +- const INT n); +- +-/** +- * \brief Vector function : Calculate the headroom of a complex vector +- * +- * \param FIXP_DPK *x +- * Input: pointer to complex input vector +- * +- * \param INT startBand +- * Input: start band +- * +- * \param INT bands +- * Input: number of bands +- * +- * \return int headromm in bits +- */ +-INT FDKcalcScaleFactorDPK(const FIXP_DPK *RESTRICT x, const INT startBand, +- const INT bands); +- +-/* Function / Class Definition ***********************************************/ +-template +-inline void FDKmemcpy_flex(T *const dst, const INT dstStride, +- const T *const src, const INT srcStride, +- const INT nSamples) { +- int i; +- +- for (i = 0; i < nSamples; i++) { +- dst[i * dstStride] = src[i * srcStride]; +- } +-} +- +-template +-inline void FDKmemset_flex(T *const x, const T c, const INT nSamples) { +- int i; +- +- for (i = 0; i < nSamples; i++) { +- x[i] = c; +- } +-} +- +-#endif /* SACENC_VECTORFUNCTIONS_H */ +-- +cgit v1.1 + diff --git a/sound/fdk-aac/patches-free/040-remove-usac.patch b/sound/fdk-aac/patches-free/040-remove-usac.patch new file mode 100644 index 0000000000..44c0132777 --- /dev/null +++ b/sound/fdk-aac/patches-free/040-remove-usac.patch @@ -0,0 +1,9569 @@ +From 0fc0e0e0b89de3becd5f099eae725f13eeecc0d1 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Tue, 25 Jun 2019 11:43:16 +0200 +Subject: Remove USAC + +--- + Makefile.am | 9 +- + Makefile.vc | 9 +- + libAACdec/src/aacdecoder.cpp | 34 +- + libAACdec/src/block.cpp | 163 --- + libAACdec/src/channel.cpp | 70 +- + libAACdec/src/channelinfo.h | 91 -- + libAACdec/src/usacdec_ace_d4t64.cpp | 439 -------- + libAACdec/src/usacdec_ace_d4t64.h | 117 -- + libAACdec/src/usacdec_ace_ltp.cpp | 229 ---- + libAACdec/src/usacdec_ace_ltp.h | 128 --- + libAACdec/src/usacdec_acelp.cpp | 1296 ---------------------- + libAACdec/src/usacdec_acelp.h | 281 ----- + libAACdec/src/usacdec_const.h | 203 ---- + libAACdec/src/usacdec_fac.cpp | 745 ------------- + libAACdec/src/usacdec_fac.h | 191 ---- + libAACdec/src/usacdec_lpc.cpp | 1194 --------------------- + libAACdec/src/usacdec_lpc.h | 190 ---- + libAACdec/src/usacdec_lpd.cpp | 2017 ----------------------------------- + libAACdec/src/usacdec_lpd.h | 198 ---- + libAACdec/src/usacdec_rom.cpp | 1504 -------------------------- + libAACdec/src/usacdec_rom.h | 154 --- + 22 files changed, 6 insertions(+), 9258 deletions(-) + delete mode 100644 libAACdec/src/usacdec_ace_d4t64.cpp + delete mode 100644 libAACdec/src/usacdec_ace_d4t64.h + delete mode 100644 libAACdec/src/usacdec_ace_ltp.cpp + delete mode 100644 libAACdec/src/usacdec_ace_ltp.h + delete mode 100644 libAACdec/src/usacdec_acelp.cpp + delete mode 100644 libAACdec/src/usacdec_acelp.h + delete mode 100644 libAACdec/src/usacdec_const.h + delete mode 100644 libAACdec/src/usacdec_fac.cpp + delete mode 100644 libAACdec/src/usacdec_fac.h + delete mode 100644 libAACdec/src/usacdec_lpc.cpp + delete mode 100644 libAACdec/src/usacdec_lpc.h + delete mode 100644 libAACdec/src/usacdec_lpd.cpp + delete mode 100644 libAACdec/src/usacdec_lpd.h + delete mode 100644 libAACdec/src/usacdec_rom.cpp + delete mode 100644 libAACdec/src/usacdec_rom.h + +diff --git a/Makefile.am b/Makefile.am +index 1550d95..d5fd180 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -57,14 +57,7 @@ AACDEC_SRC = \ + libAACdec/src/channelinfo.cpp \ + libAACdec/src/ldfiltbank.cpp \ + libAACdec/src/pulsedata.cpp \ +- libAACdec/src/stereo.cpp \ +- libAACdec/src/usacdec_ace_d4t64.cpp \ +- libAACdec/src/usacdec_ace_ltp.cpp \ +- libAACdec/src/usacdec_acelp.cpp \ +- libAACdec/src/usacdec_fac.cpp \ +- libAACdec/src/usacdec_lpc.cpp \ +- libAACdec/src/usacdec_lpd.cpp \ +- libAACdec/src/usacdec_rom.cpp ++ libAACdec/src/stereo.cpp + + AACENC_SRC = \ + libAACenc/src/aacEnc_ram.cpp \ +diff --git a/Makefile.vc b/Makefile.vc +index 54f3744..c236c15 100644 +--- a/Makefile.vc ++++ b/Makefile.vc +@@ -41,14 +41,7 @@ AACDEC_SRC = \ + libAACdec/src/channelinfo.cpp \ + libAACdec/src/ldfiltbank.cpp \ + libAACdec/src/pulsedata.cpp \ +- libAACdec/src/stereo.cpp \ +- libAACdec/src/usacdec_ace_d4t64.cpp \ +- libAACdec/src/usacdec_ace_ltp.cpp \ +- libAACdec/src/usacdec_acelp.cpp \ +- libAACdec/src/usacdec_fac.cpp \ +- libAACdec/src/usacdec_lpc.cpp \ +- libAACdec/src/usacdec_lpd.cpp \ +- libAACdec/src/usacdec_rom.cpp ++ libAACdec/src/stereo.cpp + + AACENC_SRC = \ + libAACenc/src/aacEnc_ram.cpp \ +diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp +index cc3e245..cd57500 100644 +--- a/libAACdec/src/aacdecoder.cpp ++++ b/libAACdec/src/aacdecoder.cpp +@@ -161,8 +161,6 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_pns.h" + +-#include "usacdec_lpd.h" +- + #include "ac_arith_coder.h" + + #include "tpdec_lib.h" +@@ -1942,17 +1940,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + goto bail; + } + } +- if (elCh > 0) { +- self->pAacDecoderStaticChannelInfo[ch - elCh]->nfRandomSeed = +- (ULONG)0x3039; +- if (self->elements[el2] == ID_USAC_CPE) { +- if (asc->m_sc.m_usacConfig.element[el2].m_stereoConfigIndex != +- 1) { +- self->pAacDecoderStaticChannelInfo[ch - elCh + 1] +- ->nfRandomSeed = (ULONG)0x10932; +- } +- } +- } + } /* for each element */ + } + +@@ -2010,11 +1997,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc, + self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, + OverlapBufferSize); + +- self->pAacDecoderStaticChannelInfo[ch]->last_core_mode = FD_LONG; +- self->pAacDecoderStaticChannelInfo[ch]->last_lpd_mode = 255; +- +- self->pAacDecoderStaticChannelInfo[ch]->last_tcx_pitch = L_DIV; +- + /* Reset DRC control data for this channel */ + aacDecoder_drcInitChannelData( + &self->pAacDecoderStaticChannelInfo[ch]->drcData); +@@ -2893,10 +2875,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + (self->frameOK && !(flags & AACDEC_CONCEAL)); + const int icsIsInvalid = (GetScaleFactorBandsTransmitted(pIcsInfo) > + GetScaleFactorBandsTotal(pIcsInfo)); +- const int icsInfoUsedinFadeOut = +- !(pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD && +- pAacDecoderStaticChannelInfo->last_lpd_mode == 0); +- if (icsInfoUsedinFadeOut && icsIsInvalid && !mute_release_active) { ++ if (icsIsInvalid && !mute_release_active) { + self->frameOK = 0; + } + } +@@ -2956,16 +2935,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( + 2; + } break; + case AACDEC_RENDER_LPD: +- +- CLpd_RenderTimeSignal( +- pAacDecoderStaticChannelInfo, pAacDecoderChannelInfo, +- pTimeData + offset, self->streamInfo.aacSamplesPerFrame, +- &self->samplingRateInfo[streamIndex], +- (self->frameOK && !(flags & AACDEC_CONCEAL) && +- !frameOk_butConceal), +- flags, self->flags[streamIndex]); +- +- self->extGainDelay = self->streamInfo.aacSamplesPerFrame; ++ ErrorStatus = AAC_DEC_UNKNOWN; + break; + default: + ErrorStatus = AAC_DEC_UNKNOWN; +diff --git a/libAACdec/src/block.cpp b/libAACdec/src/block.cpp +index a394cd7..b8ca877 100644 +--- a/libAACdec/src/block.cpp ++++ b/libAACdec/src/block.cpp +@@ -107,9 +107,6 @@ amm-info@iis.fraunhofer.de + #include "scale.h" + #include "FDK_tools_rom.h" + +-#include "usacdec_fac.h" +-#include "usacdec_lpd.h" +-#include "usacdec_lpc.h" + #include "FDK_trigFcts.h" + + #include "ac_arith_coder.h" +@@ -1010,162 +1007,7 @@ void CBlock_FrequencyToTime( + nSpec = 8; + break; + } +- + { +- int last_frame_lost = pAacDecoderStaticChannelInfo->last_lpc_lost; +- +- if (pAacDecoderStaticChannelInfo->last_core_mode == LPD) { +- INT fac_FB = 1; +- if (elFlags & AC_EL_FULLBANDLPD) { +- fac_FB = 2; +- } +- +- FIXP_DBL *synth; +- +- /* Keep some free space at the beginning of the buffer. To be used for +- * past data */ +- if (!(elFlags & AC_EL_LPDSTEREOIDX)) { +- synth = pWorkBuffer1 + ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB); +- } else { +- synth = pWorkBuffer1 + PIT_MAX_MAX * fac_FB; +- } +- +- int fac_length = +- (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) +- ? (frameLen >> 4) +- : (frameLen >> 3); +- +- INT pitch[NB_SUBFR_SUPERFR + SYN_SFD]; +- FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD]; +- +- int nbDiv = (elFlags & AC_EL_FULLBANDLPD) ? 2 : 4; +- int lFrame = (elFlags & AC_EL_FULLBANDLPD) ? frameLen / 2 : frameLen; +- int nbSubfr = +- lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */ +- int LpdSfd = (nbDiv * nbSubfr) >> 1; +- int SynSfd = LpdSfd - BPF_SFD; +- +- FDKmemclear( +- pitch, +- sizeof( +- pitch)); // added to prevent ferret errors in bass_pf_1sf_delay +- FDKmemclear(pit_gain, sizeof(pit_gain)); +- +- /* FAC case */ +- if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0 || +- pAacDecoderStaticChannelInfo->last_lpd_mode == 4) { +- FIXP_DBL fac_buf[LFAC]; +- FIXP_LPC *A = pAacDecoderChannelInfo->data.usac.lp_coeff[0]; +- +- if (!frameOk || last_frame_lost || +- (pAacDecoderChannelInfo->data.usac.fac_data[0] == NULL)) { +- FDKmemclear(fac_buf, +- pAacDecoderChannelInfo->granuleLength * sizeof(FIXP_DBL)); +- pAacDecoderChannelInfo->data.usac.fac_data[0] = fac_buf; +- pAacDecoderChannelInfo->data.usac.fac_data_e[0] = 0; +- } +- +- INT A_exp; /* linear prediction coefficients exponent */ +- { +- for (int i = 0; i < M_LP_FILTER_ORDER; i++) { +- A[i] = FX_DBL2FX_LPC(fixp_cos( +- fMult(pAacDecoderStaticChannelInfo->lpc4_lsf[i], +- FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)), +- LSF_SCALE - LSPARG_SCALE)); +- } +- +- E_LPC_f_lsp_a_conversion(A, A, &A_exp); +- } +- +-#if defined(FDK_ASSERT_ENABLE) +- nSamples = +-#endif +- CLpd_FAC_Acelp2Mdct( +- &pAacDecoderStaticChannelInfo->IMdct, synth, +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), +- pAacDecoderChannelInfo->specScale, nSpec, +- pAacDecoderChannelInfo->data.usac.fac_data[0], +- pAacDecoderChannelInfo->data.usac.fac_data_e[0], fac_length, +- frameLen, tl, +- FDKgetWindowSlope( +- fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- fr, A, A_exp, &pAacDecoderStaticChannelInfo->acelp, +- (FIXP_DBL)0, /* FAC gain has already been applied. */ +- (last_frame_lost || !frameOk), 1, +- pAacDecoderStaticChannelInfo->last_lpd_mode, 0, +- pAacDecoderChannelInfo->currAliasingSymmetry); +- +- } else { +-#if defined(FDK_ASSERT_ENABLE) +- nSamples = +-#endif +- imlt_block( +- &pAacDecoderStaticChannelInfo->IMdct, synth, +- SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), +- pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl, +- FDKgetWindowSlope( +- fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- fl, +- FDKgetWindowSlope( +- fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- fr, (FIXP_DBL)0, +- pAacDecoderChannelInfo->currAliasingSymmetry +- ? MLT_FLAG_CURR_ALIAS_SYMMETRY +- : 0); +- } +- FDK_ASSERT(nSamples == frameLen); +- +- /* The "if" clause is entered both for fullbandLpd mono and +- * non-fullbandLpd*. The "else"-> just for fullbandLpd stereo*/ +- if (!(elFlags & AC_EL_LPDSTEREOIDX)) { +- FDKmemcpy(pitch, pAacDecoderStaticChannelInfo->old_T_pf, +- SynSfd * sizeof(INT)); +- FDKmemcpy(pit_gain, pAacDecoderStaticChannelInfo->old_gain_pf, +- SynSfd * sizeof(FIXP_DBL)); +- +- for (int i = SynSfd; i < LpdSfd + 3; i++) { +- pitch[i] = L_SUBFR; +- pit_gain[i] = (FIXP_DBL)0; +- } +- +- if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0) { +- pitch[SynSfd] = pitch[SynSfd - 1]; +- pit_gain[SynSfd] = pit_gain[SynSfd - 1]; +- if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) { +- pitch[SynSfd + 1] = pitch[SynSfd]; +- pit_gain[SynSfd + 1] = pit_gain[SynSfd]; +- } +- } +- +- /* Copy old data to the beginning of the buffer */ +- { +- FDKmemcpy( +- pWorkBuffer1, pAacDecoderStaticChannelInfo->old_synth, +- ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB) * sizeof(FIXP_DBL)); +- } +- +- FIXP_DBL *p2_synth = pWorkBuffer1 + (PIT_MAX_MAX * fac_FB); +- +- /* recalculate pitch gain to allow postfilering on FAC area */ +- for (int i = 0; i < SynSfd + 2; i++) { +- int T = pitch[i]; +- FIXP_DBL gain = pit_gain[i]; +- +- if (gain > (FIXP_DBL)0) { +- gain = get_gain(&p2_synth[i * L_SUBFR * fac_FB], +- &p2_synth[(i * L_SUBFR * fac_FB) - fac_FB * T], +- L_SUBFR * fac_FB); +- pit_gain[i] = gain; +- } +- } +- +- bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen, +- (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR, +- frameLen - (LpdSfd + 4) * L_SUBFR, outSamples, +- pAacDecoderStaticChannelInfo->mem_bpf); +- } +- +- } else /* last_core_mode was not LPD */ + { + FIXP_DBL *tmp = + pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->mdctOutTemp; +@@ -1190,11 +1032,6 @@ void CBlock_FrequencyToTime( + } + + FDK_ASSERT(nSamples == frameLen); +- +- pAacDecoderStaticChannelInfo->last_core_mode = +- (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) ? FD_SHORT +- : FD_LONG; +- pAacDecoderStaticChannelInfo->last_lpd_mode = 255; + } + + #include "ldfiltbank.h" +diff --git a/libAACdec/src/channel.cpp b/libAACdec/src/channel.cpp +index e17ccf4..fe63756 100644 +--- a/libAACdec/src/channel.cpp ++++ b/libAACdec/src/channel.cpp +@@ -106,9 +106,6 @@ amm-info@iis.fraunhofer.de + #include "aacdec_tns.h" + #include "FDK_bitstream.h" + +-#include "usacdec_lpd.h" +-#include "usacdec_fac.h" +- + static void MapMidSideMaskToPnsCorrelation( + CAacDecoderChannelInfo *pAacDecoderChannelInfo[2]) { + int group; +@@ -164,13 +161,6 @@ void CChannelElement_Decode( + int maxSfBandsL = 0, maxSfBandsR = 0; + int maybe_jstereo = (el_channels > 1); + +- if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && el_channels == 2) { +- if (pAacDecoderChannelInfo[L]->data.usac.core_mode || +- pAacDecoderChannelInfo[R]->data.usac.core_mode) { +- maybe_jstereo = 0; +- } +- } +- + if (maybe_jstereo) { + maxSfBandsL = + GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo); +@@ -236,9 +226,6 @@ void CChannelElement_Decode( + + for (ch = 0; ch < el_channels; ch++) { + if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) { +- /* Decode LPD data */ +- CLpdChannelStream_Decode(pAacDecoderChannelInfo[ch], +- pAacDecoderStaticChannelInfo[ch], flags); + } else { + UCHAR noSfbs = + GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[ch]->icsInfo); +@@ -651,13 +638,6 @@ AAC_DECODER_ERROR CChannelElement_Read( + break; + case core_mode: + decision_bit = FDKreadBits(hBs, 1); +- pAacDecoderChannelInfo[ch]->data.usac.core_mode = decision_bit; +- if ((ch == 1) && (pAacDecoderChannelInfo[0]->data.usac.core_mode != +- pAacDecoderChannelInfo[1]->data.usac.core_mode)) { +- /* StereoCoreToolInfo(core_mode[ch] ) */ +- pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0; +- pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0; +- } + break; + case tns_active: + pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active = +@@ -671,53 +651,12 @@ AAC_DECODER_ERROR CChannelElement_Read( + } + break; + case lpd_channel_stream: +- +- { +- error = CLpdChannelStream_Read(/* = lpd_channel_stream() */ +- hBs, pAacDecoderChannelInfo[ch], +- pAacDecoderStaticChannelInfo[ch], +- pSamplingRateInfo, flags); +- } +- + pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_LPD; + break; + case fac_data: { + int fFacDatPresent = FDKreadBit(hBs); + +- /* Wee need a valid fac_data[0] even if no FAC data is present (as +- * temporal buffer) */ +- pAacDecoderChannelInfo[ch]->data.usac.fac_data[0] = +- pAacDecoderChannelInfo[ch]->data.usac.fac_data0; +- +- if (fFacDatPresent) { +- if (elFlags & AC_EL_LFE) { +- error = AAC_DEC_PARSE_ERROR; +- break; +- } +- /* FAC data present, this frame is FD, so the last mode had to be +- * ACELP. */ +- if (pAacDecoderStaticChannelInfo[ch]->last_core_mode != LPD || +- pAacDecoderStaticChannelInfo[ch]->last_lpd_mode != 0) { +- pAacDecoderChannelInfo[ch]->data.usac.core_mode_last = LPD; +- pAacDecoderChannelInfo[ch]->data.usac.lpd_mode_last = 0; +- /* We can't change the past! So look to the future and go ahead! */ +- } +- CLpd_FAC_Read(hBs, pAacDecoderChannelInfo[ch]->data.usac.fac_data[0], +- pAacDecoderChannelInfo[ch]->data.usac.fac_data_e, +- CLpd_FAC_getLength( +- IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo), +- pAacDecoderChannelInfo[ch]->granuleLength), +- 1, 0); +- } else { +- if (pAacDecoderStaticChannelInfo[ch]->last_core_mode == LPD && +- pAacDecoderStaticChannelInfo[ch]->last_lpd_mode == 0) { +- /* ACELP to FD transitons without FAC are possible. That is why we +- zero it out (i.e FAC will not be considered in the subsequent +- calculations */ +- FDKmemclear(pAacDecoderChannelInfo[ch]->data.usac.fac_data0, +- LFAC * sizeof(FIXP_DBL)); +- } +- } ++ error = AAC_DEC_PARSE_ERROR; + } break; + case esc2_rvlc: + if (flags & AC_ER_RVLC) { +@@ -887,13 +826,6 @@ AAC_DECODER_ERROR CChannelElement_Read( + if (error != AAC_DEC_OK) { + return error; + } +- +- if (elFlags & AC_EL_USAC_NOISE) { +- CBlock_ApplyNoise(pAacDecoderChannelInfo[ch], pSamplingRateInfo, +- &pAacDecoderStaticChannelInfo[ch]->nfRandomSeed, +- band_is_noise); +- +- } /* if (elFlags & AC_EL_USAC_NOISE) */ + } + } + +diff --git a/libAACdec/src/channelinfo.h b/libAACdec/src/channelinfo.h +index 04f0012..42c8298 100644 +--- a/libAACdec/src/channelinfo.h ++++ b/libAACdec/src/channelinfo.h +@@ -117,10 +117,6 @@ amm-info@iis.fraunhofer.de + + #include "aacdec_pns.h" + +-#include "usacdec_acelp.h" +-#include "usacdec_const.h" +-#include "usacdec_rom.h" +- + #include "ac_arith_coder.h" + + #include "aacdec_drc_types.h" +@@ -202,55 +198,6 @@ typedef struct { + + INT pnsCurrentSeed; + +- /* LPD memory */ +- FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR]; +- INT old_T_pf[SYN_SFD]; +- FIXP_DBL old_gain_pf[SYN_SFD]; +- FIXP_DBL mem_bpf[L_FILT + L_SUBFR]; +- UCHAR +- old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe +- */ +- +- USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous +- frame. (not signalled by the bitstream, see +- CAacDecoderChannelInfo::core_mode_last !! ) +- */ +- UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe +- (not signalled by the bitstream, see +- CAacDecoderChannelInfo::lpd_mode_last !! ) */ +- UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe +- (not signalled by the bitstream) */ +- UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */ +- +- FIXP_LPC +- lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */ +- FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC +- coefficients in LSF domain +- for concealment. */ +- FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP +- domain. lp_coeff_old[0] is lpc4 (coeffs for +- right folding point of last tcx frame), +- lp_coeff_old[1] are coeffs for left folding +- point of last tcx frame */ +- INT lp_coeff_old_exp[2]; +- +- FIXP_SGL +- oldStability; /* LPC coeff stability value from last frame (required for +- TCX concealment). */ +- UINT numLostLpdFrames; /* Number of consecutive lost subframes. */ +- +- /* TCX memory */ +- FIXP_DBL last_tcx_gain; +- INT last_tcx_gain_e; +- FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */ +- SHORT last_tcx_pitch; +- UCHAR last_tcx_noise_factor; +- +- /* ACELP memory */ +- CAcelpStaticMem acelp; +- +- ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */ +- + CDrcChannelData drcData; + + CpePersistentData *pCpeStaticData; +@@ -299,8 +246,6 @@ typedef shouldBeUnion { + * used anymore. */ + FIXP_DBL mdctOutTemp[1024]; + +- FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)]; +- + FIXP_DBL workBuffer[WB_SECTION_SIZE]; + } + CWorkBufferCore1; +@@ -335,42 +280,6 @@ typedef struct { + */ + typedef struct { + shouldBeUnion { +- struct { +- FIXP_DBL fac_data0[LFAC]; +- SCHAR fac_data_e[4]; +- FIXP_DBL +- *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */ +- +- UCHAR core_mode; /* current core mode */ +- USAC_COREMODE +- core_mode_last; /* previous core mode, signalled in the bitstream +- (not done by the decoder, see +- CAacDecoderStaticChannelInfo::last_core_mode !!)*/ +- UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream +- (not done by the decoder, see +- CAacDecoderStaticChannelInfo::last_core_mode !!)*/ +- UCHAR mod[4]; +- UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current +- superframe */ +- +- FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction +- coefficients in LSP domain */ +- FIXP_LPC +- lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in +- LP domain */ +- INT lp_coeff_exp[5]; +- FIXP_LPC lsf_adaptive_mean_cand +- [M_LP_FILTER_ORDER]; /* concealment: is copied to +- CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is +- assumed to be correct*/ +- FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP +- and TCX (concealment) */ +- +- CAcelpChannelData acelp[4]; +- +- FIXP_DBL tcx_gain[4]; +- SCHAR tcx_gain_e[4]; +- } usac; + + struct { + CPnsData PnsData; /* Not required for USAC */ +diff --git a/libAACdec/src/usacdec_ace_d4t64.cpp b/libAACdec/src/usacdec_ace_d4t64.cpp +deleted file mode 100644 +index 43e06cd..0000000 +--- a/libAACdec/src/usacdec_ace_d4t64.cpp ++++ /dev/null +@@ -1,439 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: ACELP +- +-*******************************************************************************/ +- +-#include "usacdec_ace_d4t64.h" +- +-#define L_SUBFR 64 /* Subframe size */ +- +-/* +- * D_ACELP_add_pulse +- * +- * Parameters: +- * pos I: position of pulse +- * nb_pulse I: number of pulses +- * track I: track +- * code O: fixed codebook +- * +- * Function: +- * Add pulses to fixed codebook +- * +- * Returns: +- * void +- */ +-static void D_ACELP_add_pulse(SHORT pos[], SHORT nb_pulse, SHORT track, +- FIXP_COD code[]) { +- SHORT i, k; +- for (k = 0; k < nb_pulse; k++) { +- /* i = ((pos[k] & (16-1))*NB_TRACK) + track; */ +- i = ((pos[k] & (16 - 1)) << 2) + track; +- if ((pos[k] & 16) == 0) { +- code[i] = code[i] + (FIXP_COD)(512 << (COD_BITS - FRACT_BITS)); +- } else { +- code[i] = code[i] - (FIXP_COD)(512 << (COD_BITS - FRACT_BITS)); +- } +- } +- return; +-} +-/* +- * D_ACELP_decode_1p_N1 +- * +- * Parameters: +- * index I: pulse index +- * N I: number of bits for position +- * offset I: offset +- * pos O: position of the pulse +- * +- * Function: +- * Decode 1 pulse with N+1 bits +- * +- * Returns: +- * void +- */ +-static void D_ACELP_decode_1p_N1(LONG index, SHORT N, SHORT offset, +- SHORT pos[]) { +- SHORT pos1; +- LONG i, mask; +- +- mask = ((1 << N) - 1); +- /* +- * Decode 1 pulse with N+1 bits +- */ +- pos1 = (SHORT)((index & mask) + offset); +- i = ((index >> N) & 1); +- if (i == 1) { +- pos1 += 16; +- } +- pos[0] = pos1; +- return; +-} +-/* +- * D_ACELP_decode_2p_2N1 +- * +- * Parameters: +- * index I: pulse index +- * N I: number of bits for position +- * offset I: offset +- * pos O: position of the pulse +- * +- * Function: +- * Decode 2 pulses with 2*N+1 bits +- * +- * Returns: +- * void +- */ +-static void D_ACELP_decode_2p_2N1(LONG index, SHORT N, SHORT offset, +- SHORT pos[]) { +- SHORT pos1, pos2; +- LONG mask, i; +- mask = ((1 << N) - 1); +- /* +- * Decode 2 pulses with 2*N+1 bits +- */ +- pos1 = (SHORT)(((index >> N) & mask) + offset); +- i = (index >> (2 * N)) & 1; +- pos2 = (SHORT)((index & mask) + offset); +- if ((pos2 - pos1) < 0) { +- if (i == 1) { +- pos1 += 16; +- } else { +- pos2 += 16; +- } +- } else { +- if (i == 1) { +- pos1 += 16; +- pos2 += 16; +- } +- } +- pos[0] = pos1; +- pos[1] = pos2; +- return; +-} +-/* +- * D_ACELP_decode_3p_3N1 +- * +- * Parameters: +- * index I: pulse index +- * N I: number of bits for position +- * offset I: offset +- * pos O: position of the pulse +- * +- * Function: +- * Decode 3 pulses with 3*N+1 bits +- * +- * Returns: +- * void +- */ +-static void D_ACELP_decode_3p_3N1(LONG index, SHORT N, SHORT offset, +- SHORT pos[]) { +- SHORT j; +- LONG mask, idx; +- +- /* +- * Decode 3 pulses with 3*N+1 bits +- */ +- mask = ((1 << ((2 * N) - 1)) - 1); +- idx = index & mask; +- j = offset; +- if (((index >> ((2 * N) - 1)) & 1) == 1) { +- j += (1 << (N - 1)); +- } +- D_ACELP_decode_2p_2N1(idx, N - 1, j, pos); +- mask = ((1 << (N + 1)) - 1); +- idx = (index >> (2 * N)) & mask; +- D_ACELP_decode_1p_N1(idx, N, offset, pos + 2); +- return; +-} +-/* +- * D_ACELP_decode_4p_4N1 +- * +- * Parameters: +- * index I: pulse index +- * N I: number of bits for position +- * offset I: offset +- * pos O: position of the pulse +- * +- * Function: +- * Decode 4 pulses with 4*N+1 bits +- * +- * Returns: +- * void +- */ +-static void D_ACELP_decode_4p_4N1(LONG index, SHORT N, SHORT offset, +- SHORT pos[]) { +- SHORT j; +- LONG mask, idx; +- /* +- * Decode 4 pulses with 4*N+1 bits +- */ +- mask = ((1 << ((2 * N) - 1)) - 1); +- idx = index & mask; +- j = offset; +- if (((index >> ((2 * N) - 1)) & 1) == 1) { +- j += (1 << (N - 1)); +- } +- D_ACELP_decode_2p_2N1(idx, N - 1, j, pos); +- mask = ((1 << ((2 * N) + 1)) - 1); +- idx = (index >> (2 * N)) & mask; +- D_ACELP_decode_2p_2N1(idx, N, offset, pos + 2); +- return; +-} +-/* +- * D_ACELP_decode_4p_4N +- * +- * Parameters: +- * index I: pulse index +- * N I: number of bits for position +- * offset I: offset +- * pos O: position of the pulse +- * +- * Function: +- * Decode 4 pulses with 4*N bits +- * +- * Returns: +- * void +- */ +-static void D_ACELP_decode_4p_4N(LONG index, SHORT N, SHORT offset, +- SHORT pos[]) { +- SHORT j, n_1; +- /* +- * Decode 4 pulses with 4*N bits +- */ +- n_1 = N - 1; +- j = offset + (1 << n_1); +- switch ((index >> ((4 * N) - 2)) & 3) { +- case 0: +- if (((index >> ((4 * n_1) + 1)) & 1) == 0) { +- D_ACELP_decode_4p_4N1(index, n_1, offset, pos); +- } else { +- D_ACELP_decode_4p_4N1(index, n_1, j, pos); +- } +- break; +- case 1: +- D_ACELP_decode_1p_N1((index >> ((3 * n_1) + 1)), n_1, offset, pos); +- D_ACELP_decode_3p_3N1(index, n_1, j, pos + 1); +- break; +- case 2: +- D_ACELP_decode_2p_2N1((index >> ((2 * n_1) + 1)), n_1, offset, pos); +- D_ACELP_decode_2p_2N1(index, n_1, j, pos + 2); +- break; +- case 3: +- D_ACELP_decode_3p_3N1((index >> (n_1 + 1)), n_1, offset, pos); +- D_ACELP_decode_1p_N1(index, n_1, j, pos + 3); +- break; +- } +- return; +-} +- +-/* +- * D_ACELP_decode_4t +- * +- * Parameters: +- * index I: index +- * mode I: speech mode +- * code I: (Q9) algebraic (fixed) codebook excitation +- * +- * Function: +- * 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. +- * 4 tracks x 16 positions per track = 64 samples. +- * +- * 20 bits 5+5+5+5 --> 4 pulses in a frame of 64 samples. +- * 36 bits 9+9+9+9 --> 8 pulses in a frame of 64 samples. +- * 44 bits 13+9+13+9 --> 10 pulses in a frame of 64 samples. +- * 52 bits 13+13+13+13 --> 12 pulses in a frame of 64 samples. +- * 64 bits 2+2+2+2+14+14+14+14 --> 16 pulses in a frame of 64 samples. +- * 72 bits 10+2+10+2+10+14+10+14 --> 18 pulses in a frame of 64 samples. +- * 88 bits 11+11+11+11+11+11+11+11 --> 24 pulses in a frame of 64 samples. +- * +- * All pulses can have two (2) possible amplitudes: +1 or -1. +- * Each pulse can sixteen (16) possible positions. +- * +- * codevector length 64 +- * number of track 4 +- * number of position 16 +- * +- * Returns: +- * void +- */ +-void D_ACELP_decode_4t64(SHORT index[], int nbits, FIXP_COD code[]) { +- LONG L_index; +- SHORT k, pos[6]; +- +- FDKmemclear(code, L_SUBFR * sizeof(FIXP_COD)); +- +- /* decode the positions and signs of pulses and build the codeword */ +- switch (nbits) { +- case 12: +- for (k = 0; k < 4; k += 2) { +- L_index = index[2 * (k / 2) + 1]; +- D_ACELP_decode_1p_N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 1, 2 * (index[2 * (k / 2)]) + k / 2, code); +- } +- break; +- case 16: { +- int i = 0; +- int offset = index[i++]; +- offset = (offset == 0) ? 1 : 3; +- for (k = 0; k < 4; k++) { +- if (k != offset) { +- L_index = index[i++]; +- D_ACELP_decode_1p_N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 1, k, code); +- } +- } +- } break; +- case 20: +- for (k = 0; k < 4; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_1p_N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 1, k, code); +- } +- break; +- case 28: +- for (k = 0; k < 4 - 2; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 2, k, code); +- } +- for (k = 2; k < 4; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_1p_N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 1, k, code); +- } +- break; +- case 36: +- for (k = 0; k < 4; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 2, k, code); +- } +- break; +- case 44: +- for (k = 0; k < 4 - 2; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_3p_3N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 3, k, code); +- } +- for (k = 2; k < 4; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_2p_2N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 2, k, code); +- } +- break; +- case 52: +- for (k = 0; k < 4; k++) { +- L_index = (LONG)index[k]; +- D_ACELP_decode_3p_3N1(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 3, k, code); +- } +- break; +- case 64: +- for (k = 0; k < 4; k++) { +- L_index = (((LONG)index[k] << 14) + (LONG)index[k + 4]); +- D_ACELP_decode_4p_4N(L_index, 4, 0, pos); +- D_ACELP_add_pulse(pos, 4, k, code); +- } +- break; +- default: +- FDK_ASSERT(0); +- } +- return; +-} +diff --git a/libAACdec/src/usacdec_ace_d4t64.h b/libAACdec/src/usacdec_ace_d4t64.h +deleted file mode 100644 +index 76bc3d9..0000000 +--- a/libAACdec/src/usacdec_ace_d4t64.h ++++ /dev/null +@@ -1,117 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): +- +- Description: ACELP +- +-*******************************************************************************/ +- +-#ifndef USACDEC_ACE_D4T64_H +-#define USACDEC_ACE_D4T64_H +- +-#include "common_fix.h" +- +-/* Data type definition for the fixed codebook vector */ +-#define FIXP_COD FIXP_SGL +-#define FX_COD2FX_DBL(x) (FX_SGL2FX_DBL(x)) +-#define FX_DBL2FX_COD(x) FX_DBL2FX_SGL((x) + (FIXP_DBL)0x8000) +-#define FX_SGL2FX_COD(x) (x) +-#define COD_BITS FRACT_BITS +- +-void D_ACELP_decode_4t64(SHORT index[], int nbits, FIXP_COD code[]); +- +-#endif /* USACDEC_ACE_D4T64_H */ +diff --git a/libAACdec/src/usacdec_ace_ltp.cpp b/libAACdec/src/usacdec_ace_ltp.cpp +deleted file mode 100644 +index 5964b49..0000000 +--- a/libAACdec/src/usacdec_ace_ltp.cpp ++++ /dev/null +@@ -1,229 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC ACELP LTP filter +- +-*******************************************************************************/ +- +-#include "usacdec_ace_ltp.h" +- +-#include "genericStds.h" +-#include "common_fix.h" +- +-#define UP_SAMP 4 +-#define L_INTERPOL2 16 +-#define L_SUBFR 64 +- +-#define A2 FL2FX_SGL(2 * 0.18f) +-#define B FL2FX_SGL(0.64f) +- +-static const LONG Pred_lt4_inter4_2[UP_SAMP][L_INTERPOL2] = { +- {(LONG)0x0000FFFC, (LONG)0x0008FFFC, (LONG)0xFFEB004C, (LONG)0xFF50014A, +- (LONG)0xFDD90351, (LONG)0xFB2A06CD, (LONG)0xF6920D46, (LONG)0xEBB42B35, +- (LONG)0x6D9EEF39, (LONG)0x0618FE0F, (LONG)0xFFE00131, (LONG)0xFE5501C5, +- (LONG)0xFE5E015D, (LONG)0xFEF700B6, (LONG)0xFF920037, (LONG)0xFFEC0003}, +- {(LONG)0x0002FFF2, (LONG)0x0026FFBD, (LONG)0x005DFF98, (LONG)0x0055FFEF, +- (LONG)0xFF89015F, (LONG)0xFD3A04E5, (LONG)0xF7D90DAA, (LONG)0xE67A50EE, +- (LONG)0x50EEE67A, (LONG)0x0DAAF7D9, (LONG)0x04E5FD3A, (LONG)0x015FFF89, +- (LONG)0xFFEF0055, (LONG)0xFF98005D, (LONG)0xFFBD0026, (LONG)0xFFF20002}, +- {(LONG)0x0003FFEC, (LONG)0x0037FF92, (LONG)0x00B6FEF7, (LONG)0x015DFE5E, +- (LONG)0x01C5FE55, (LONG)0x0131FFE0, (LONG)0xFE0F0618, (LONG)0xEF396D9E, +- (LONG)0x2B35EBB4, (LONG)0x0D46F692, (LONG)0x06CDFB2A, (LONG)0x0351FDD9, +- (LONG)0x014AFF50, (LONG)0x004CFFEB, (LONG)0xFFFC0008, (LONG)0xFFFC0000}, +- {(LONG)0x0002FFF2, (LONG)0x002BFF9E, (LONG)0x00B9FECE, (LONG)0x01CFFD75, +- (LONG)0x035EFBC1, (LONG)0x0521FA0C, (LONG)0x06AAF8C9, (LONG)0x07907852, +- (LONG)0x0790F8C9, (LONG)0x06AAFA0C, (LONG)0x0521FBC1, (LONG)0x035EFD75, +- (LONG)0x01CFFECE, (LONG)0x00B9FF9E, (LONG)0x002BFFF2, (LONG)0x00020000}}; +- +-void Pred_lt4(FIXP_DBL exc[], /* in/out: excitation buffer */ +- int T0, /* input : integer pitch lag */ +- int frac /* input : fraction of lag in range 0..3 */ +-) { +- int j; +- FIXP_DBL *x; +- const LONG *interpol; +- FIXP_DBL L_sumb, L_sumt; +- +- x = &exc[-T0 - L_INTERPOL2 + 1]; +- +- /* remap frac and x: +- 0 -> 3 x (unchanged) +- 1 -> 0 x-- +- 2 -> 1 x-- +- 3 -> 2 x-- +- */ +- +- if (--frac < 0) +- frac += UP_SAMP; +- else +- x--; +- +- j = L_SUBFR + 1; +- do { +- LONG filt; +- FIXP_DBL x0, x1; +- FIXP_DBL *xi = x++; +- interpol = Pred_lt4_inter4_2[frac]; +- int i = 3; +- +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultDiv2(x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultDiv2(x1, (FIXP_SGL)((SHORT)filt)); +- do { +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultAddDiv2(L_sumt, x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultAddDiv2(L_sumb, x1, (FIXP_SGL)((SHORT)filt)); +- +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultAddDiv2(L_sumt, x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultAddDiv2(L_sumb, x1, (FIXP_SGL)((SHORT)filt)); +- +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultAddDiv2(L_sumt, x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultAddDiv2(L_sumb, x1, (FIXP_SGL)((SHORT)filt)); +- +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultAddDiv2(L_sumt, x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultAddDiv2(L_sumb, x1, (FIXP_SGL)((SHORT)filt)); +- +- filt = *interpol++; +- x0 = *xi++; +- x1 = *xi++; +- L_sumt = fMultAddDiv2(L_sumt, x0, (FIXP_SGL)((SHORT)(filt >> 16))); +- L_sumb = fMultAddDiv2(L_sumb, x1, (FIXP_SGL)((SHORT)filt)); +- } while (--i != 0); +- +- L_sumb <<= 1; +- L_sumb = fAddSaturate(L_sumt << 1, L_sumb); +- *exc++ = L_sumb; +- } while (--j != 0); +- return; +-} +- +-void Pred_lt4_postfilter(FIXP_DBL exc[] /* in/out: excitation buffer */ +-) { +- /* +- exc[i] = A*exc[i-1] + B*exc[i] + A*exc[i+1] +- exc[i+1] = A*exc[i] + B*exc[i+1] + A*exc[i+2] ; i = 0:2:62 +- */ +- int i; +- FIXP_DBL sum0, sum1, a_exc0, a_exc1; +- a_exc0 = fMultDiv2(A2, exc[-1]); +- a_exc1 = fMultDiv2(A2, exc[0]); +- +- /* ARM926: 22 cycles/iteration */ +- for (i = 0; i < L_SUBFR; i += 2) { +- sum0 = a_exc0 + fMult(B, exc[i]); +- sum1 = a_exc1 + fMult(B, exc[i + 1]); +- a_exc0 = fMultDiv2(A2, exc[i + 1]); +- a_exc1 = fMultDiv2(A2, exc[i + 2]); +- exc[i] = sum0 + a_exc0; +- exc[i + 1] = sum1 + a_exc1; +- } +- return; +-} +diff --git a/libAACdec/src/usacdec_ace_ltp.h b/libAACdec/src/usacdec_ace_ltp.h +deleted file mode 100644 +index 5128acd..0000000 +--- a/libAACdec/src/usacdec_ace_ltp.h ++++ /dev/null +@@ -1,128 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC ACELP LTP filter +- +-*******************************************************************************/ +- +-#ifndef USACDEC_ACE_LTP_H +-#define USACDEC_ACE_LTP_H +- +-#include "common_fix.h" +- +-/** +- * \brief Compute the initial adaptive codebook excitation v'(n) by +- * interpolating the past excitation vector u'(n). +- * \param exc points to adaptive codebook of current subframe (input/output) +- * \param T0 integer part of decoded pitch lag (input) +- * \param frac fractional part of decoded pitch lag (0..3) (input) +- */ +-void Pred_lt4(FIXP_DBL exc[], /* in/out: excitation buffer */ +- int T0, /* input : integer pitch lag */ +- int frac /* input : fraction of lag */ +-); +- +-/** +- * \brief Compute the adaptive codebook excitation v(n) in case of +- * ltp_filtering_flag == 0. +- * \param exc points to adaptive codebook of current subframe (input/output) +- */ +-void Pred_lt4_postfilter(FIXP_DBL exc[] /* in/out: excitation buffer */ +-); +- +-#endif /* USACDEC_ACE_LTP_H */ +diff --git a/libAACdec/src/usacdec_acelp.cpp b/libAACdec/src/usacdec_acelp.cpp +deleted file mode 100644 +index a606459..0000000 +--- a/libAACdec/src/usacdec_acelp.cpp ++++ /dev/null +@@ -1,1296 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC ACELP frame decoder +- +-*******************************************************************************/ +- +-#include "usacdec_acelp.h" +- +-#include "usacdec_ace_d4t64.h" +-#include "usacdec_ace_ltp.h" +-#include "usacdec_rom.h" +-#include "usacdec_lpc.h" +-#include "genericStds.h" +- +-#define PIT_FR2_12k8 128 /* Minimum pitch lag with resolution 1/2 */ +-#define PIT_FR1_12k8 160 /* Minimum pitch lag with resolution 1 */ +-#define TILT_CODE2 \ +- FL2FXCONST_SGL(0.3f * 2.0f) /* ACELP code pre-emphasis factor ( *2 ) */ +-#define PIT_SHARP \ +- FL2FXCONST_SGL(0.85f) /* pitch sharpening factor */ +-#define PREEMPH_FAC \ +- FL2FXCONST_SGL(0.68f) /* ACELP synth pre-emphasis factor */ +- +-#define ACELP_HEADROOM 1 +-#define ACELP_OUTSCALE (MDCT_OUT_HEADROOM - ACELP_HEADROOM) +- +-/** +- * \brief Calculate pre-emphasis (1 - mu z^-1) on input signal. +- * \param[in] in pointer to input signal; in[-1] is also needed. +- * \param[out] out pointer to output signal. +- * \param[in] L length of filtering. +- */ +-/* static */ +-void E_UTIL_preemph(const FIXP_DBL *in, FIXP_DBL *out, INT L) { +- int i; +- +- for (i = 0; i < L; i++) { +- out[i] = in[i] - fMult(PREEMPH_FAC, in[i - 1]); +- } +- +- return; +-} +- +-/** +- * \brief Calculate de-emphasis 1/(1 - TILT_CODE z^-1) on innovative codebook +- * vector. +- * \param[in,out] x innovative codebook vector. +- */ +-static void Preemph_code( +- FIXP_COD x[] /* (i/o) : input signal overwritten by the output */ +-) { +- int i; +- FIXP_DBL L_tmp; +- +- /* ARM926: 12 cycles per sample */ +- for (i = L_SUBFR - 1; i > 0; i--) { +- L_tmp = FX_COD2FX_DBL(x[i]); +- L_tmp -= fMultDiv2(x[i - 1], TILT_CODE2); +- x[i] = FX_DBL2FX_COD(L_tmp); +- } +-} +- +-/** +- * \brief Apply pitch sharpener to the innovative codebook vector. +- * \param[in,out] x innovative codebook vector. +- * \param[in] pit_lag decoded pitch lag. +- */ +-static void Pit_shrp( +- FIXP_COD x[], /* in/out: impulse response (or algebraic code) */ +- int pit_lag /* input : pitch lag */ +-) { +- int i; +- FIXP_DBL L_tmp; +- +- for (i = pit_lag; i < L_SUBFR; i++) { +- L_tmp = FX_COD2FX_DBL(x[i]); +- L_tmp += fMult(x[i - pit_lag], PIT_SHARP); +- x[i] = FX_DBL2FX_COD(L_tmp); +- } +- +- return; +-} +- +- /** +- * \brief Calculate Quantized codebook gain, Quantized pitch gain and unbiased +- * Innovative code vector energy. +- * \param[in] index index of quantizer. +- * \param[in] code innovative code vector with exponent = SF_CODE. +- * \param[out] gain_pit Quantized pitch gain g_p with exponent = SF_GAIN_P. +- * \param[out] gain_code Quantized codebook gain g_c. +- * \param[in] mean_ener mean_ener defined in open-loop (2 bits), exponent = 7. +- * \param[out] E_code unbiased innovative code vector energy. +- * \param[out] E_code_e exponent of unbiased innovative code vector energy. +- */ +- +-#define SF_MEAN_ENER_LG10 9 +- +-/* pow(10.0, {18, 30, 42, 54}/20.0) /(float)(1<>= 1; +- } else { +- ener_code_e -= 6; +- } +- gcode_inov = invSqrtNorm2(ener_code, &gcode0_e); +- gcode_inov_e = gcode0_e - (ener_code_e >> 1); +- +- if (bfi) { +- FIXP_DBL tgcode; +- FIXP_SGL tgpit; +- +- tgpit = *past_gpit; +- +- if (tgpit > FL2FXCONST_SGL(0.95f / (1 << SF_GAIN_P))) { +- tgpit = FL2FXCONST_SGL(0.95f / (1 << SF_GAIN_P)); +- } else if (tgpit < FL2FXCONST_SGL(0.5f / (1 << SF_GAIN_P))) { +- tgpit = FL2FXCONST_SGL(0.5f / (1 << SF_GAIN_P)); +- } +- *gain_pit = tgpit; +- tgpit = FX_DBL2FX_SGL(fMult(tgpit, FL2FXCONST_DBL(0.95f))); +- *past_gpit = tgpit; +- +- tgpit = FL2FXCONST_SGL(1.4f / (1 << SF_GAIN_P)) - tgpit; +- tgcode = fMult(*past_gcode, tgpit) << SF_GAIN_P; +- *gain_code = scaleValue(fMult(tgcode, gcode_inov), gcode_inov_e); +- *past_gcode = tgcode; +- +- return; +- } +- +- /*-------------- Decode gains ---------------*/ +- /* +- gcode0 = pow(10.0, (float)mean_ener/20.0); +- gcode0 = gcode0 / sqrt(ener_code/L_SUBFR); +- */ +- gcode0 = pow_10_mean_energy[mean_ener_bits]; +- gcode0 = fMultDiv2(gcode0, gcode_inov); +- gcode0_e = gcode0_e + SF_MEAN_ENER_LG10 - (ener_code_e >> 1) + 1; +- +- i = index << 1; +- *gain_pit = fdk_t_qua_gain7b[i]; /* adaptive codebook gain */ +- /* t_qua_gain[ind2p1] : fixed codebook gain correction factor */ +- Ltmp = fMult(fdk_t_qua_gain7b[i + 1], gcode0); +- *gain_code = scaleValue(Ltmp, gcode0_e - SF_GAIN_C + SF_QUA_GAIN7B); +- +- /* update bad frame handler */ +- *past_gpit = *gain_pit; +- +- /*-------------------------------------------------------- +- past_gcode = gain_code/gcode_inov +- --------------------------------------------------------*/ +- { +- FIXP_DBL gcode_m; +- INT gcode_e; +- +- gcode_m = fDivNormHighPrec(Ltmp, gcode_inov, &gcode_e); +- gcode_e += (gcode0_e - SF_GAIN_C + SF_QUA_GAIN7B) - (gcode_inov_e); +- *past_gcode = scaleValue(gcode_m, gcode_e); +- } +-} +- +-/** +- * \brief Calculate period/voicing factor r_v +- * \param[in] exc pitch excitation. +- * \param[in] gain_pit gain of pitch g_p. +- * \param[in] gain_code gain of code g_c. +- * \param[in] gain_code_e exponent of gain of code. +- * \param[in] ener_code unbiased innovative code vector energy. +- * \param[in] ener_code_e exponent of unbiased innovative code vector energy. +- * \return period/voice factor r_v (-1=unvoiced to 1=voiced), exponent SF_PFAC. +- */ +-static FIXP_DBL calc_period_factor(FIXP_DBL exc[], FIXP_SGL gain_pit, +- FIXP_DBL gain_code, FIXP_DBL ener_code, +- int ener_code_e) { +- int ener_exc_e, L_tmp_e, s = 0; +- FIXP_DBL ener_exc, L_tmp; +- FIXP_DBL period_fac; +- +- /* energy of pitch excitation */ +- ener_exc = (FIXP_DBL)0; +- for (int i = 0; i < L_SUBFR; i++) { +- ener_exc += fPow2Div2(exc[i]) >> s; +- if (ener_exc >= FL2FXCONST_DBL(0.5f)) { +- ener_exc >>= 1; +- s++; +- } +- } +- +- ener_exc_e = fNorm(ener_exc); +- ener_exc = fMult(ener_exc << ener_exc_e, fPow2(gain_pit)); +- if (ener_exc != (FIXP_DBL)0) { +- ener_exc_e = 2 * SF_EXC + 1 + 2 * SF_GAIN_P - ener_exc_e + s; +- } else { +- ener_exc_e = 0; +- } +- +- /* energy of innovative code excitation */ +- /* L_tmp = ener_code * gain_code*gain_code; */ +- L_tmp_e = fNorm(gain_code); +- L_tmp = fPow2(gain_code << L_tmp_e); +- L_tmp = fMult(ener_code, L_tmp); +- L_tmp_e = 2 * SF_GAIN_C + ener_code_e - 2 * L_tmp_e; +- +- /* Find common exponent */ +- { +- FIXP_DBL num, den; +- int exp_diff; +- +- exp_diff = ener_exc_e - L_tmp_e; +- if (exp_diff >= 0) { +- ener_exc >>= 1; +- if (exp_diff <= DFRACT_BITS - 2) { +- L_tmp >>= exp_diff + 1; +- } else { +- L_tmp = (FIXP_DBL)0; +- } +- den = ener_exc + L_tmp; +- if (ener_exc_e < DFRACT_BITS - 1) { +- den += scaleValue(FL2FXCONST_DBL(0.01f), -ener_exc_e - 1); +- } +- } else { +- if (exp_diff >= -(DFRACT_BITS - 2)) { +- ener_exc >>= 1 - exp_diff; +- } else { +- ener_exc = (FIXP_DBL)0; +- } +- L_tmp >>= 1; +- den = ener_exc + L_tmp; +- if (L_tmp_e < DFRACT_BITS - 1) { +- den += scaleValue(FL2FXCONST_DBL(0.01f), -L_tmp_e - 1); +- } +- } +- num = (ener_exc - L_tmp); +- num >>= SF_PFAC; +- +- if (den > (FIXP_DBL)0) { +- if (ener_exc > L_tmp) { +- period_fac = schur_div(num, den, 16); +- } else { +- period_fac = -schur_div(-num, den, 16); +- } +- } else { +- period_fac = (FIXP_DBL)MAXVAL_DBL; +- } +- } +- +- /* exponent = SF_PFAC */ +- return period_fac; +-} +- +-/*------------------------------------------------------------* +- * noise enhancer * +- * ~~~~~~~~~~~~~~ * +- * - Enhance excitation on noise. (modify gain of code) * +- * If signal is noisy and LPC filter is stable, move gain * +- * of code 1.5 dB toward gain of code threshold. * +- * This decrease by 3 dB noise energy variation. * +- *------------------------------------------------------------*/ +-/** +- * \brief Enhance excitation on noise. (modify gain of code) +- * \param[in] gain_code Quantized codebook gain g_c, exponent = SF_GAIN_C. +- * \param[in] period_fac periodicity factor, exponent = SF_PFAC. +- * \param[in] stab_fac stability factor, exponent = SF_STAB. +- * \param[in,out] p_gc_threshold modified gain of previous subframe. +- * \return gain_code smoothed gain of code g_sc, exponent = SF_GAIN_C. +- */ +-static FIXP_DBL +-noise_enhancer(/* (o) : smoothed gain g_sc SF_GAIN_C */ +- FIXP_DBL gain_code, /* (i) : Quantized codebook gain SF_GAIN_C */ +- FIXP_DBL period_fac, /* (i) : periodicity factor (-1=unvoiced to +- 1=voiced), SF_PFAC */ +- FIXP_SGL stab_fac, /* (i) : stability factor (0 <= ... < 1.0) +- SF_STAB */ +- FIXP_DBL +- *p_gc_threshold) /* (io): gain of code threshold SF_GAIN_C */ +-{ +- FIXP_DBL fac, L_tmp, gc_thres; +- +- gc_thres = *p_gc_threshold; +- +- L_tmp = gain_code; +- if (L_tmp < gc_thres) { +- L_tmp += fMultDiv2(gain_code, +- FL2FXCONST_SGL(2.0 * 0.19f)); /* +1.5dB => *(1.0+0.19) */ +- if (L_tmp > gc_thres) { +- L_tmp = gc_thres; +- } +- } else { +- L_tmp = fMult(gain_code, +- FL2FXCONST_SGL(1.0f / 1.19f)); /* -1.5dB => *10^(-1.5/20) */ +- if (L_tmp < gc_thres) { +- L_tmp = gc_thres; +- } +- } +- *p_gc_threshold = L_tmp; +- +- /* voicing factor lambda = 0.5*(1-period_fac) */ +- /* gain smoothing factor S_m = lambda*stab_fac (=fac) +- = 0.5(stab_fac - stab_fac * period_fac) */ +- fac = (FX_SGL2FX_DBL(stab_fac) >> (SF_PFAC + 1)) - +- fMultDiv2(stab_fac, period_fac); +- /* fac_e = SF_PFAC + SF_STAB */ +- FDK_ASSERT(fac >= (FIXP_DBL)0); +- +- /* gain_code = (float)((fac*tmp) + ((1.0-fac)*gain_code)); */ +- gain_code = fMult(fac, L_tmp) - +- fMult(FL2FXCONST_DBL(-1.0f / (1 << (SF_PFAC + SF_STAB))) + fac, +- gain_code); +- gain_code <<= (SF_PFAC + SF_STAB); +- +- return gain_code; +-} +- +-/** +- * \brief Update adaptive codebook u'(n) (exc) +- * Enhance pitch of c(n) and build post-processed excitation u(n) (exc2) +- * \param[in] code innovative codevector c(n), exponent = SF_CODE. +- * \param[in,out] exc filtered adaptive codebook v(n), exponent = SF_EXC. +- * \param[in] gain_pit adaptive codebook gain, exponent = SF_GAIN_P. +- * \param[in] gain_code innovative codebook gain g_c, exponent = SF_GAIN_C. +- * \param[in] gain_code_smoothed smoothed innov. codebook gain g_sc, exponent = +- * SF_GAIN_C. +- * \param[in] period_fac periodicity factor r_v, exponent = SF_PFAC. +- * \param[out] exc2 post-processed excitation u(n), exponent = SF_EXC. +- */ +-void BuildAdaptiveExcitation( +- FIXP_COD code[], /* (i) : algebraic codevector c(n) Q9 */ +- FIXP_DBL exc[], /* (io): filtered adaptive codebook v(n) Q15 */ +- FIXP_SGL gain_pit, /* (i) : adaptive codebook gain g_p Q14 */ +- FIXP_DBL gain_code, /* (i) : innovative codebook gain g_c Q16 */ +- FIXP_DBL gain_code_smoothed, /* (i) : smoothed innov. codebook gain g_sc +- Q16 */ +- FIXP_DBL period_fac, /* (i) : periodicity factor r_v Q15 */ +- FIXP_DBL exc2[] /* (o) : post-processed excitation u(n) Q15 */ +-) { +-/* Note: code[L_SUBFR] and exc2[L_SUBFR] share the same memory! +- If exc2[i] is written, code[i] will be destroyed! +-*/ +-#define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC) +- +- int i; +- FIXP_DBL tmp, cpe, code_smooth_prev, code_smooth; +- +- FIXP_COD code_i; +- FIXP_DBL cpe_code_smooth, cpe_code_smooth_prev; +- +- /* cpe = (1+r_v)/8 * 2 ; ( SF = -1) */ +- cpe = (period_fac >> (2 - SF_PFAC)) + FL2FXCONST_DBL(0.25f); +- +- /* u'(n) */ +- tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); /* v(0)*g_p */ +- *exc++ = tmp + (fMultDiv2(code[0], gain_code) << SF); +- +- /* u(n) */ +- code_smooth_prev = fMultDiv2(*code++, gain_code_smoothed) +- << SF; /* c(0) * g_sc */ +- code_i = *code++; +- code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; /* c(1) * g_sc */ +- tmp += code_smooth_prev; /* tmp = v(0)*g_p + c(0)*g_sc */ +- cpe_code_smooth = fMultDiv2(cpe, code_smooth); +- *exc2++ = tmp - cpe_code_smooth; +- cpe_code_smooth_prev = fMultDiv2(cpe, code_smooth_prev); +- +- i = L_SUBFR - 2; +- do /* ARM926: 22 cycles per iteration */ +- { +- /* u'(n) */ +- tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); +- *exc++ = tmp + (fMultDiv2(code_i, gain_code) << SF); +- /* u(n) */ +- tmp += code_smooth; /* += g_sc * c(i) */ +- tmp -= cpe_code_smooth_prev; +- cpe_code_smooth_prev = cpe_code_smooth; +- code_i = *code++; +- code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; +- cpe_code_smooth = fMultDiv2(cpe, code_smooth); +- *exc2++ = tmp - cpe_code_smooth; /* tmp - c_pe * g_sc * c(i+1) */ +- } while (--i != 0); +- +- /* u'(n) */ +- tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); +- *exc = tmp + (fMultDiv2(code_i, gain_code) << SF); +- /* u(n) */ +- tmp += code_smooth; +- tmp -= cpe_code_smooth_prev; +- *exc2++ = tmp; +- +- return; +-} +- +-/** +- * \brief Interpolate LPC vector in LSP domain for current subframe and convert +- * to LP domain +- * \param[in] lsp_old LPC vector (LSP domain) corresponding to the beginning of +- * current ACELP frame. +- * \param[in] lsp_new LPC vector (LSP domain) corresponding to the end of +- * current ACELP frame. +- * \param[in] subfr_nr number of current ACELP subframe 0..3. +- * \param[in] nb_subfr total number of ACELP subframes in this frame. +- * \param[out] A LP filter coefficients for current ACELP subframe, exponent = +- * SF_A_COEFFS. +- */ +-/* static */ +-void int_lpc_acelp( +- const FIXP_LPC lsp_old[], /* input : LSPs from past frame */ +- const FIXP_LPC lsp_new[], /* input : LSPs from present frame */ +- int subfr_nr, int nb_subfr, +- FIXP_LPC +- A[], /* output: interpolated LP coefficients for current subframe */ +- INT *A_exp) { +- int i; +- FIXP_LPC lsp_interpol[M_LP_FILTER_ORDER]; +- FIXP_SGL fac_old, fac_new; +- +- FDK_ASSERT((nb_subfr == 3) || (nb_subfr == 4)); +- +- fac_old = lsp_interpol_factor[nb_subfr & 0x1][(nb_subfr - 1) - subfr_nr]; +- fac_new = lsp_interpol_factor[nb_subfr & 0x1][subfr_nr]; +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp_interpol[i] = FX_DBL2FX_LPC( +- (fMultDiv2(lsp_old[i], fac_old) + fMultDiv2(lsp_new[i], fac_new)) << 1); +- } +- +- E_LPC_f_lsp_a_conversion(lsp_interpol, A, A_exp); +- +- return; +-} +- +-/** +- * \brief Perform LP synthesis by filtering the post-processed excitation u(n) +- * through the LP synthesis filter 1/A(z) +- * \param[in] a LP filter coefficients, exponent = SF_A_COEFFS. +- * \param[in] length length of input/output signal. +- * \param[in] x post-processed excitation u(n). +- * \param[in,out] y LP synthesis signal and filter memory +- * y[-M_LP_FILTER_ORDER..-1]. +- */ +- +-/* static */ +-void Syn_filt(const FIXP_LPC a[], /* (i) : a[m] prediction coefficients Q12 */ +- const INT a_exp, +- INT length, /* (i) : length of input/output signal (64|128) */ +- FIXP_DBL x[], /* (i) : input signal Qx */ +- FIXP_DBL y[] /* (i/o) : filter states / output signal Qx-s*/ +-) { +- int i, j; +- FIXP_DBL L_tmp; +- +- for (i = 0; i < length; i++) { +- L_tmp = (FIXP_DBL)0; +- +- for (j = 0; j < M_LP_FILTER_ORDER; j++) { +- L_tmp -= fMultDiv2(a[j], y[i - (j + 1)]) >> (LP_FILTER_SCALE - 1); +- } +- +- L_tmp = scaleValue(L_tmp, a_exp + LP_FILTER_SCALE); +- y[i] = fAddSaturate(L_tmp, x[i]); +- } +- +- return; +-} +- +-/** +- * \brief Calculate de-emphasis 1/(1 - mu z^-1) on input signal. +- * \param[in] x input signal. +- * \param[out] y output signal. +- * \param[in] L length of signal. +- * \param[in,out] mem memory (signal[-1]). +- */ +-/* static */ +-void Deemph(FIXP_DBL *x, FIXP_DBL *y, int L, FIXP_DBL *mem) { +- int i; +- FIXP_DBL yi = *mem; +- +- for (i = 0; i < L; i++) { +- FIXP_DBL xi = x[i] >> 1; +- xi = fMultAddDiv2(xi, PREEMPH_FAC, yi); +- yi = SATURATE_LEFT_SHIFT(xi, 1, 32); +- y[i] = yi; +- } +- *mem = yi; +- return; +-} +- +-/** +- * \brief Compute the LP residual by filtering the input speech through the +- * analysis filter A(z). +- * \param[in] a LP filter coefficients, exponent = SF_A_COEFFS +- * \param[in] x input signal (note that values x[-m..-1] are needed), exponent = +- * SF_SYNTH +- * \param[out] y output signal (residual), exponent = SF_EXC +- * \param[in] l length of filtering +- */ +-/* static */ +-void E_UTIL_residu(const FIXP_LPC *a, const INT a_exp, FIXP_DBL *x, FIXP_DBL *y, +- INT l) { +- FIXP_DBL s; +- INT i, j; +- +- /* (note that values x[-m..-1] are needed) */ +- for (i = 0; i < l; i++) { +- s = (FIXP_DBL)0; +- +- for (j = 0; j < M_LP_FILTER_ORDER; j++) { +- s += fMultDiv2(a[j], x[i - j - 1]) >> (LP_FILTER_SCALE - 1); +- } +- +- s = scaleValue(s, a_exp + LP_FILTER_SCALE); +- y[i] = fAddSaturate(s, x[i]); +- } +- +- return; +-} +- +-/* use to map subfr number to number of bits used for acb_index */ +-static const UCHAR num_acb_idx_bits_table[2][NB_SUBFR] = { +- {9, 6, 9, 6}, /* coreCoderFrameLength == 1024 */ +- {9, 6, 6, 0} /* coreCoderFrameLength == 768 */ +-}; +- +-static int DecodePitchLag(HANDLE_FDK_BITSTREAM hBs, +- const UCHAR num_acb_idx_bits, +- const int PIT_MIN, /* TMIN */ +- const int PIT_FR2, /* TFR2 */ +- const int PIT_FR1, /* TFR1 */ +- const int PIT_MAX, /* TMAX */ +- int *pT0, int *pT0_frac, int *pT0_min, int *pT0_max) { +- int acb_idx; +- int error = 0; +- int T0, T0_frac; +- +- FDK_ASSERT((num_acb_idx_bits == 9) || (num_acb_idx_bits == 6)); +- +- acb_idx = FDKreadBits(hBs, num_acb_idx_bits); +- +- if (num_acb_idx_bits == 6) { +- /* When the pitch value is encoded on 6 bits, a pitch resolution of 1/4 is +- always used in the range [T1-8, T1+7.75], where T1 is nearest integer to +- the fractional pitch lag of the previous subframe. +- */ +- T0 = *pT0_min + acb_idx / 4; +- T0_frac = acb_idx & 0x3; +- } else { /* num_acb_idx_bits == 9 */ +- /* When the pitch value is encoded on 9 bits, a fractional pitch delay is +- used with resolutions 0.25 in the range [TMIN, TFR2-0.25], resolutions +- 0.5 in the range [TFR2, TFR1-0.5], and integers only in the range [TFR1, +- TMAX]. NOTE: for small sampling rates TMAX can get smaller than TFR1. +- */ +- int T0_min, T0_max; +- +- if (acb_idx < (PIT_FR2 - PIT_MIN) * 4) { +- /* first interval with 0.25 pitch resolution */ +- T0 = PIT_MIN + (acb_idx / 4); +- T0_frac = acb_idx & 0x3; +- } else if (acb_idx < ((PIT_FR2 - PIT_MIN) * 4 + (PIT_FR1 - PIT_FR2) * 2)) { +- /* second interval with 0.5 pitch resolution */ +- acb_idx -= (PIT_FR2 - PIT_MIN) * 4; +- T0 = PIT_FR2 + (acb_idx / 2); +- T0_frac = (acb_idx & 0x1) * 2; +- } else { +- /* third interval with 1.0 pitch resolution */ +- T0 = acb_idx + PIT_FR1 - ((PIT_FR2 - PIT_MIN) * 4) - +- ((PIT_FR1 - PIT_FR2) * 2); +- T0_frac = 0; +- } +- /* find T0_min and T0_max for subframe 1 or 3 */ +- T0_min = T0 - 8; +- if (T0_min < PIT_MIN) { +- T0_min = PIT_MIN; +- } +- T0_max = T0_min + 15; +- if (T0_max > PIT_MAX) { +- T0_max = PIT_MAX; +- T0_min = T0_max - 15; +- } +- *pT0_min = T0_min; +- *pT0_max = T0_max; +- } +- *pT0 = T0; +- *pT0_frac = T0_frac; +- +- return error; +-} +-static void ConcealPitchLag(CAcelpStaticMem *acelp_mem, const int PIT_MAX, +- int *pT0, int *pT0_frac) { +- USHORT *pold_T0 = &acelp_mem->old_T0; +- UCHAR *pold_T0_frac = &acelp_mem->old_T0_frac; +- +- if ((int)*pold_T0 >= PIT_MAX) { +- *pold_T0 = (UCHAR)(PIT_MAX - 5); +- } +- *pT0 = (int)*pold_T0; +- *pT0_frac = (int)*pold_T0_frac; +-} +- +-static UCHAR tab_coremode2nbits[8] = {20, 28, 36, 44, 52, 64, 12, 16}; +- +-static int MapCoreMode2NBits(int core_mode) { +- return (int)tab_coremode2nbits[core_mode]; +-} +- +-void CLpd_AcelpDecode(CAcelpStaticMem *acelp_mem, INT i_offset, +- const FIXP_LPC lsp_old[M_LP_FILTER_ORDER], +- const FIXP_LPC lsp_new[M_LP_FILTER_ORDER], +- FIXP_SGL stab_fac, CAcelpChannelData *pAcelpData, +- INT numLostSubframes, int lastLpcLost, int frameCnt, +- FIXP_DBL synth[], int pT[], FIXP_DBL *pit_gain, +- INT coreCoderFrameLength) { +- int i_subfr, subfr_nr, l_div, T; +- int T0 = -1, T0_frac = -1; /* mark invalid */ +- +- int pit_gain_index = 0; +- +- const int PIT_MAX = PIT_MAX_12k8 + (6 * i_offset); /* maximum pitch lag */ +- +- FIXP_COD *code; +- FIXP_DBL *exc2; +- FIXP_DBL *syn; +- FIXP_DBL *exc; +- FIXP_LPC A[M_LP_FILTER_ORDER]; +- INT A_exp; +- +- FIXP_DBL period_fac; +- FIXP_SGL gain_pit; +- FIXP_DBL gain_code, gain_code_smooth, Ener_code; +- int Ener_code_e; +- int n; +- int bfi = (numLostSubframes > 0) ? 1 : 0; +- +- C_ALLOC_SCRATCH_START( +- exc_buf, FIXP_DBL, +- PIT_MAX_MAX + L_INTERPOL + L_DIV + 1); /* 411 + 17 + 256 + 1 = 685 */ +- C_ALLOC_SCRATCH_START(syn_buf, FIXP_DBL, +- M_LP_FILTER_ORDER + L_DIV); /* 16 + 256 = 272 */ +- /* use same memory for code[L_SUBFR] and exc2[L_SUBFR] */ +- C_ALLOC_SCRATCH_START(tmp_buf, FIXP_DBL, L_SUBFR); /* 64 */ +- /* make sure they don't overlap if they are accessed alternatingly in +- * BuildAdaptiveExcitation() */ +-#if (COD_BITS == FRACT_BITS) +- code = (FIXP_COD *)(tmp_buf + L_SUBFR / 2); +-#elif (COD_BITS == DFRACT_BITS) +- code = (FIXP_COD *)tmp_buf; +-#endif +- exc2 = (FIXP_DBL *)tmp_buf; +- +- syn = syn_buf + M_LP_FILTER_ORDER; +- exc = exc_buf + PIT_MAX_MAX + L_INTERPOL; +- +- FDKmemcpy(syn_buf, acelp_mem->old_syn_mem, +- M_LP_FILTER_ORDER * sizeof(FIXP_DBL)); +- FDKmemcpy(exc_buf, acelp_mem->old_exc_mem, +- (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL)); +- +- FDKmemclear(exc_buf + (PIT_MAX_MAX + L_INTERPOL), +- (L_DIV + 1) * sizeof(FIXP_DBL)); +- +- l_div = coreCoderFrameLength / NB_DIV; +- +- for (i_subfr = 0, subfr_nr = 0; i_subfr < l_div; +- i_subfr += L_SUBFR, subfr_nr++) { +- /*-------------------------------------------------* +- * - Decode pitch lag (T0 and T0_frac) * +- *-------------------------------------------------*/ +- if (bfi) { +- ConcealPitchLag(acelp_mem, PIT_MAX, &T0, &T0_frac); +- } else { +- T0 = (int)pAcelpData->T0[subfr_nr]; +- T0_frac = (int)pAcelpData->T0_frac[subfr_nr]; +- } +- +- /*-------------------------------------------------* +- * - Find the pitch gain, the interpolation filter * +- * and the adaptive codebook vector. * +- *-------------------------------------------------*/ +- Pred_lt4(&exc[i_subfr], T0, T0_frac); +- +- if ((!bfi && pAcelpData->ltp_filtering_flag[subfr_nr] == 0) || +- (bfi && numLostSubframes == 1 && stab_fac < FL2FXCONST_SGL(0.25f))) { +- /* find pitch excitation with lp filter: v'(n) => v(n) */ +- Pred_lt4_postfilter(&exc[i_subfr]); +- } +- +- /*-------------------------------------------------------* +- * - Decode innovative codebook. * +- * - Add the fixed-gain pitch contribution to code[]. * +- *-------------------------------------------------------*/ +- if (bfi) { +- for (n = 0; n < L_SUBFR; n++) { +- code[n] = +- FX_SGL2FX_COD((FIXP_SGL)E_UTIL_random(&acelp_mem->seed_ace)) >> 4; +- } +- } else { +- int nbits = MapCoreMode2NBits((int)pAcelpData->acelp_core_mode); +- D_ACELP_decode_4t64(pAcelpData->icb_index[subfr_nr], nbits, &code[0]); +- } +- +- T = T0; +- if (T0_frac > 2) { +- T += 1; +- } +- +- Preemph_code(code); +- Pit_shrp(code, T); +- +- /* Output pitch lag for bass post-filter */ +- if (T > PIT_MAX) { +- pT[subfr_nr] = PIT_MAX; +- } else { +- pT[subfr_nr] = T; +- } +- D_gain2_plus( +- pAcelpData->gains[subfr_nr], +- code, /* (i) : Innovative code vector, exponent = SF_CODE */ +- &gain_pit, /* (o) : Quantized pitch gain, exponent = SF_GAIN_P */ +- &gain_code, /* (o) : Quantized codebook gain */ +- pAcelpData +- ->mean_energy, /* (i) : mean_ener defined in open-loop (2 bits) */ +- bfi, &acelp_mem->past_gpit, &acelp_mem->past_gcode, +- &Ener_code, /* (o) : Innovative code vector energy */ +- &Ener_code_e); /* (o) : Innovative code vector energy exponent */ +- +- pit_gain[pit_gain_index++] = FX_SGL2FX_DBL(gain_pit); +- +- /* calc periodicity factor r_v */ +- period_fac = +- calc_period_factor(/* (o) : factor (-1=unvoiced to 1=voiced) */ +- &exc[i_subfr], /* (i) : pitch excitation, exponent = +- SF_EXC */ +- gain_pit, /* (i) : gain of pitch, exponent = +- SF_GAIN_P */ +- gain_code, /* (i) : gain of code */ +- Ener_code, /* (i) : Energy of code[] */ +- Ener_code_e); /* (i) : Exponent of energy of code[] +- */ +- +- if (lastLpcLost && frameCnt == 0) { +- if (gain_pit > FL2FXCONST_SGL(1.0f / (1 << SF_GAIN_P))) { +- gain_pit = FL2FXCONST_SGL(1.0f / (1 << SF_GAIN_P)); +- } +- } +- +- gain_code_smooth = +- noise_enhancer(/* (o) : smoothed gain g_sc exponent = SF_GAIN_C */ +- gain_code, /* (i) : Quantized codebook gain */ +- period_fac, /* (i) : periodicity factor (-1=unvoiced to +- 1=voiced) */ +- stab_fac, /* (i) : stability factor (0 <= ... < 1), +- exponent = 1 */ +- &acelp_mem->gc_threshold); +- +- /* Compute adaptive codebook update u'(n), pitch enhancement c'(n) and +- * post-processed excitation u(n). */ +- BuildAdaptiveExcitation(code, exc + i_subfr, gain_pit, gain_code, +- gain_code_smooth, period_fac, exc2); +- +- /* Interpolate filter coeffs for current subframe in lsp domain and convert +- * to LP domain */ +- int_lpc_acelp(lsp_old, /* input : LSPs from past frame */ +- lsp_new, /* input : LSPs from present frame */ +- subfr_nr, /* input : ACELP subframe index */ +- coreCoderFrameLength / L_DIV, +- A, /* output: LP coefficients of this subframe */ +- &A_exp); +- +- Syn_filt(A, /* (i) : a[m] prediction coefficients */ +- A_exp, L_SUBFR, /* (i) : length */ +- exc2, /* (i) : input signal */ +- &syn[i_subfr] /* (i/o) : filter states / output signal */ +- ); +- +- } /* end of subframe loop */ +- +- /* update pitch value for bfi procedure */ +- acelp_mem->old_T0_frac = T0_frac; +- acelp_mem->old_T0 = T0; +- +- /* save old excitation and old synthesis memory for next ACELP frame */ +- FDKmemcpy(acelp_mem->old_exc_mem, exc + l_div - (PIT_MAX_MAX + L_INTERPOL), +- sizeof(FIXP_DBL) * (PIT_MAX_MAX + L_INTERPOL)); +- FDKmemcpy(acelp_mem->old_syn_mem, syn_buf + l_div, +- sizeof(FIXP_DBL) * M_LP_FILTER_ORDER); +- +- Deemph(syn, synth, l_div, +- &acelp_mem->de_emph_mem); /* ref soft: mem = synth[-1] */ +- +- scaleValues(synth, l_div, -ACELP_OUTSCALE); +- acelp_mem->deemph_mem_wsyn = acelp_mem->de_emph_mem; +- +- C_ALLOC_SCRATCH_END(tmp_buf, FIXP_DBL, L_SUBFR); +- C_ALLOC_SCRATCH_END(syn_buf, FIXP_DBL, M_LP_FILTER_ORDER + L_DIV); +- C_ALLOC_SCRATCH_END(exc_buf, FIXP_DBL, PIT_MAX_MAX + L_INTERPOL + L_DIV + 1); +- return; +-} +- +-void CLpd_AcelpReset(CAcelpStaticMem *acelp) { +- acelp->gc_threshold = (FIXP_DBL)0; +- +- acelp->past_gpit = (FIXP_SGL)0; +- acelp->past_gcode = (FIXP_DBL)0; +- acelp->old_T0 = 64; +- acelp->old_T0_frac = 0; +- acelp->deemph_mem_wsyn = (FIXP_DBL)0; +- acelp->wsyn_rms = (FIXP_DBL)0; +- acelp->seed_ace = 0; +-} +- +-/* TCX time domain concealment */ +-/* Compare to figure 13a on page 54 in 3GPP TS 26.290 */ +-void CLpd_TcxTDConceal(CAcelpStaticMem *acelp_mem, SHORT *pitch, +- const FIXP_LPC lsp_old[M_LP_FILTER_ORDER], +- const FIXP_LPC lsp_new[M_LP_FILTER_ORDER], +- const FIXP_SGL stab_fac, INT nLostSf, FIXP_DBL synth[], +- INT coreCoderFrameLength, UCHAR last_tcx_noise_factor) { +- /* repeat past excitation with pitch from previous decoded TCX frame */ +- C_ALLOC_SCRATCH_START( +- exc_buf, FIXP_DBL, +- PIT_MAX_MAX + L_INTERPOL + L_DIV); /* 411 + 17 + 256 + 1 = */ +- C_ALLOC_SCRATCH_START(syn_buf, FIXP_DBL, +- M_LP_FILTER_ORDER + L_DIV); /* 256 + 16 = */ +- /* += */ +- FIXP_DBL ns_buf[L_DIV + 1]; +- FIXP_DBL *syn = syn_buf + M_LP_FILTER_ORDER; +- FIXP_DBL *exc = exc_buf + PIT_MAX_MAX + L_INTERPOL; +- FIXP_DBL *ns = ns_buf + 1; +- FIXP_DBL tmp, fact_exc; +- INT T = fMin(*pitch, (SHORT)PIT_MAX_MAX); +- int i, i_subfr, subfr_nr; +- int lDiv = coreCoderFrameLength / NB_DIV; +- +- FDKmemcpy(syn_buf, acelp_mem->old_syn_mem, +- M_LP_FILTER_ORDER * sizeof(FIXP_DBL)); +- FDKmemcpy(exc_buf, acelp_mem->old_exc_mem, +- (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL)); +- +- /* if we lost all packets (i.e. 1 packet of TCX-20 ms, 2 packets of +- the TCX-40 ms or 4 packets of the TCX-80ms), we lost the whole +- coded frame extrapolation strategy: repeat lost excitation and +- use extrapolated LSFs */ +- +- /* AMR-WB+ like TCX TD concealment */ +- +- /* number of lost frame cmpt */ +- if (nLostSf < 2) { +- fact_exc = FL2FXCONST_DBL(0.8f); +- } else { +- fact_exc = FL2FXCONST_DBL(0.4f); +- } +- +- /* repeat past excitation */ +- for (i = 0; i < lDiv; i++) { +- exc[i] = fMult(fact_exc, exc[i - T]); +- } +- +- tmp = fMult(fact_exc, acelp_mem->wsyn_rms); +- acelp_mem->wsyn_rms = tmp; +- +- /* init deemph_mem_wsyn */ +- acelp_mem->deemph_mem_wsyn = exc[-1]; +- +- ns[-1] = acelp_mem->deemph_mem_wsyn; +- +- for (i_subfr = 0, subfr_nr = 0; i_subfr < lDiv; +- i_subfr += L_SUBFR, subfr_nr++) { +- FIXP_DBL tRes[L_SUBFR]; +- FIXP_LPC A[M_LP_FILTER_ORDER]; +- INT A_exp; +- +- /* interpolate LPC coefficients */ +- int_lpc_acelp(lsp_old, lsp_new, subfr_nr, lDiv / L_SUBFR, A, &A_exp); +- +- Syn_filt(A, /* (i) : a[m] prediction coefficients */ +- A_exp, L_SUBFR, /* (i) : length */ +- &exc[i_subfr], /* (i) : input signal */ +- &syn[i_subfr] /* (i/o) : filter states / output signal */ +- ); +- +- E_LPC_a_weight( +- A, A, +- M_LP_FILTER_ORDER); /* overwrite A as it is not needed any longer */ +- +- E_UTIL_residu(A, A_exp, &syn[i_subfr], tRes, L_SUBFR); +- +- Deemph(tRes, &ns[i_subfr], L_SUBFR, &acelp_mem->deemph_mem_wsyn); +- +- /* Amplitude limiter (saturate at wsyn_rms) */ +- for (i = i_subfr; i < i_subfr + L_SUBFR; i++) { +- if (ns[i] > tmp) { +- ns[i] = tmp; +- } else { +- if (ns[i] < -tmp) { +- ns[i] = -tmp; +- } +- } +- } +- +- E_UTIL_preemph(&ns[i_subfr], tRes, L_SUBFR); +- +- Syn_filt(A, /* (i) : a[m] prediction coefficients */ +- A_exp, L_SUBFR, /* (i) : length */ +- tRes, /* (i) : input signal */ +- &syn[i_subfr] /* (i/o) : filter states / output signal */ +- ); +- +- FDKmemmove(&synth[i_subfr], &syn[i_subfr], L_SUBFR * sizeof(FIXP_DBL)); +- } +- +- /* save old excitation and old synthesis memory for next ACELP frame */ +- FDKmemcpy(acelp_mem->old_exc_mem, exc + lDiv - (PIT_MAX_MAX + L_INTERPOL), +- sizeof(FIXP_DBL) * (PIT_MAX_MAX + L_INTERPOL)); +- FDKmemcpy(acelp_mem->old_syn_mem, syn_buf + lDiv, +- sizeof(FIXP_DBL) * M_LP_FILTER_ORDER); +- acelp_mem->de_emph_mem = acelp_mem->deemph_mem_wsyn; +- +- C_ALLOC_SCRATCH_END(syn_buf, FIXP_DBL, M_LP_FILTER_ORDER + L_DIV); +- C_ALLOC_SCRATCH_END(exc_buf, FIXP_DBL, PIT_MAX_MAX + L_INTERPOL + L_DIV); +-} +- +-void Acelp_PreProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch, +- INT *old_T_pf, FIXP_DBL *pit_gain, +- FIXP_DBL *old_gain_pf, INT samplingRate, INT *i_offset, +- INT coreCoderFrameLength, INT synSfd, +- INT nbSubfrSuperfr) { +- int n; +- +- /* init beginning of synth_buf with old synthesis from previous frame */ +- FDKmemcpy(synth_buf, old_synth, sizeof(FIXP_DBL) * (PIT_MAX_MAX - BPF_DELAY)); +- +- /* calculate pitch lag offset for ACELP decoder */ +- *i_offset = +- (samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM - +- PIT_MIN_12k8; +- +- /* for bass postfilter */ +- for (n = 0; n < synSfd; n++) { +- pitch[n] = old_T_pf[n]; +- pit_gain[n] = old_gain_pf[n]; +- } +- for (n = 0; n < nbSubfrSuperfr; n++) { +- pitch[n + synSfd] = L_SUBFR; +- pit_gain[n + synSfd] = (FIXP_DBL)0; +- } +-} +- +-void Acelp_PostProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch, +- INT *old_T_pf, INT coreCoderFrameLength, INT synSfd, +- INT nbSubfrSuperfr) { +- int n; +- +- /* store last part of synth_buf (which is not handled by the IMDCT overlap) +- * for next frame */ +- FDKmemcpy(old_synth, synth_buf + coreCoderFrameLength, +- sizeof(FIXP_DBL) * (PIT_MAX_MAX - BPF_DELAY)); +- +- /* for bass postfilter */ +- for (n = 0; n < synSfd; n++) { +- old_T_pf[n] = pitch[nbSubfrSuperfr + n]; +- } +-} +- +-#define L_FAC_ZIR (LFAC) +- +-void CLpd_Acelp_Zir(const FIXP_LPC A[], const INT A_exp, +- CAcelpStaticMem *acelp_mem, const INT length, +- FIXP_DBL zir[], int doDeemph) { +- C_ALLOC_SCRATCH_START(tmp_buf, FIXP_DBL, L_FAC_ZIR + M_LP_FILTER_ORDER); +- FDK_ASSERT(length <= L_FAC_ZIR); +- +- FDKmemcpy(tmp_buf, acelp_mem->old_syn_mem, +- M_LP_FILTER_ORDER * sizeof(FIXP_DBL)); +- FDKmemset(tmp_buf + M_LP_FILTER_ORDER, 0, L_FAC_ZIR * sizeof(FIXP_DBL)); +- +- Syn_filt(A, A_exp, length, &tmp_buf[M_LP_FILTER_ORDER], +- &tmp_buf[M_LP_FILTER_ORDER]); +- if (!doDeemph) { +- /* if last lpd mode was TD concealment, then bypass deemph */ +- FDKmemcpy(zir, tmp_buf, length * sizeof(*zir)); +- } else { +- Deemph(&tmp_buf[M_LP_FILTER_ORDER], &zir[0], length, +- &acelp_mem->de_emph_mem); +- scaleValues(zir, length, -ACELP_OUTSCALE); +- } +- C_ALLOC_SCRATCH_END(tmp_buf, FIXP_DBL, L_FAC_ZIR + M_LP_FILTER_ORDER); +-} +- +-void CLpd_AcelpPrepareInternalMem(const FIXP_DBL *synth, UCHAR last_lpd_mode, +- UCHAR last_last_lpd_mode, +- const FIXP_LPC *A_new, const INT A_new_exp, +- const FIXP_LPC *A_old, const INT A_old_exp, +- CAcelpStaticMem *acelp_mem, +- INT coreCoderFrameLength, INT clearOldExc, +- UCHAR lpd_mode) { +- int l_div = +- coreCoderFrameLength / NB_DIV; /* length of one ACELP/TCX20 frame */ +- int l_div_partial; +- FIXP_DBL *syn, *old_exc_mem; +- +- C_ALLOC_SCRATCH_START(synth_buf, FIXP_DBL, +- PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER); +- syn = &synth_buf[M_LP_FILTER_ORDER]; +- +- l_div_partial = PIT_MAX_MAX + L_INTERPOL - l_div; +- old_exc_mem = acelp_mem->old_exc_mem; +- +- if (lpd_mode == 4) { +- /* Bypass Domain conversion. TCXTD Concealment does no deemphasis in the +- * end. */ +- FDKmemcpy( +- synth_buf, &synth[-(PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER)], +- (PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER) * sizeof(FIXP_DBL)); +- /* Set deemphasis memory state for TD concealment */ +- acelp_mem->deemph_mem_wsyn = scaleValueSaturate(synth[-1], ACELP_OUTSCALE); +- } else { +- /* convert past [PIT_MAX_MAX+L_INTERPOL+M_LP_FILTER_ORDER] synthesis to +- * preemph domain */ +- E_UTIL_preemph(&synth[-(PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER)], +- synth_buf, PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER); +- scaleValuesSaturate(synth_buf, PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER, +- ACELP_OUTSCALE); +- } +- +- /* Set deemphasis memory state */ +- acelp_mem->de_emph_mem = scaleValueSaturate(synth[-1], ACELP_OUTSCALE); +- +- /* update acelp synth filter memory */ +- FDKmemcpy(acelp_mem->old_syn_mem, +- &syn[PIT_MAX_MAX + L_INTERPOL - M_LP_FILTER_ORDER], +- M_LP_FILTER_ORDER * sizeof(FIXP_DBL)); +- +- if (clearOldExc) { +- FDKmemclear(old_exc_mem, (PIT_MAX_MAX + L_INTERPOL) * sizeof(FIXP_DBL)); +- C_ALLOC_SCRATCH_END(synth_buf, FIXP_DBL, +- PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER); +- return; +- } +- +- /* update past [PIT_MAX_MAX+L_INTERPOL] samples of exc memory */ +- if (last_lpd_mode == 1) { /* last frame was TCX20 */ +- if (last_last_lpd_mode == 0) { /* ACELP -> TCX20 -> ACELP transition */ +- /* Delay valid part of excitation buffer (from previous ACELP frame) by +- * l_div samples */ +- FDKmemmove(old_exc_mem, old_exc_mem + l_div, +- sizeof(FIXP_DBL) * l_div_partial); +- } else if (last_last_lpd_mode > 0) { /* TCX -> TCX20 -> ACELP transition */ +- E_UTIL_residu(A_old, A_old_exp, syn, old_exc_mem, l_div_partial); +- } +- E_UTIL_residu(A_new, A_new_exp, syn + l_div_partial, +- old_exc_mem + l_div_partial, l_div); +- } else { /* prev frame was FD, TCX40 or TCX80 */ +- int exc_A_new_length = (coreCoderFrameLength / 2 > PIT_MAX_MAX + L_INTERPOL) +- ? PIT_MAX_MAX + L_INTERPOL +- : coreCoderFrameLength / 2; +- int exc_A_old_length = PIT_MAX_MAX + L_INTERPOL - exc_A_new_length; +- E_UTIL_residu(A_old, A_old_exp, syn, old_exc_mem, exc_A_old_length); +- E_UTIL_residu(A_new, A_new_exp, &syn[exc_A_old_length], +- &old_exc_mem[exc_A_old_length], exc_A_new_length); +- } +- C_ALLOC_SCRATCH_END(synth_buf, FIXP_DBL, +- PIT_MAX_MAX + L_INTERPOL + M_LP_FILTER_ORDER); +- +- return; +-} +- +-FIXP_DBL *CLpd_ACELP_GetFreeExcMem(CAcelpStaticMem *acelp_mem, INT length) { +- FDK_ASSERT(length <= PIT_MAX_MAX + L_INTERPOL); +- return acelp_mem->old_exc_mem; +-} +- +-INT CLpd_AcelpRead(HANDLE_FDK_BITSTREAM hBs, CAcelpChannelData *acelp, +- INT acelp_core_mode, INT coreCoderFrameLength, +- INT i_offset) { +- int nb_subfr = coreCoderFrameLength / L_DIV; +- const UCHAR *num_acb_index_bits = +- (nb_subfr == 4) ? num_acb_idx_bits_table[0] : num_acb_idx_bits_table[1]; +- int nbits; +- int error = 0; +- +- const int PIT_MIN = PIT_MIN_12k8 + i_offset; +- const int PIT_FR2 = PIT_FR2_12k8 - i_offset; +- const int PIT_FR1 = PIT_FR1_12k8; +- const int PIT_MAX = PIT_MAX_12k8 + (6 * i_offset); +- int T0, T0_frac, T0_min = 0, T0_max; +- +- if (PIT_MAX > PIT_MAX_MAX) { +- error = AAC_DEC_DECODE_FRAME_ERROR; +- goto bail; +- } +- +- acelp->acelp_core_mode = acelp_core_mode; +- +- nbits = MapCoreMode2NBits(acelp_core_mode); +- +- /* decode mean energy with 2 bits : 18, 30, 42 or 54 dB */ +- acelp->mean_energy = FDKreadBits(hBs, 2); +- +- for (int sfr = 0; sfr < nb_subfr; sfr++) { +- /* read ACB index and store T0 and T0_frac for each ACELP subframe. */ +- error = DecodePitchLag(hBs, num_acb_index_bits[sfr], PIT_MIN, PIT_FR2, +- PIT_FR1, PIT_MAX, &T0, &T0_frac, &T0_min, &T0_max); +- if (error) { +- goto bail; +- } +- acelp->T0[sfr] = (USHORT)T0; +- acelp->T0_frac[sfr] = (UCHAR)T0_frac; +- acelp->ltp_filtering_flag[sfr] = FDKreadBits(hBs, 1); +- switch (nbits) { +- case 12: /* 12 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 1); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 1); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5); +- break; +- case 16: /* 16 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 1); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5); +- break; +- case 20: /* 20 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5); +- break; +- case 28: /* 28 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 5); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 5); +- break; +- case 36: /* 36 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 9); +- break; +- case 44: /* 44 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 13); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 13); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 9); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 9); +- break; +- case 52: /* 52 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 13); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 13); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 13); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 13); +- break; +- case 64: /* 64 bits AMR-WB codebook is used */ +- acelp->icb_index[sfr][0] = FDKreadBits(hBs, 2); +- acelp->icb_index[sfr][1] = FDKreadBits(hBs, 2); +- acelp->icb_index[sfr][2] = FDKreadBits(hBs, 2); +- acelp->icb_index[sfr][3] = FDKreadBits(hBs, 2); +- acelp->icb_index[sfr][4] = FDKreadBits(hBs, 14); +- acelp->icb_index[sfr][5] = FDKreadBits(hBs, 14); +- acelp->icb_index[sfr][6] = FDKreadBits(hBs, 14); +- acelp->icb_index[sfr][7] = FDKreadBits(hBs, 14); +- break; +- default: +- FDK_ASSERT(0); +- break; +- } +- acelp->gains[sfr] = FDKreadBits(hBs, 7); +- } +- +-bail: +- return error; +-} +diff --git a/libAACdec/src/usacdec_acelp.h b/libAACdec/src/usacdec_acelp.h +deleted file mode 100644 +index 9de41ff..0000000 +--- a/libAACdec/src/usacdec_acelp.h ++++ /dev/null +@@ -1,281 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand +- +- Description: USAC ACELP frame decoder +- +-*******************************************************************************/ +- +-#ifndef USACDEC_ACELP_H +-#define USACDEC_ACELP_H +- +-#include "common_fix.h" +-#include "FDK_bitstream.h" +-#include "usacdec_const.h" +-#include "usacdec_rom.h" +- +-//#define ENHANCED_TCX_TD_CONCEAL_ENABLE +- +-/** Structure which holds the ACELP internal persistent memory */ +-typedef struct { +- FIXP_DBL old_exc_mem[PIT_MAX_MAX + L_INTERPOL]; +- FIXP_DBL old_syn_mem[M_LP_FILTER_ORDER]; /* synthesis filter states */ +- FIXP_SGL A[M_LP_FILTER_ORDER]; +- INT A_exp; +- FIXP_DBL gc_threshold; +- FIXP_DBL de_emph_mem; +- FIXP_SGL past_gpit; +- FIXP_DBL past_gcode; +- USHORT old_T0; +- UCHAR old_T0_frac; +- FIXP_DBL deemph_mem_wsyn; +- FIXP_DBL wsyn_rms; +- SHORT seed_ace; +-} CAcelpStaticMem; +- +-/** Structure which holds the parameter data needed to decode one ACELP frame. +- */ +-typedef struct { +- UCHAR +- acelp_core_mode; /**< mean excitation energy index for whole ACELP frame +- */ +- UCHAR mean_energy; /**< acelp core mode for whole ACELP frame */ +- USHORT T0[NB_SUBFR]; +- UCHAR T0_frac[NB_SUBFR]; +- UCHAR ltp_filtering_flag[NB_SUBFR]; /**< controlls whether LTP postfilter is +- active for each ACELP subframe */ +- SHORT icb_index[NB_SUBFR] +- [8]; /**< innovative codebook index for each ACELP subframe */ +- UCHAR gains[NB_SUBFR]; /**< gain index for each ACELP subframe */ +-} CAcelpChannelData; +- +-/** +- * \brief Read the acelp_coding() bitstream part. +- * \param[in] hBs bitstream handle to read data from. +- * \param[out] acelpData pointer to structure to store the parsed data of one +- * ACELP frame. +- * \param[in] acelp_core_mode the ACELP core mode index. +- * \param[in] coreCoderFrameLength length of core coder frame (1024|768) +- */ +-INT CLpd_AcelpRead(HANDLE_FDK_BITSTREAM hBs, CAcelpChannelData *acelpData, +- INT acelp_core_mode, INT i_offset, INT coreCoderFrameLength); +-/** +- * \brief Initialization of memory before one LPD frame is decoded +- * \param[out] synth_buf synthesis buffer to be initialized, exponent = SF_SYNTH +- * \param[in] old_synth past synthesis of previous LPD frame, exponent = +- * SF_SYNTH +- * \param[out] synth_buf_fb fullband synthesis buffer to be initialized, +- * exponent = SF_SYNTH +- * \param[in] old_synth_fb past fullband synthesis of previous LPD frame, +- * exponent = SF_SYNTH +- * \param[out] pitch vector where decoded pitch lag values are stored +- * \param[in] old_T_pf past pitch lag values of previous LPD frame +- * \param[in] samplingRate sampling rate for pitch lag offset calculation +- * \param[out] i_offset pitch lag offset for the decoding of the pitch lag +- * \param[in] coreCoderFrameLength length of core coder frame (1024|768) +- */ +-void Acelp_PreProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch, +- INT *old_T_pf, FIXP_DBL *pit_gain, +- FIXP_DBL *old_gain_pf, INT samplingRate, INT *i_offset, +- INT coreCoderFrameLength, INT synSfd, +- INT nbSubfrSuperfr); +- +-/** +- * \brief Save tail of buffers for the initialization of the next LPD frame +- * \param[in] synth_buf synthesis of current LPD frame, exponent = SF_SYNTH +- * \param[out] old_synth memory where tail of fullband synth_buf is stored, +- * exponent = SF_SYNTH +- * \param[in] synth_buf_fb fullband synthesis of current LPD frame, exponent = +- * SF_SYNTH +- * \param[out] old_synth_fb memory where tail of fullband synth_buf is stored, +- * exponent = SF_SYNTH +- * \param[in] pitch decoded pitch lag values of current LPD frame +- * \param[out] old_T_pf memory where last SYN_SFD pitch lag values are stored +- */ +-void Acelp_PostProcessing(FIXP_DBL *synth_buf, FIXP_DBL *old_synth, INT *pitch, +- INT *old_T_pf, INT coreCoderFrameLength, INT synSfd, +- INT nbSubfrSuperfr); +- +-/** +- * \brief Decode one ACELP frame (three or four ACELP subframes with 64 samples +- * each) +- * \param[in,out] acelp_mem pointer to ACELP memory structure +- * \param[in] i_offset pitch lag offset +- * \param[in] lsp_old LPC filter in LSP domain corresponding to previous frame +- * \param[in] lsp_new LPC filter in LSP domain corresponding to current frame +- * \param[in] stab_fac stability factor constrained by 0<=stab_fac<=1.0, +- * exponent = SF_STAB +- * \param[in] acelpData pointer to struct with data which is needed for decoding +- * one ACELP frame +- * \param[out] synth ACELP output signal +- * \param[out] pT four decoded pitch lag values +- * \param[in] coreCoderFrameLength length of core coder frame (1024|768) +- */ +-void CLpd_AcelpDecode(CAcelpStaticMem *acelp_mem, INT i_offset, +- const FIXP_LPC lsp_old[M_LP_FILTER_ORDER], +- const FIXP_LPC lsp_new[M_LP_FILTER_ORDER], +- FIXP_SGL stab_fac, CAcelpChannelData *acelpData, +- INT numLostSubframes, int lastLpcLost, int frameCnt, +- FIXP_DBL synth[], int pT[], FIXP_DBL *pit_gain, +- INT coreCoderFrameLength); +- +-/** +- * \brief Reset ACELP internal memory. +- * \param[out] acelp_mem pointer to ACELP memory structure +- */ +-void CLpd_AcelpReset(CAcelpStaticMem *acelp_mem); +- +-/** +- * \brief Initialize ACELP internal memory in case of FAC before ACELP decoder +- * is called +- * \param[in] synth points to end+1 of past valid synthesis signal, exponent = +- * SF_SYNTH +- * \param[in] last_lpd_mode last lpd mode +- * \param[in] last_last_lpd_mode lpd mode before last_lpd_mode +- * \param[in] A_new LP synthesis filter coeffs corresponding to last frame, +- * exponent = SF_A_COEFFS +- * \param[in] A_old LP synthesis filter coeffs corresponding to the frame before +- * last frame, exponent = SF_A_COEFFS +- * \param[in,out] acelp_mem pointer to ACELP memory structure +- * \param[in] coreCoderFrameLength length of core coder frame (1024|768) +- */ +-void CLpd_AcelpPrepareInternalMem(const FIXP_DBL *synth, UCHAR last_lpd_mode, +- UCHAR last_last_lpd_mode, +- const FIXP_LPC *A_new, const INT A_new_exp, +- const FIXP_LPC *A_old, const INT A_old_exp, +- CAcelpStaticMem *acelp_mem, +- INT coreCoderFrameLength, INT clearOldExc, +- UCHAR lpd_mode); +- +-/** +- * \brief Calculate zero input response (zir) of the acelp synthesis filter +- * \param[in] A LP synthesis filter coefficients, exponent = SF_A_COEFFS +- * \param[in,out] acelp_mem pointer to ACELP memory structure +- * \param[in] length length of zir +- * \param[out] zir pointer to zir output buffer, exponent = SF_SYNTH +- */ +-void CLpd_Acelp_Zir(const FIXP_LPC A[], const INT A_exp, +- CAcelpStaticMem *acelp_mem, const INT length, +- FIXP_DBL zir[], int doDeemph); +- +-/** +- * \brief Borrow static excitation memory from ACELP decoder +- * \param[in] acelp_mem pointer to ACELP memory structure +- * \param[in] length number of requested FIXP_DBL values +- * \return pointer to requested memory +- * +- * The caller has to take care not to overwrite valid memory areas. +- * During TCX/FAC calculations and before CLpd_AcelpPrepareInternalMem() is +- * called, the following memory size is available: +- * - 256 samples in case of ACELP -> TCX20 -> ACELP transition +- * - PIT_MAX_MAX+L_INTERPOL samples in all other cases +- */ +-FIXP_DBL *CLpd_ACELP_GetFreeExcMem(CAcelpStaticMem *acelp_mem, INT length); +- +-void CLpd_TcxTDConceal(CAcelpStaticMem *acelp_mem, SHORT *pitch, +- const FIXP_LPC lsp_old[M_LP_FILTER_ORDER], +- const FIXP_LPC lsp_new[M_LP_FILTER_ORDER], +- const FIXP_SGL stab_fac, INT numLostSubframes, +- FIXP_DBL synth[], INT coreCoderFrameLength, +- UCHAR last_tcx_noise_factor); +- +-inline SHORT E_UTIL_random(SHORT *seed) { +- *seed = (SHORT)((((LONG)*seed * (LONG)31821) >> 1) + (LONG)13849); +- return (*seed); +-} +- +-#endif /* USACDEC_ACELP_H */ +diff --git a/libAACdec/src/usacdec_const.h b/libAACdec/src/usacdec_const.h +deleted file mode 100644 +index f68e808..0000000 +--- a/libAACdec/src/usacdec_const.h ++++ /dev/null +@@ -1,203 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Manuel Jander +- +- Description: USAC related constants +- +-*******************************************************************************/ +- +-#ifndef USACDEC_CONST_H +-#define USACDEC_CONST_H +- +-/* scale factors */ +-#define SF_CODE 6 /* exponent of code[], fixed codebook vector */ +-#define SF_GAIN_C 16 /* exponent of gain code and smoothed gain code */ +-#define SF_EXC 16 /* exponent of exc[] and exc2[], excitation buffer */ +-#define SF_GAIN_P 1 /* exponent of gain_pit */ +-#define SF_PFAC 0 /* exponent of period/voicing factor */ +-#define SF_SYNTH SF_EXC /* exponent of synthesis buffer */ +-#define SF_A_COEFFS 3 /* exponent of LP domain synthesis filter coefficient */ +-#define SF_STAB 1 /* exponent of stability factor */ +- +-/* definitions which are independent of coreCoderFrameLength */ +-#define M_LP_FILTER_ORDER 16 /* LP filter order */ +-#define LP_FILTER_SCALE 4 /* LP filter scale */ +- +-#define PIT_MIN_12k8 34 /* Minimum pitch lag with resolution 1/4 */ +-#define PIT_MAX_12k8 231 /* Maximum pitch lag for fs=12.8kHz */ +-#define FSCALE_DENOM 12800 /* Frequency scale denominator */ +-#define FAC_FSCALE_MIN \ +- 6000 /* Minimum allowed frequency scale for acelp decoder */ +- +-#if !defined(LPD_MAX_CORE_SR) +-#define LPD_MAX_CORE_SR 24000 /* Default value from ref soft */ +-#endif +-#define FAC_FSCALE_MAX \ +- LPD_MAX_CORE_SR /* Maximum allowed frequency scale for acelp decoder */ +- +-/* Maximum pitch lag (= 411 for fs_max = 24000) */ +-#define PIT_MAX_TMP \ +- (PIT_MAX_12k8 + \ +- (6 * \ +- ((((FAC_FSCALE_MAX * PIT_MIN_12k8) + (FSCALE_DENOM / 2)) / FSCALE_DENOM) - \ +- PIT_MIN_12k8))) +-#if (PIT_MAX_TMP < \ +- 256) /* cannot be smaller because of tcx time domain concealment */ +-#define PIT_MAX_MAX 256 +-#else +-#define PIT_MAX_MAX PIT_MAX_TMP +-#endif +- +-#define NB_DIV 4 /* number of division (20ms) per 80ms frame */ +-#define L_SUBFR 64 /* subframe size (5ms) */ +-#define BPF_SFD 1 /* bass postfilter delay (subframe) */ +-#define BPF_DELAY (BPF_SFD * L_SUBFR) /* bass postfilter delay (samples) */ +- +-#define L_FILT 12 /* Delay of up-sampling filter (bass post-filter) */ +-#define L_EXTRA 96 /* for bass post-filter */ +-#define L_INTERPOL \ +- (16 + 1) /* Length of filter for interpolation (acelp decoder) */ +- +-/* definitions for coreCoderFrameLength = 1024 */ +-#define L_FRAME_PLUS_1024 1024 /* length of one 80ms superframe */ +-#define L_DIV_1024 \ +- (L_FRAME_PLUS_1024 / NB_DIV) /* length of one acelp or tcx20 frame */ +-#define NB_SUBFR_1024 \ +- (L_DIV_1024 / L_SUBFR) /* number of 5ms subframe per division */ +-#define NB_SUBFR_SUPERFR_1024 \ +- (L_FRAME_PLUS_1024 / L_SUBFR) /* number of 5ms subframe per 80ms frame */ +-#define AAC_SFD_1024 (NB_SUBFR_SUPERFR_1024 / 2) /* AAC delay (subframe) */ +-#define AAC_DELAY_1024 (AAC_SFD_1024 * L_SUBFR) /* AAC delay (samples) */ +-#define SYN_SFD_1024 (AAC_SFD_1024 - BPF_SFD) /* synthesis delay (subframe) */ +-#define SYN_DELAY_1024 \ +- (SYN_SFD_1024 * L_SUBFR) /* synthesis delay (samples) \ +- */ +-#define LFAC_1024 (L_DIV_1024 / 2) /* FAC frame length */ +-#define LFAC_SHORT_1024 \ +- (L_DIV_1024 / 4) /* for transitions EIGHT_SHORT FD->LPD and vv. */ +-#define FDNS_NPTS_1024 64 /* FD noise shaping resolution (64=100Hz/point) */ +- +-/* definitions for coreCoderFrameLength = 768 */ +-#define L_FRAME_PLUS_768 768 +-#define L_DIV_768 \ +- (L_FRAME_PLUS_768 / NB_DIV) /* length of one acelp or tcx20 frame */ +-#define NB_SUBFR_768 \ +- (L_DIV_768 / L_SUBFR) /* number of 5ms subframe per division */ +-#define NB_SUBFR_SUPERFR_768 \ +- (L_FRAME_PLUS_768 / L_SUBFR) /* number of 5ms subframe per 80ms frame */ +-#define AAC_SFD_768 (NB_SUBFR_SUPERFR_768 / 2) /* AAC delay (subframe) */ +-#define AAC_DELAY_768 (AAC_SFD_768 * L_SUBFR) /* AAC delay (samples) */ +-#define SYN_SFD_768 (AAC_SFD_768 - BPF_SFD) /* synthesis delay (subframe) */ +-#define SYN_DELAY_768 (SYN_SFD_768 * L_SUBFR) /* synthesis delay (samples) */ +-#define LFAC_768 (L_DIV_768 / 2) /* FAC frame length */ +-#define LFAC_SHORT_768 \ +- (L_DIV_768 / 4) /* for transitions EIGHT_SHORT FD->LPD and vv. */ +- +-/* maximum (used for memory allocation) */ +-#define L_FRAME_PLUS L_FRAME_PLUS_1024 +-#define L_DIV L_DIV_1024 +-#define NB_SUBFR NB_SUBFR_1024 +-#define NB_SUBFR_SUPERFR NB_SUBFR_SUPERFR_1024 +-#define AAC_SFD AAC_SFD_1024 +-#define AAC_DELAY AAC_DELAY_1024 +-#define SYN_SFD SYN_SFD_1024 +-#define SYN_DELAY SYN_DELAY_1024 +-#define LFAC LFAC_1024 +-#define LFAC_SHORT LFAC_SHORT_1024 +-#define FDNS_NPTS FDNS_NPTS_1024 +- +-#endif /* USACDEC_CONST_H */ +diff --git a/libAACdec/src/usacdec_fac.cpp b/libAACdec/src/usacdec_fac.cpp +deleted file mode 100644 +index 0d3d844..0000000 +--- a/libAACdec/src/usacdec_fac.cpp ++++ /dev/null +@@ -1,745 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Manuel Jander +- +- Description: USAC FAC +- +-*******************************************************************************/ +- +-#include "usacdec_fac.h" +- +-#include "usacdec_const.h" +-#include "usacdec_lpc.h" +-#include "usacdec_acelp.h" +-#include "usacdec_rom.h" +-#include "dct.h" +-#include "FDK_tools_rom.h" +-#include "mdct.h" +- +-#define SPEC_FAC(ptr, i, gl) ((ptr) + ((i) * (gl))) +- +-FIXP_DBL *CLpd_FAC_GetMemory(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- UCHAR mod[NB_DIV], int *pState) { +- FIXP_DBL *ptr; +- int i; +- int k = 0; +- int max_windows = 8; +- +- FDK_ASSERT(*pState >= 0 && *pState < max_windows); +- +- /* Look for free space to store FAC data. 2 FAC data blocks fit into each TCX +- * spectral data block. */ +- for (i = *pState; i < max_windows; i++) { +- if (mod[i >> 1] == 0) { +- break; +- } +- } +- +- *pState = i + 1; +- +- if (i == max_windows) { +- ptr = pAacDecoderChannelInfo->data.usac.fac_data0; +- } else { +- FDK_ASSERT(mod[(i >> 1)] == 0); +- ptr = SPEC_FAC(pAacDecoderChannelInfo->pSpectralCoefficient, i, +- pAacDecoderChannelInfo->granuleLength << k); +- } +- +- return ptr; +-} +- +-int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, SCHAR *pFacScale, +- int length, int use_gain, int frame) { +- FIXP_DBL fac_gain; +- int fac_gain_e = 0; +- +- if (use_gain) { +- CLpd_DecodeGain(&fac_gain, &fac_gain_e, FDKreadBits(hBs, 7)); +- } +- +- if (CLpc_DecodeAVQ(hBs, pFac, 1, 1, length) != 0) { +- return -1; +- } +- +- { +- int scale; +- +- scale = getScalefactor(pFac, length); +- scaleValues(pFac, length, scale); +- pFacScale[frame] = DFRACT_BITS - 1 - scale; +- } +- +- if (use_gain) { +- int i; +- +- pFacScale[frame] += fac_gain_e; +- +- for (i = 0; i < length; i++) { +- pFac[i] = fMult(pFac[i], fac_gain); +- } +- } +- return 0; +-} +- +-/** +- * \brief Apply synthesis filter with zero input to x. The overall filter gain +- * is 1.0. +- * \param a LPC filter coefficients. +- * \param length length of the input/output data vector x. +- * \param x input/output vector, where the synthesis filter is applied in place. +- */ +-static void Syn_filt_zero(const FIXP_LPC a[], const INT a_exp, INT length, +- FIXP_DBL x[]) { +- int i, j; +- FIXP_DBL L_tmp; +- +- for (i = 0; i < length; i++) { +- L_tmp = (FIXP_DBL)0; +- +- for (j = 0; j < fMin(i, M_LP_FILTER_ORDER); j++) { +- L_tmp -= fMultDiv2(a[j], x[i - (j + 1)]) >> (LP_FILTER_SCALE - 1); +- } +- +- L_tmp = scaleValue(L_tmp, a_exp + LP_FILTER_SCALE); +- x[i] = fAddSaturate(x[i], L_tmp); +- } +-} +- +-/* Table is also correct for coreCoderFrameLength = 768. Factor 3/4 is canceled +- out: gainFac = 0.5 * sqrt(fac_length/lFrame) +-*/ +-static const FIXP_DBL gainFac[4] = {0x40000000, 0x2d413ccd, 0x20000000, +- 0x16a09e66}; +- +-void CFac_ApplyGains(FIXP_DBL fac_data[LFAC], const INT fac_length, +- const FIXP_DBL tcx_gain, const FIXP_DBL alfd_gains[], +- const INT mod) { +- FIXP_DBL facFactor; +- int i; +- +- FDK_ASSERT((fac_length == 128) || (fac_length == 96)); +- +- /* 2) Apply gain factor to FAC data */ +- facFactor = fMult(gainFac[mod], tcx_gain); +- for (i = 0; i < fac_length; i++) { +- fac_data[i] = fMult(fac_data[i], facFactor); +- } +- +- /* 3) Apply spectrum deshaping using alfd_gains */ +- for (i = 0; i < fac_length / 4; i++) { +- int k; +- +- k = i >> (3 - mod); +- fac_data[i] = fMult(fac_data[i], alfd_gains[k]) +- << 1; /* alfd_gains is scaled by one bit. */ +- } +-} +- +-static void CFac_CalcFacSignal(FIXP_DBL *pOut, FIXP_DBL *pFac, +- const int fac_scale, const int fac_length, +- const FIXP_LPC A[M_LP_FILTER_ORDER], +- const INT A_exp, const int fAddZir, +- const int isFdFac) { +- FIXP_LPC wA[M_LP_FILTER_ORDER]; +- FIXP_DBL tf_gain = (FIXP_DBL)0; +- int wlength; +- int scale = fac_scale; +- +- /* obtain tranform gain. */ +- imdct_gain(&tf_gain, &scale, isFdFac ? 0 : fac_length); +- +- /* 4) Compute inverse DCT-IV of FAC data. Output scale of DCT IV is 16 bits. +- */ +- dct_IV(pFac, fac_length, &scale); +- /* dct_IV scale = log2(fac_length). "- 7" is a factor of 2/128 */ +- if (tf_gain != (FIXP_DBL)0) { /* non-radix 2 transform gain */ +- int i; +- +- for (i = 0; i < fac_length; i++) { +- pFac[i] = fMult(tf_gain, pFac[i]); +- } +- } +- scaleValuesSaturate(pOut, pFac, fac_length, +- scale); /* Avoid overflow issues and saturate. */ +- +- E_LPC_a_weight(wA, A, M_LP_FILTER_ORDER); +- +- /* We need the output of the IIR filter to be longer than "fac_length". +- For this reason we run it with zero input appended to the end of the input +- sequence, i.e. we generate its ZIR and extend the output signal.*/ +- FDKmemclear(pOut + fac_length, fac_length * sizeof(FIXP_DBL)); +- wlength = 2 * fac_length; +- +- /* 5) Apply weighted synthesis filter to FAC data, including optional Zir (5. +- * item 4). */ +- Syn_filt_zero(wA, A_exp, wlength, pOut); +-} +- +-INT CLpd_FAC_Mdct2Acelp(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *pFac, +- const int fac_scale, FIXP_LPC *A, INT A_exp, +- INT nrOutSamples, const INT fac_length, +- const INT isFdFac, UCHAR prevWindowShape) { +- FIXP_DBL *pOvl; +- FIXP_DBL *pOut0; +- const FIXP_WTP *pWindow; +- int i, fl, nrSamples = 0; +- +- FDK_ASSERT(fac_length <= 1024 / (4 * 2)); +- +- fl = fac_length * 2; +- +- pWindow = FDKgetWindowSlope(fl, prevWindowShape); +- +- /* Adapt window slope length in case of frame loss. */ +- if (hMdct->prev_fr != fl) { +- int nl = 0; +- imdct_adapt_parameters(hMdct, &fl, &nl, fac_length, pWindow, nrOutSamples); +- FDK_ASSERT(nl == 0); +- } +- +- if (nrSamples < nrOutSamples) { +- pOut0 = output; +- nrSamples += hMdct->ov_offset; +- /* Purge buffered output. */ +- FDKmemcpy(pOut0, hMdct->overlap.time, hMdct->ov_offset * sizeof(pOut0[0])); +- hMdct->ov_offset = 0; +- } +- +- pOvl = hMdct->overlap.freq + hMdct->ov_size - 1; +- +- if (nrSamples >= nrOutSamples) { +- pOut0 = hMdct->overlap.time + hMdct->ov_offset; +- hMdct->ov_offset += hMdct->prev_nr + fl / 2; +- } else { +- pOut0 = output + nrSamples; +- nrSamples += hMdct->prev_nr + fl / 2; +- } +- if (hMdct->prevPrevAliasSymmetry == 0) { +- for (i = 0; i < hMdct->prev_nr; i++) { +- FIXP_DBL x = -(*pOvl--); +- *pOut0 = IMDCT_SCALE_DBL(x); +- pOut0++; +- } +- } else { +- for (i = 0; i < hMdct->prev_nr; i++) { +- FIXP_DBL x = (*pOvl--); +- *pOut0 = IMDCT_SCALE_DBL(x); +- pOut0++; +- } +- } +- hMdct->prev_nr = 0; +- +- { +- if (pFac != NULL) { +- /* Note: The FAC gain might have been applied directly after bit stream +- * parse in this case. */ +- CFac_CalcFacSignal(pOut0, pFac, fac_scale, fac_length, A, A_exp, 0, +- isFdFac); +- } else { +- /* Clear buffer because of the overlap and ADD! */ +- FDKmemclear(pOut0, fac_length * sizeof(FIXP_DBL)); +- } +- } +- +- i = 0; +- +- if (hMdct->prevPrevAliasSymmetry == 0) { +- for (; i < fl / 2; i++) { +- FIXP_DBL x0; +- +- /* Overlap Add */ +- x0 = -fMult(*pOvl--, pWindow[i].v.re); +- +- *pOut0 += IMDCT_SCALE_DBL(x0); +- pOut0++; +- } +- } else { +- for (; i < fl / 2; i++) { +- FIXP_DBL x0; +- +- /* Overlap Add */ +- x0 = fMult(*pOvl--, pWindow[i].v.re); +- +- *pOut0 += IMDCT_SCALE_DBL(x0); +- pOut0++; +- } +- } +- if (hMdct->pFacZir != +- 0) { /* this should only happen for ACELP -> TCX20 -> ACELP transition */ +- FIXP_DBL *pOut = pOut0 - fl / 2; /* fl/2 == fac_length */ +- for (i = 0; i < fl / 2; i++) { +- pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]); +- } +- hMdct->pFacZir = NULL; +- } +- +- hMdct->prev_fr = 0; +- hMdct->prev_nr = 0; +- hMdct->prev_tl = 0; +- hMdct->prevPrevAliasSymmetry = hMdct->prevAliasSymmetry; +- +- return nrSamples; +-} +- +-INT CLpd_FAC_Acelp2Mdct(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *_pSpec, +- const SHORT spec_scale[], const int nSpec, +- FIXP_DBL *pFac, const int fac_scale, +- const INT fac_length, INT noOutSamples, const INT tl, +- const FIXP_WTP *wrs, const INT fr, FIXP_LPC A[16], +- INT A_exp, CAcelpStaticMem *acelp_mem, +- const FIXP_DBL gain, const int last_frame_lost, +- const int isFdFac, const UCHAR last_lpd_mode, +- const int k, int currAliasingSymmetry) { +- FIXP_DBL *pCurr, *pOvl, *pSpec; +- const FIXP_WTP *pWindow; +- const FIXP_WTB *FacWindowZir_conceal; +- UCHAR doFacZirConceal = 0; +- int doDeemph = 1; +- const FIXP_WTB *FacWindowZir, *FacWindowSynth; +- FIXP_DBL *pOut0 = output, *pOut1; +- int w, i, fl, nl, nr, f_len, nrSamples = 0, s = 0, scale, total_gain_e; +- FIXP_DBL *pF, *pFAC_and_FAC_ZIR = NULL; +- FIXP_DBL total_gain = gain; +- +- FDK_ASSERT(fac_length <= 1024 / (4 * 2)); +- switch (fac_length) { +- /* coreCoderFrameLength = 1024 */ +- case 128: +- pWindow = SineWindow256; +- FacWindowZir = FacWindowZir128; +- FacWindowSynth = FacWindowSynth128; +- break; +- case 64: +- pWindow = SineWindow128; +- FacWindowZir = FacWindowZir64; +- FacWindowSynth = FacWindowSynth64; +- break; +- case 32: +- pWindow = SineWindow64; +- FacWindowZir = FacWindowZir32; +- FacWindowSynth = FacWindowSynth32; +- break; +- /* coreCoderFrameLength = 768 */ +- case 96: +- pWindow = SineWindow192; +- FacWindowZir = FacWindowZir96; +- FacWindowSynth = FacWindowSynth96; +- break; +- case 48: +- pWindow = SineWindow96; +- FacWindowZir = FacWindowZir48; +- FacWindowSynth = FacWindowSynth48; +- break; +- default: +- FDK_ASSERT(0); +- return 0; +- } +- +- FacWindowZir_conceal = FacWindowSynth; +- /* Derive NR and NL */ +- fl = fac_length * 2; +- nl = (tl - fl) >> 1; +- nr = (tl - fr) >> 1; +- +- if (noOutSamples > nrSamples) { +- /* Purge buffered output. */ +- FDKmemcpy(pOut0, hMdct->overlap.time, hMdct->ov_offset * sizeof(pOut0[0])); +- nrSamples = hMdct->ov_offset; +- hMdct->ov_offset = 0; +- } +- +- if (nrSamples >= noOutSamples) { +- pOut1 = hMdct->overlap.time + hMdct->ov_offset; +- if (hMdct->ov_offset < fac_length) { +- pOut0 = output + nrSamples; +- } else { +- pOut0 = pOut1; +- } +- hMdct->ov_offset += fac_length + nl; +- } else { +- pOut1 = output + nrSamples; +- pOut0 = output + nrSamples; +- } +- +- { +- pFAC_and_FAC_ZIR = CLpd_ACELP_GetFreeExcMem(acelp_mem, 2 * fac_length); +- { +- const FIXP_DBL *pTmp1, *pTmp2; +- +- doFacZirConceal |= ((last_frame_lost != 0) && (k == 0)); +- doDeemph &= (last_lpd_mode != 4); +- if (doFacZirConceal) { +- /* ACELP contribution in concealment case: +- Use ZIR with a modified ZIR window to preserve some more energy. +- Dont use FAC, which contains wrong information for concealed frame +- Dont use last ACELP samples, but double ZIR, instead (afterwards) */ +- FDKmemclear(pFAC_and_FAC_ZIR, 2 * fac_length * sizeof(FIXP_DBL)); +- FacWindowSynth = (FIXP_WTB *)pFAC_and_FAC_ZIR; +- FacWindowZir = FacWindowZir_conceal; +- } else { +- CFac_CalcFacSignal(pFAC_and_FAC_ZIR, pFac, fac_scale + s, fac_length, A, +- A_exp, 1, isFdFac); +- } +- /* 6) Get windowed past ACELP samples and ACELP ZIR signal */ +- +- /* +- * Get ACELP ZIR (pFac[]) and ACELP past samples (pOut0[]) and add them +- * to the FAC synth signal contribution on pOut1[]. +- */ +- { +- { +- CLpd_Acelp_Zir(A, A_exp, acelp_mem, fac_length, pFac, doDeemph); +- +- pTmp1 = pOut0; +- pTmp2 = pFac; +- } +- +- for (i = 0, w = 0; i < fac_length; i++) { +- FIXP_DBL x; +- /* Div2 is compensated by table scaling */ +- x = fMultDiv2(pTmp2[i], FacWindowZir[w]); +- x += fMultDiv2(pTmp1[-i - 1], FacWindowSynth[w]); +- x += pFAC_and_FAC_ZIR[i]; +- pOut1[i] = x; +- +- w++; +- } +- } +- +- if (doFacZirConceal) { +- /* ZIR is the only ACELP contribution, so double it */ +- scaleValues(pOut1, fac_length, 1); +- } +- } +- } +- +- if (nrSamples < noOutSamples) { +- nrSamples += fac_length + nl; +- } +- +- /* Obtain transform gain */ +- total_gain = gain; +- total_gain_e = 0; +- imdct_gain(&total_gain, &total_gain_e, tl); +- +- /* IMDCT overlap add */ +- scale = total_gain_e; +- pSpec = _pSpec; +- +- /* Note:when comming from an LPD frame (TCX/ACELP) the previous alisaing +- * symmetry must always be 0 */ +- if (currAliasingSymmetry == 0) { +- dct_IV(pSpec, tl, &scale); +- } else { +- FIXP_DBL _tmp[1024 + ALIGNMENT_DEFAULT / sizeof(FIXP_DBL)]; +- FIXP_DBL *tmp = (FIXP_DBL *)ALIGN_PTR(_tmp); +- C_ALLOC_ALIGNED_REGISTER(tmp, sizeof(_tmp)); +- dst_III(pSpec, tmp, tl, &scale); +- C_ALLOC_ALIGNED_UNREGISTER(tmp); +- } +- +- /* Optional scaling of time domain - no yet windowed - of current spectrum */ +- if (total_gain != (FIXP_DBL)0) { +- for (i = 0; i < tl; i++) { +- pSpec[i] = fMult(pSpec[i], total_gain); +- } +- } +- int loc_scale = fixmin_I(spec_scale[0] + scale, (INT)DFRACT_BITS - 1); +- scaleValuesSaturate(pSpec, tl, loc_scale); +- +- pOut1 += fl / 2 - 1; +- pCurr = pSpec + tl - fl / 2; +- +- for (i = 0; i < fl / 2; i++) { +- FIXP_DBL x1; +- +- /* FAC signal is already on pOut1, because of that the += operator. */ +- x1 = fMult(*pCurr++, pWindow[i].v.re); +- FDK_ASSERT((pOut1 >= hMdct->overlap.time && +- pOut1 < hMdct->overlap.time + hMdct->ov_size) || +- (pOut1 >= output && pOut1 < output + 1024)); +- *pOut1 += IMDCT_SCALE_DBL(-x1); +- pOut1--; +- } +- +- /* NL output samples TL/2+FL/2..TL. - current[FL/2..0] */ +- pOut1 += (fl / 2) + 1; +- +- pFAC_and_FAC_ZIR += fac_length; /* set pointer to beginning of FAC ZIR */ +- +- if (nl == 0) { +- /* save pointer to write FAC ZIR data later */ +- hMdct->pFacZir = pFAC_and_FAC_ZIR; +- } else { +- FDK_ASSERT(nl >= fac_length); +- /* FAC ZIR will be added now ... */ +- hMdct->pFacZir = NULL; +- } +- +- pF = pFAC_and_FAC_ZIR; +- f_len = fac_length; +- +- pCurr = pSpec + tl - fl / 2 - 1; +- for (i = 0; i < nl; i++) { +- FIXP_DBL x = -(*pCurr--); +- /* 5) (item 4) Synthesis filter Zir component, FAC ZIR (another one). */ +- if (i < f_len) { +- x += *pF++; +- } +- +- FDK_ASSERT((pOut1 >= hMdct->overlap.time && +- pOut1 < hMdct->overlap.time + hMdct->ov_size) || +- (pOut1 >= output && pOut1 < output + 1024)); +- *pOut1 = IMDCT_SCALE_DBL(x); +- pOut1++; +- } +- +- hMdct->prev_nr = nr; +- hMdct->prev_fr = fr; +- hMdct->prev_wrs = wrs; +- hMdct->prev_tl = tl; +- hMdct->prevPrevAliasSymmetry = hMdct->prevAliasSymmetry; +- hMdct->prevAliasSymmetry = currAliasingSymmetry; +- fl = fr; +- nl = nr; +- +- pOvl = pSpec + tl / 2 - 1; +- pOut0 = pOut1; +- +- for (w = 1; w < nSpec; w++) /* for ACELP -> FD short */ +- { +- const FIXP_WTP *pWindow_prev; +- +- /* Setup window pointers */ +- pWindow_prev = hMdct->prev_wrs; +- +- /* Current spectrum */ +- pSpec = _pSpec + w * tl; +- +- scale = total_gain_e; +- +- /* For the second, third, etc. short frames the alisaing symmetry is equal, +- * either (0,0) or (1,1) */ +- if (currAliasingSymmetry == 0) { +- /* DCT IV of current spectrum */ +- dct_IV(pSpec, tl, &scale); +- } else { +- dst_IV(pSpec, tl, &scale); +- } +- +- /* Optional scaling of time domain - no yet windowed - of current spectrum +- */ +- /* and de-scale current spectrum signal (time domain, no yet windowed) */ +- if (total_gain != (FIXP_DBL)0) { +- for (i = 0; i < tl; i++) { +- pSpec[i] = fMult(pSpec[i], total_gain); +- } +- } +- loc_scale = fixmin_I(spec_scale[w] + scale, (INT)DFRACT_BITS - 1); +- scaleValuesSaturate(pSpec, tl, loc_scale); +- +- if (noOutSamples <= nrSamples) { +- /* Divert output first half to overlap buffer if we already got enough +- * output samples. */ +- pOut0 = hMdct->overlap.time + hMdct->ov_offset; +- hMdct->ov_offset += hMdct->prev_nr + fl / 2; +- } else { +- /* Account output samples */ +- nrSamples += hMdct->prev_nr + fl / 2; +- } +- +- /* NR output samples 0 .. NR. -overlap[TL/2..TL/2-NR] */ +- for (i = 0; i < hMdct->prev_nr; i++) { +- FIXP_DBL x = -(*pOvl--); +- *pOut0 = IMDCT_SCALE_DBL(x); +- pOut0++; +- } +- +- if (noOutSamples <= nrSamples) { +- /* Divert output second half to overlap buffer if we already got enough +- * output samples. */ +- pOut1 = hMdct->overlap.time + hMdct->ov_offset + fl / 2 - 1; +- hMdct->ov_offset += fl / 2 + nl; +- } else { +- pOut1 = pOut0 + (fl - 1); +- nrSamples += fl / 2 + nl; +- } +- +- /* output samples before window crossing point NR .. TL/2. +- * -overlap[TL/2-NR..TL/2-NR-FL/2] + current[NR..TL/2] */ +- /* output samples after window crossing point TL/2 .. TL/2+FL/2. +- * -overlap[0..FL/2] - current[TL/2..FL/2] */ +- pCurr = pSpec + tl - fl / 2; +- if (currAliasingSymmetry == 0) { +- for (i = 0; i < fl / 2; i++) { +- FIXP_DBL x0, x1; +- +- cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); +- *pOut0 = IMDCT_SCALE_DBL(x0); +- *pOut1 = IMDCT_SCALE_DBL(-x1); +- pOut0++; +- pOut1--; +- } +- } else { +- if (hMdct->prevPrevAliasSymmetry == 0) { +- /* Jump DST II -> DST IV for the second window */ +- for (i = 0; i < fl / 2; i++) { +- FIXP_DBL x0, x1; +- +- cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); +- *pOut0 = IMDCT_SCALE_DBL(x0); +- *pOut1 = IMDCT_SCALE_DBL(x1); +- pOut0++; +- pOut1--; +- } +- } else { +- /* Jump DST IV -> DST IV from the second window on */ +- for (i = 0; i < fl / 2; i++) { +- FIXP_DBL x0, x1; +- +- cplxMult(&x1, &x0, *pCurr++, *pOvl--, pWindow_prev[i]); +- *pOut0 = IMDCT_SCALE_DBL(x0); +- *pOut1 = IMDCT_SCALE_DBL(x1); +- pOut0++; +- pOut1--; +- } +- } +- } +- +- if (hMdct->pFacZir != 0) { +- /* add FAC ZIR of previous ACELP -> mdct transition */ +- FIXP_DBL *pOut = pOut0 - fl / 2; +- FDK_ASSERT(fl / 2 <= 128); +- for (i = 0; i < fl / 2; i++) { +- pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]); +- } +- hMdct->pFacZir = NULL; +- } +- pOut0 += (fl / 2); +- +- /* NL output samples TL/2+FL/2..TL. - current[FL/2..0] */ +- pOut1 += (fl / 2) + 1; +- pCurr = pSpec + tl - fl / 2 - 1; +- for (i = 0; i < nl; i++) { +- FIXP_DBL x = -(*pCurr--); +- *pOut1 = IMDCT_SCALE_DBL(x); +- pOut1++; +- } +- +- /* Set overlap source pointer for next window pOvl = pSpec + tl/2 - 1; */ +- pOvl = pSpec + tl / 2 - 1; +- +- /* Previous window values. */ +- hMdct->prev_nr = nr; +- hMdct->prev_fr = fr; +- hMdct->prev_tl = tl; +- hMdct->prev_wrs = pWindow_prev; +- hMdct->prevPrevAliasSymmetry = hMdct->prevAliasSymmetry; +- hMdct->prevAliasSymmetry = currAliasingSymmetry; +- } +- +- /* Save overlap */ +- +- pOvl = hMdct->overlap.freq + hMdct->ov_size - tl / 2; +- FDK_ASSERT(pOvl >= hMdct->overlap.time + hMdct->ov_offset); +- FDK_ASSERT(tl / 2 <= hMdct->ov_size); +- for (i = 0; i < tl / 2; i++) { +- pOvl[i] = _pSpec[i + (w - 1) * tl]; +- } +- +- return nrSamples; +-} +diff --git a/libAACdec/src/usacdec_fac.h b/libAACdec/src/usacdec_fac.h +deleted file mode 100644 +index 100a6fa..0000000 +--- a/libAACdec/src/usacdec_fac.h ++++ /dev/null +@@ -1,191 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Manuel Jander +- +- Description: USAC FAC +- +-*******************************************************************************/ +- +-#ifndef USACDEC_FAC_H +-#define USACDEC_FAC_H +- +-#include "channelinfo.h" +-#include "FDK_bitstream.h" +- +-/** +- * \brief Get the address of a memory area of the spectral data memory were the +- * FAC data can be stored into. +- * \param spec SPECTRAL_PTR pointing to the current spectral data. +- * \param mod the current LPD mod array. +- * \param pState pointer to a private state variable which must be 0 for the +- * first call and not changed externally. +- * \param isFullbandLPD is 1 if fullband LPD mode is on, otherwise it is 0. +- */ +-FIXP_DBL *CLpd_FAC_GetMemory(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- UCHAR mod[NB_SUBFR], int *pState); +- +-/** +- * \brief read a fac bitstream data block. +- * \param hBs a bit stream handle, where the fac bitstream data is located. +- * \param pFac pointer to were the FAC data will be stored into. +- * \param pFacScale pointer to were the FAC data scale value will be stored +- * into. +- * \param tcx_gain value to be used as FAC gain. If zero, read fac_gain from +- * bitstream. +- * \param tcx_gain_e exponen value of tcx_gain. +- * \param frame the subframe to be considered from the current superframe. +- * Always 0 for FD case. +- * \return 0 on success, -1 on error. +- */ +-int CLpd_FAC_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pFac, SCHAR *pFacScale, +- int length, int use_gain, int frame); +- +-/** +- * \brief Apply TCX and ALFD gains to FAC data. +- * \param fac_data pointer to FAC data. +- * \param fac_length FAC length (128 or 96). +- * \param tcx_gain TCX gain +- * \param alfd_gains pointer to alfd gains. +- * \param mod mod value (1,2,3) of TCX frame where the FAC signal needs to be +- * applied. +- */ +-void CFac_ApplyGains(FIXP_DBL fac_data[LFAC], const INT fac_length, +- const FIXP_DBL tcx_gain, const FIXP_DBL alfd_gains[], +- const INT mod); +- +-/** +- * \brief Do FAC transition from frequency domain to ACELP domain. +- */ +-INT CLpd_FAC_Mdct2Acelp(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *pFac_data, +- const int fac_data_e, FIXP_LPC *A, INT A_exp, +- INT nrOutSamples, const INT fac_length, +- const INT isFdFac, UCHAR prevWindowShape); +- +-/** +- * \brief Do FAC transition from ACELP domain to frequency domain. +- * \param hMdct MDCT context. +- * \param output pointer for time domain output. +- * \param pSpec pointer to MDCT spectrum input. +- * \param spec_scale MDCT spectrum exponents. +- * \param nSpec amount of contiguos MDCT spectra. +- * \param pFac pointer to FAC MDCT domain data. +- * \param fac_scale exponent of FAC data. +- * \param fac_length length of FAC data. +- * \param nrSamples room in samples in output buffer. +- * \param tl MDCT transform length of pSpec. +- * \param wrs right MDCT window slope. +- * \param fr right MDCT window slope length. +- * \param A LP domain filter coefficients. +- * \param deemph_mem deemphasis filter state. +- * \param gain gain to be applied to FAC data before overlap add. +- * \param old_syn_mem Synthesis filter state. +- * \param isFdFac indicates fac processing from or to FD. +- * \param pFacData fac data stored for fullband LPD. +- * \param elFlags element specific parser guidance flags. +- * \param isFacForFullband indicates that fac is processed for fullband LPD. +- */ +-INT CLpd_FAC_Acelp2Mdct(H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *pSpec, +- const SHORT spec_scale[], const int nSpec, +- FIXP_DBL *pFac_data, const int fac_data_e, +- const INT fac_length, INT nrSamples, const INT tl, +- const FIXP_WTP *wrs, const INT fr, FIXP_LPC A[16], +- INT A_exp, CAcelpStaticMem *acelp_mem, +- const FIXP_DBL gain, const int last_frame_lost, +- const int isFdFac, const UCHAR last_lpd, const int k, +- int currAliasingSymmetry); +- +-#endif /* USACDEC_FAC_H */ +diff --git a/libAACdec/src/usacdec_lpc.cpp b/libAACdec/src/usacdec_lpc.cpp +deleted file mode 100644 +index 271463f..0000000 +--- a/libAACdec/src/usacdec_lpc.cpp ++++ /dev/null +@@ -1,1194 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand, Manuel Jander +- +- Description: USAC LPC/AVQ decode +- +-*******************************************************************************/ +- +-#include "usacdec_lpc.h" +- +-#include "usacdec_rom.h" +-#include "FDK_trigFcts.h" +- +-#define NQ_MAX 36 +- +-/* +- * Helper functions. +- */ +- +-/** +- * \brief Read unary code. +- * \param hBs bitstream handle as data source. +- * \return decoded value. +- */ +-static int get_vlclbf(HANDLE_FDK_BITSTREAM hBs) { +- int result = 0; +- +- while (FDKreadBits(hBs, 1) && result <= NQ_MAX) { +- result++; +- } +- return result; +-} +- +-/** +- * \brief Read bit count limited unary code. +- * \param hBs bitstream handle as data source +- * \param n max amount of bits to be read. +- * \return decoded value. +- */ +-static int get_vlclbf_n(HANDLE_FDK_BITSTREAM hBs, int n) { +- int result = 0; +- +- while (FDKreadBits(hBs, 1)) { +- result++; +- n--; +- if (n <= 0) { +- break; +- } +- } +- +- return result; +-} +- +-/* +- * Algebraic Vector Quantizer +- */ +- +-/* ZF_SCALE must be greater than (number of FIXP_ZF)/2 +- because the loss of precision caused by fPow2Div2 in RE8_PPV() */ +-//#define ZF_SCALE ((NQ_MAX-3)>>1) +-#define ZF_SCALE ((DFRACT_BITS / 2)) +-#define FIXP_ZF FIXP_DBL +-#define INT2ZF(x, s) (FIXP_ZF)((x) << (ZF_SCALE - (s))) +-#define ZF2INT(x) (INT)((x) >> ZF_SCALE) +- +-/* 1.0 in ZF format format */ +-#define ONEZF ((FIXP_ZF)INT2ZF(1, 0)) +- +-/* static */ +-void nearest_neighbor_2D8(FIXP_ZF x[8], int y[8]) { +- FIXP_ZF s, em, e[8]; +- int i, j, sum; +- +- /* round x into 2Z^8 i.e. compute y=(y1,...,y8) such that yi = 2[xi/2] +- where [.] is the nearest integer operator +- in the mean time, compute sum = y1+...+y8 +- */ +- sum = 0; +- for (i = 0; i < 8; i++) { +- FIXP_ZF tmp; +- /* round to ..., -2, 0, 2, ... ([-1..1[ --> 0) */ +- if (x[i] < (FIXP_ZF)0) { +- tmp = ONEZF - x[i]; +- y[i] = -2 * ((ZF2INT(tmp)) >> 1); +- } else { +- tmp = ONEZF + x[i]; +- y[i] = 2 * ((ZF2INT(tmp)) >> 1); +- } +- sum += y[i]; +- } +- /* check if y1+...+y8 is a multiple of 4 +- if not, y is not round xj in the wrong way where j is defined by +- j = arg max_i | xi -yi| +- (this is called the Wagner rule) +- */ +- if (sum % 4) { +- /* find j = arg max_i | xi -yi| */ +- em = (FIXP_SGL)0; +- j = 0; +- for (i = 0; i < 8; i++) { +- /* compute ei = xi-yi */ +- e[i] = x[i] - INT2ZF(y[i], 0); +- } +- for (i = 0; i < 8; i++) { +- /* compute |ei| = | xi-yi | */ +- if (e[i] < (FIXP_ZF)0) { +- s = -e[i]; +- } else { +- s = e[i]; +- } +- /* check if |ei| is maximal, if so, set j=i */ +- if (em < s) { +- em = s; +- j = i; +- } +- } +- /* round xj in the "wrong way" */ +- if (e[j] < (FIXP_ZF)0) { +- y[j] -= 2; +- } else { +- y[j] += 2; +- } +- } +-} +- +-/*-------------------------------------------------------------- +- RE8_PPV(x,y) +- NEAREST NEIGHBOR SEARCH IN INFINITE LATTICE RE8 +- the algorithm is based on the definition of RE8 as +- RE8 = (2D8) U (2D8+[1,1,1,1,1,1,1,1]) +- it applies the coset decoding of Sloane and Conway +- (i) x: point in R^8 in 32-ZF_SCALE.ZF_SCALE format +- (o) y: point in RE8 (8-dimensional integer vector) +- -------------------------------------------------------------- +-*/ +-/* static */ +-void RE8_PPV(FIXP_ZF x[], SHORT y[], int r) { +- int i, y0[8], y1[8]; +- FIXP_ZF x1[8], tmp; +- FIXP_DBL e; +- +- /* find the nearest neighbor y0 of x in 2D8 */ +- nearest_neighbor_2D8(x, y0); +- /* find the nearest neighbor y1 of x in 2D8+(1,...,1) (by coset decoding) */ +- for (i = 0; i < 8; i++) { +- x1[i] = x[i] - ONEZF; +- } +- nearest_neighbor_2D8(x1, y1); +- for (i = 0; i < 8; i++) { +- y1[i] += 1; +- } +- +- /* compute e0=||x-y0||^2 and e1=||x-y1||^2 */ +- e = (FIXP_DBL)0; +- for (i = 0; i < 8; i++) { +- tmp = x[i] - INT2ZF(y0[i], 0); +- e += fPow2Div2( +- tmp << r); /* shift left to ensure that no fract part bits get lost. */ +- tmp = x[i] - INT2ZF(y1[i], 0); +- e -= fPow2Div2(tmp << r); +- } +- /* select best candidate y0 or y1 to minimize distortion */ +- if (e < (FIXP_DBL)0) { +- for (i = 0; i < 8; i++) { +- y[i] = y0[i]; +- } +- } else { +- for (i = 0; i < 8; i++) { +- y[i] = y1[i]; +- } +- } +-} +- +-/* table look-up of unsigned value: find i where index >= table[i] +- Note: range must be >= 2, index must be >= table[0] */ +-static int table_lookup(const USHORT *table, unsigned int index, int range) { +- int i; +- +- for (i = 4; i < range; i += 4) { +- if (index < table[i]) { +- break; +- } +- } +- if (i > range) { +- i = range; +- } +- +- if (index < table[i - 2]) { +- i -= 2; +- } +- if (index < table[i - 1]) { +- i--; +- } +- i--; +- +- return (i); /* index >= table[i] */ +-} +- +-/*-------------------------------------------------------------------------- +- re8_decode_rank_of_permutation(rank, xs, x) +- DECODING OF THE RANK OF THE PERMUTATION OF xs +- (i) rank: index (rank) of a permutation +- (i) xs: signed leader in RE8 (8-dimensional integer vector) +- (o) x: point in RE8 (8-dimensional integer vector) +- -------------------------------------------------------------------------- +- */ +-static void re8_decode_rank_of_permutation(int rank, int *xs, SHORT x[8]) { +- INT a[8], w[8], B, fac, fac_B, target; +- int i, j; +- +- /* --- pre-processing based on the signed leader xs --- +- - compute the alphabet a=[a[0] ... a[q-1]] of x (q elements) +- such that a[0]!=...!=a[q-1] +- it is assumed that xs is sorted in the form of a signed leader +- which can be summarized in 2 requirements: +- a) |xs[0]| >= |xs[1]| >= |xs[2]| >= ... >= |xs[7]| +- b) if |xs[i]|=|xs[i-1]|, xs[i]>=xs[i+1] +- where |.| indicates the absolute value operator +- - compute q (the number of symbols in the alphabet) +- - compute w[0..q-1] where w[j] counts the number of occurences of +- the symbol a[j] in xs +- - compute B = prod_j=0..q-1 (w[j]!) where .! is the factorial */ +- /* xs[i], xs[i-1] and ptr_w/a*/ +- j = 0; +- w[j] = 1; +- a[j] = xs[0]; +- B = 1; +- for (i = 1; i < 8; i++) { +- if (xs[i] != xs[i - 1]) { +- j++; +- w[j] = 1; +- a[j] = xs[i]; +- } else { +- w[j]++; +- B *= w[j]; +- } +- } +- +- /* --- actual rank decoding --- +- the rank of x (where x is a permutation of xs) is based on +- Schalkwijk's formula +- it is given by rank=sum_{k=0..7} (A_k * fac_k/B_k) +- the decoding of this rank is sequential and reconstructs x[0..7] +- element by element from x[0] to x[7] +- [the tricky part is the inference of A_k for each k...] +- */ +- +- if (w[0] == 8) { +- for (i = 0; i < 8; i++) { +- x[i] = a[0]; /* avoid fac of 40320 */ +- } +- } else { +- target = rank * B; +- fac_B = 1; +- /* decode x element by element */ +- for (i = 0; i < 8; i++) { +- fac = fac_B * fdk_dec_tab_factorial[i]; /* fac = 1..5040 */ +- j = -1; +- do { +- target -= w[++j] * fac; +- } while (target >= 0); /* max of 30 tests / SV */ +- x[i] = a[j]; +- /* update rank, denominator B (B_k) and counter w[j] */ +- target += w[j] * fac; /* target = fac_B*B*rank */ +- fac_B *= w[j]; +- w[j]--; +- } +- } +-} +- +-/*-------------------------------------------------------------------------- +- re8_decode_base_index(n, I, y) +- DECODING OF AN INDEX IN Qn (n=0,2,3 or 4) +- (i) n: codebook number (*n is an integer defined in {0,2,3,4}) +- (i) I: index of c (pointer to unsigned 16-bit word) +- (o) y: point in RE8 (8-dimensional integer vector) +- note: the index I is defined as a 32-bit word, but only +- 16 bits are required (long can be replaced by unsigned integer) +- -------------------------------------------------------------------------- +- */ +-static void re8_decode_base_index(int *n, UINT index, SHORT y[8]) { +- int i, im, t, sign_code, ka, ks, rank, leader[8]; +- +- if (*n < 2) { +- for (i = 0; i < 8; i++) { +- y[i] = 0; +- } +- } else { +- // index = (unsigned int)*I; +- /* search for the identifier ka of the absolute leader (table-lookup) +- Q2 is a subset of Q3 - the two cases are considered in the same branch +- */ +- switch (*n) { +- case 2: +- case 3: +- i = table_lookup(fdk_dec_I3, index, NB_LDQ3); +- ka = fdk_dec_A3[i]; +- break; +- case 4: +- i = table_lookup(fdk_dec_I4, index, NB_LDQ4); +- ka = fdk_dec_A4[i]; +- break; +- default: +- FDK_ASSERT(0); +- return; +- } +- /* reconstruct the absolute leader */ +- for (i = 0; i < 8; i++) { +- leader[i] = fdk_dec_Da[ka][i]; +- } +- /* search for the identifier ks of the signed leader (table look-up) +- (this search is focused based on the identifier ka of the absolute +- leader)*/ +- t = fdk_dec_Ia[ka]; +- im = fdk_dec_Ns[ka]; +- ks = table_lookup(fdk_dec_Is + t, index, im); +- +- /* reconstruct the signed leader from its sign code */ +- sign_code = 2 * fdk_dec_Ds[t + ks]; +- for (i = 7; i >= 0; i--) { +- leader[i] *= (1 - (sign_code & 2)); +- sign_code >>= 1; +- } +- +- /* compute and decode the rank of the permutation */ +- rank = index - fdk_dec_Is[t + ks]; /* rank = index - cardinality offset */ +- +- re8_decode_rank_of_permutation(rank, leader, y); +- } +- return; +-} +- +-/* re8_y2k(y,m,k) +- VORONOI INDEXING (INDEX DECODING) k -> y +- (i) k: Voronoi index k[0..7] +- (i) m: Voronoi modulo (m = 2^r = 1<=2) +- (i) r: Voronoi order (m = 2^r = 1<=2) +- (o) y: 8-dimensional point y[0..7] in RE8 +- */ +-static void re8_k2y(int *k, int r, SHORT *y) { +- int i, tmp, sum; +- SHORT v[8]; +- FIXP_ZF zf[8]; +- +- FDK_ASSERT(r <= ZF_SCALE); +- +- /* compute y = k M and z=(y-a)/m, where +- M = [4 ] +- [2 2 ] +- [| \ ] +- [2 2 ] +- [1 1 _ 1 1] +- a=(2,0,...,0) +- m = 1<= 1; i--) { +- tmp = 2 * k[i]; +- sum += tmp; +- y[i] += tmp; +- zf[i] = INT2ZF(y[i], r); +- } +- y[0] += (4 * k[0] + sum); +- zf[0] = INT2ZF(y[0] - 2, r); +- /* find nearest neighbor v of z in infinite RE8 */ +- RE8_PPV(zf, v, r); +- /* compute y -= m v */ +- for (i = 0; i < 8; i++) { +- y[i] -= (SHORT)(v[i] << r); +- } +-} +- +-/*-------------------------------------------------------------------------- +- RE8_dec(n, I, k, y) +- MULTI-RATE INDEXING OF A POINT y in THE LATTICE RE8 (INDEX DECODING) +- (i) n: codebook number (*n is an integer defined in {0,2,3,4,..,n_max}). n_max +- = 36 (i) I: index of c (pointer to unsigned 16-bit word) (i) k: index of v +- (8-dimensional vector of binary indices) = Voronoi index (o) y: point in RE8 +- (8-dimensional integer vector) note: the index I is defined as a 32-bit word, +- but only 16 bits are required (long can be replaced by unsigned integer) +- +- return 0 on success, -1 on error. +- -------------------------------------------------------------------------- +- */ +-static int RE8_dec(int n, int I, int *k, FIXP_DBL *y) { +- SHORT v[8]; +- SHORT _y[8]; +- UINT r; +- int i; +- +- /* Check bound of codebook qn */ +- if (n > NQ_MAX) { +- return -1; +- } +- +- /* decode the sub-indices I and kv[] according to the codebook number n: +- if n=0,2,3,4, decode I (no Voronoi extension) +- if n>4, Voronoi extension is used, decode I and kv[] */ +- if (n <= 4) { +- re8_decode_base_index(&n, I, _y); +- for (i = 0; i < 8; i++) { +- y[i] = (LONG)_y[i]; +- } +- } else { +- /* compute the Voronoi modulo m = 2^r where r is extension order */ +- r = ((n - 3) >> 1); +- +- while (n > 4) { +- n -= 2; +- } +- /* decode base codebook index I into c (c is an element of Q3 or Q4) +- [here c is stored in y to save memory] */ +- re8_decode_base_index(&n, I, _y); +- /* decode Voronoi index k[] into v */ +- re8_k2y(k, r, v); +- /* reconstruct y as y = m c + v (with m=2^r, r integer >=1) */ +- for (i = 0; i < 8; i++) { +- y[i] = (LONG)((_y[i] << r) + v[i]); +- } +- } +- return 0; +-} +- +-/**************************/ +-/* start LPC decode stuff */ +-/**************************/ +-//#define M 16 +-#define FREQ_MAX 6400.0f +-#define FREQ_DIV 400.0f +-#define LSF_GAP 50.0f +- +-/** +- * \brief calculate inverse weighting factor and add non-weighted residual +- * LSF vector to first stage LSF approximation +- * \param lsfq first stage LSF approximation values. +- * \param xq weighted residual LSF vector +- * \param nk_mode code book number coding mode. +- */ +-static void lsf_weight_2st(FIXP_LPC *lsfq, FIXP_DBL *xq, int nk_mode) { +- FIXP_LPC d[M_LP_FILTER_ORDER + 1]; +- FIXP_SGL factor; +- LONG w; /* inverse weight factor */ +- int i; +- +- /* compute lsf distance */ +- d[0] = lsfq[0]; +- d[M_LP_FILTER_ORDER] = +- FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - lsfq[M_LP_FILTER_ORDER - 1]; +- for (i = 1; i < M_LP_FILTER_ORDER; i++) { +- d[i] = lsfq[i] - lsfq[i - 1]; +- } +- +- switch (nk_mode) { +- case 0: +- factor = FL2FXCONST_SGL(2.0f * 60.0f / FREQ_DIV); +- break; /* abs */ +- case 1: +- factor = FL2FXCONST_SGL(2.0f * 65.0f / FREQ_DIV); +- break; /* mid */ +- case 2: +- factor = FL2FXCONST_SGL(2.0f * 64.0f / FREQ_DIV); +- break; /* rel1 */ +- default: +- factor = FL2FXCONST_SGL(2.0f * 63.0f / FREQ_DIV); +- break; /* rel2 */ +- } +- /* add non-weighted residual LSF vector to LSF1st */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- w = (LONG)fMultDiv2(factor, sqrtFixp(fMult(d[i], d[i + 1]))); +- lsfq[i] = fAddSaturate(lsfq[i], FX_DBL2FX_LPC((FIXP_DBL)(w * (LONG)xq[i]))); +- } +- +- return; +-} +- +-/** +- * \brief decode nqn amount of code book numbers. These values determine the +- * amount of following bits for nqn AVQ RE8 vectors. +- * \param nk_mode quantization mode. +- * \param nqn amount code book number to read. +- * \param qn pointer to output buffer to hold decoded code book numbers qn. +- */ +-static void decode_qn(HANDLE_FDK_BITSTREAM hBs, int nk_mode, int nqn, +- int qn[]) { +- int n; +- +- if (nk_mode == 1) { /* nk mode 1 */ +- /* Unary code for mid LPC1/LPC3 */ +- /* Q0=0, Q2=10, Q3=110, ... */ +- for (n = 0; n < nqn; n++) { +- qn[n] = get_vlclbf(hBs); +- if (qn[n] > 0) { +- qn[n]++; +- } +- } +- } else { /* nk_mode 0, 3 and 2 */ +- /* 2 bits to specify Q2,Q3,Q4,ext */ +- for (n = 0; n < nqn; n++) { +- qn[n] = 2 + FDKreadBits(hBs, 2); +- } +- if (nk_mode == 2) { +- /* Unary code for rel LPC1/LPC3 */ +- /* Q0 = 0, Q5=10, Q6=110, ... */ +- for (n = 0; n < nqn; n++) { +- if (qn[n] > 4) { +- qn[n] = get_vlclbf(hBs); +- if (qn[n] > 0) qn[n] += 4; +- } +- } +- } else { /* nk_mode == (0 and 3) */ +- /* Unary code for abs and rel LPC0/LPC2 */ +- /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */ +- for (n = 0; n < nqn; n++) { +- if (qn[n] > 4) { +- qn[n] = get_vlclbf(hBs); +- switch (qn[n]) { +- case 0: +- qn[n] = 5; +- break; +- case 1: +- qn[n] = 6; +- break; +- case 2: +- qn[n] = 0; +- break; +- default: +- qn[n] += 4; +- break; +- } +- } +- } +- } +- } +-} +- +-/** +- * \brief reorder LSF coefficients to minimum distance. +- * \param lsf pointer to buffer containing LSF coefficients and where reordered +- * LSF coefficients will be stored into, scaled by LSF_SCALE. +- * \param min_dist min distance scaled by LSF_SCALE +- * \param n number of LSF/LSP coefficients. +- */ +-static void reorder_lsf(FIXP_LPC *lsf, FIXP_LPC min_dist, int n) { +- FIXP_LPC lsf_min; +- int i; +- +- lsf_min = min_dist; +- for (i = 0; i < n; i++) { +- if (lsf[i] < lsf_min) { +- lsf[i] = lsf_min; +- } +- lsf_min = fAddSaturate(lsf[i], min_dist); +- } +- +- /* reverse */ +- lsf_min = FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - min_dist; +- for (i = n - 1; i >= 0; i--) { +- if (lsf[i] > lsf_min) { +- lsf[i] = lsf_min; +- } +- +- lsf_min = lsf[i] - min_dist; +- } +-} +- +-/** +- * \brief First stage approximation +- * \param hBs bitstream handle as data source +- * \param lsfq pointer to output buffer to hold LPC coefficients scaled by +- * LSF_SCALE. +- */ +-static void vlpc_1st_dec( +- HANDLE_FDK_BITSTREAM hBs, /* input: codebook index */ +- FIXP_LPC *lsfq /* i/o: i:prediction o:quantized lsf */ +-) { +- const FIXP_LPC *p_dico; +- int i, index; +- +- index = FDKreadBits(hBs, 8); +- p_dico = &fdk_dec_dico_lsf_abs_8b[index * M_LP_FILTER_ORDER]; +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsfq[i] = p_dico[i]; +- } +-} +- +-/** +- * \brief Do first stage approximation weighting and multiply with AVQ +- * refinement. +- * \param hBs bitstream handle data ssource. +- * \param lsfq buffer holding 1st stage approx, 2nd stage approx is added to +- * this values. +- * \param nk_mode quantization mode. +- * \return 0 on success, -1 on error. +- */ +-static int vlpc_2st_dec( +- HANDLE_FDK_BITSTREAM hBs, +- FIXP_LPC *lsfq, /* i/o: i:1st stage o:1st+2nd stage */ +- int nk_mode /* input: 0=abs, >0=rel */ +-) { +- int err; +- FIXP_DBL xq[M_LP_FILTER_ORDER]; /* weighted residual LSF vector */ +- +- /* Decode AVQ refinement */ +- { err = CLpc_DecodeAVQ(hBs, xq, nk_mode, 2, 8); } +- if (err != 0) { +- return -1; +- } +- +- /* add non-weighted residual LSF vector to LSF1st */ +- lsf_weight_2st(lsfq, xq, nk_mode); +- +- /* reorder */ +- reorder_lsf(lsfq, FL2FXCONST_LPC(LSF_GAP / (1 << LSF_SCALE)), +- M_LP_FILTER_ORDER); +- +- return 0; +-} +- +-/* +- * Externally visible functions +- */ +- +-int CLpc_DecodeAVQ(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pOutput, int nk_mode, +- int no_qn, int length) { +- int i, l; +- +- for (i = 0; i < length; i += 8 * no_qn) { +- int qn[2], nk, n, I; +- int kv[8] = {0}; +- +- decode_qn(hBs, nk_mode, no_qn, qn); +- +- for (l = 0; l < no_qn; l++) { +- if (qn[l] == 0) { +- FDKmemclear(&pOutput[i + l * 8], 8 * sizeof(FIXP_DBL)); +- } +- +- /* Voronoi extension order ( nk ) */ +- nk = 0; +- n = qn[l]; +- if (qn[l] > 4) { +- nk = (qn[l] - 3) >> 1; +- n = qn[l] - nk * 2; +- } +- +- /* Base codebook index, in reverse bit group order (!) */ +- I = FDKreadBits(hBs, 4 * n); +- +- if (nk > 0) { +- int j; +- +- for (j = 0; j < 8; j++) { +- kv[j] = FDKreadBits(hBs, nk); +- } +- } +- +- if (RE8_dec(qn[l], I, kv, &pOutput[i + l * 8]) != 0) { +- return -1; +- } +- } +- } +- return 0; +-} +- +-int CLpc_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_LPC lsp[][M_LP_FILTER_ORDER], +- FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER], +- FIXP_LPC lsf_adaptive_mean_cand[M_LP_FILTER_ORDER], +- FIXP_SGL pStability[], UCHAR *mod, int first_lpd_flag, +- int last_lpc_lost, int last_frame_ok) { +- int i, k, err; +- int mode_lpc_bin = 0; /* mode_lpc bitstream representation */ +- int lpc_present[5] = {0, 0, 0, 0, 0}; +- int lpc0_available = 1; +- int s = 0; +- int l = 3; +- const int nbDiv = NB_DIV; +- +- lpc_present[4 >> s] = 1; /* LPC4 */ +- +- /* Decode LPC filters in the following order: LPC 4,0,2,1,3 */ +- +- /*** Decode LPC4 ***/ +- vlpc_1st_dec(hBs, lsp[4 >> s]); +- err = vlpc_2st_dec(hBs, lsp[4 >> s], 0); /* nk_mode = 0 */ +- if (err != 0) { +- return err; +- } +- +- /*** Decode LPC0 and LPC2 ***/ +- k = 0; +- if (!first_lpd_flag) { +- lpc_present[0] = 1; +- lpc0_available = !last_lpc_lost; +- /* old LPC4 is new LPC0 */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[0][i] = lpc4_lsf[i]; +- } +- /* skip LPC0 and continue with LPC2 */ +- k = 2; +- } +- +- for (; k < l; k += 2) { +- int nk_mode = 0; +- +- if ((k == 2) && (mod[0] == 3)) { +- break; /* skip LPC2 */ +- } +- +- lpc_present[k >> s] = 1; +- +- mode_lpc_bin = FDKreadBit(hBs); +- +- if (mode_lpc_bin == 0) { +- /* LPC0/LPC2: Abs */ +- vlpc_1st_dec(hBs, lsp[k >> s]); +- } else { +- /* LPC0/LPC2: RelR */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[k >> s][i] = lsp[4 >> s][i]; +- } +- nk_mode = 3; +- } +- +- err = vlpc_2st_dec(hBs, lsp[k >> s], nk_mode); +- if (err != 0) { +- return err; +- } +- } +- +- /*** Decode LPC1 ***/ +- if (mod[0] < 2) { /* else: skip LPC1 */ +- lpc_present[1] = 1; +- mode_lpc_bin = get_vlclbf_n(hBs, 2); +- +- switch (mode_lpc_bin) { +- case 1: +- /* LPC1: abs */ +- vlpc_1st_dec(hBs, lsp[1]); +- err = vlpc_2st_dec(hBs, lsp[1], 0); +- if (err != 0) { +- return err; +- } +- break; +- case 2: +- /* LPC1: mid0 (no second stage AVQ quantizer in this case) */ +- if (lpc0_available) { /* LPC0/lsf[0] might be zero some times */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[1][i] = (lsp[0][i] >> 1) + (lsp[2][i] >> 1); +- } +- } else { +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[1][i] = lsp[2][i]; +- } +- } +- break; +- case 0: +- /* LPC1: RelR */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[1][i] = lsp[2][i]; +- } +- err = vlpc_2st_dec(hBs, lsp[1], 2 << s); +- if (err != 0) { +- return err; +- } +- break; +- } +- } +- +- /*** Decode LPC3 ***/ +- if ((mod[2] < 2)) { /* else: skip LPC3 */ +- int nk_mode = 0; +- lpc_present[3] = 1; +- +- mode_lpc_bin = get_vlclbf_n(hBs, 3); +- +- switch (mode_lpc_bin) { +- case 1: +- /* LPC3: abs */ +- vlpc_1st_dec(hBs, lsp[3]); +- break; +- case 0: +- /* LPC3: mid */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[3][i] = (lsp[2][i] >> 1) + (lsp[4][i] >> 1); +- } +- nk_mode = 1; +- break; +- case 2: +- /* LPC3: relL */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[3][i] = lsp[2][i]; +- } +- nk_mode = 2; +- break; +- case 3: +- /* LPC3: relR */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[3][i] = lsp[4][i]; +- } +- nk_mode = 2; +- break; +- } +- err = vlpc_2st_dec(hBs, lsp[3], nk_mode); +- if (err != 0) { +- return err; +- } +- } +- +- if (!lpc0_available && !last_frame_ok) { +- /* LPC(0) was lost. Use next available LPC(k) instead */ +- for (k = 1; k < (nbDiv + 1); k++) { +- if (lpc_present[k]) { +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +-#define LSF_INIT_TILT (0.25f) +- if (mod[0] > 0) { +- lsp[0][i] = FX_DBL2FX_LPC( +- fMult(lsp[k][i], FL2FXCONST_SGL(1.0f - LSF_INIT_TILT)) + +- fMult(fdk_dec_lsf_init[i], FL2FXCONST_SGL(LSF_INIT_TILT))); +- } else { +- lsp[0][i] = lsp[k][i]; +- } +- } +- break; +- } +- } +- } +- +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lpc4_lsf[i] = lsp[4 >> s][i]; +- } +- +- { +- FIXP_DBL divFac; +- int last, numLpc = 0; +- +- i = nbDiv; +- do { +- numLpc += lpc_present[i--]; +- } while (i >= 0 && numLpc < 3); +- +- last = i; +- +- switch (numLpc) { +- case 3: +- divFac = FL2FXCONST_DBL(1.0f / 3.0f); +- break; +- case 2: +- divFac = FL2FXCONST_DBL(1.0f / 2.0f); +- break; +- default: +- divFac = FL2FXCONST_DBL(1.0f); +- break; +- } +- +- /* get the adaptive mean for the next (bad) frame */ +- for (k = 0; k < M_LP_FILTER_ORDER; k++) { +- FIXP_DBL tmp = (FIXP_DBL)0; +- for (i = nbDiv; i > last; i--) { +- if (lpc_present[i]) { +- tmp = fMultAdd(tmp >> 1, lsp[i][k], divFac); +- } +- } +- lsf_adaptive_mean_cand[k] = FX_DBL2FX_LPC(tmp); +- } +- } +- +- /* calculate stability factor Theta. Needed for ACELP decoder and concealment +- */ +- { +- FIXP_LPC *lsf_prev, *lsf_curr; +- k = 0; +- +- FDK_ASSERT(lpc_present[0] == 1 && lpc_present[4 >> s] == 1); +- lsf_prev = lsp[0]; +- for (i = 1; i < (nbDiv + 1); i++) { +- if (lpc_present[i]) { +- FIXP_DBL tmp = (FIXP_DBL)0; +- int j; +- lsf_curr = lsp[i]; +- +- /* sum = tmp * 2^(LSF_SCALE*2 + 4) */ +- for (j = 0; j < M_LP_FILTER_ORDER; j++) { +- tmp += fPow2Div2((FIXP_SGL)(lsf_curr[j] - lsf_prev[j])) >> 3; +- } +- +- /* tmp = (float)(FL2FXCONST_DBL(1.25f) - fMult(tmp, +- * FL2FXCONST_DBL(1/400000.0f))); */ +- tmp = FL2FXCONST_DBL(1.25f / (1 << LSF_SCALE)) - +- fMult(tmp, FL2FXCONST_DBL((1 << (LSF_SCALE + 4)) / 400000.0f)); +- if (tmp >= FL2FXCONST_DBL(1.0f / (1 << LSF_SCALE))) { +- pStability[k] = FL2FXCONST_SGL(1.0f / 2.0f); +- } else if (tmp < FL2FXCONST_DBL(0.0f)) { +- pStability[k] = FL2FXCONST_SGL(0.0f); +- } else { +- pStability[k] = FX_DBL2FX_SGL(tmp << (LSF_SCALE - 1)); +- } +- +- lsf_prev = lsf_curr; +- k = i; +- } else { +- /* Mark stability value as undefined. */ +- pStability[i] = (FIXP_SGL)-1; +- } +- } +- } +- +- /* convert into LSP domain */ +- for (i = 0; i < (nbDiv + 1); i++) { +- if (lpc_present[i]) { +- for (k = 0; k < M_LP_FILTER_ORDER; k++) { +- lsp[i][k] = FX_DBL2FX_LPC( +- fixp_cos(fMult(lsp[i][k], +- FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)), +- LSF_SCALE - LSPARG_SCALE)); +- } +- } +- } +- +- return 0; +-} +- +-void CLpc_Conceal(FIXP_LPC lsp[][M_LP_FILTER_ORDER], +- FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER], +- FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER], +- const int first_lpd_flag) { +- int i, j; +- +-#define BETA (FL2FXCONST_SGL(0.25f)) +-#define ONE_BETA (FL2FXCONST_SGL(0.75f)) +-#define BFI_FAC (FL2FXCONST_SGL(0.90f)) +-#define ONE_BFI_FAC (FL2FXCONST_SGL(0.10f)) +- +- /* Frame loss concealment (could be improved) */ +- +- if (first_lpd_flag) { +- /* Reset past LSF values */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[0][i] = lpc4_lsf[i] = fdk_dec_lsf_init[i]; +- } +- } else { +- /* old LPC4 is new LPC0 */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[0][i] = lpc4_lsf[i]; +- } +- } +- +- /* LPC1 */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- FIXP_LPC lsf_mean = FX_DBL2FX_LPC(fMult(BETA, fdk_dec_lsf_init[i]) + +- fMult(ONE_BETA, lsf_adaptive_mean[i])); +- +- lsp[1][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lpc4_lsf[i]) + +- fMult(ONE_BFI_FAC, lsf_mean)); +- } +- +- /* LPC2 - LPC4 */ +- for (j = 2; j <= 4; j++) { +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- /* lsf_mean[i] = FX_DBL2FX_LPC(fMult((FIXP_LPC)(BETA + j * +- FL2FXCONST_LPC(0.1f)), fdk_dec_lsf_init[i]) +- + fMult((FIXP_LPC)(ONE_BETA - j * +- FL2FXCONST_LPC(0.1f)), lsf_adaptive_mean[i])); */ +- +- FIXP_LPC lsf_mean = FX_DBL2FX_LPC( +- fMult((FIXP_SGL)(BETA + (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))), +- (FIXP_SGL)fdk_dec_lsf_init[i]) + +- fMult( +- (FIXP_SGL)(ONE_BETA - (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))), +- lsf_adaptive_mean[i])); +- +- lsp[j][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lsp[j - 1][i]) + +- fMult(ONE_BFI_FAC, lsf_mean)); +- } +- } +- +- /* Update past values for the future */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lpc4_lsf[i] = lsp[4][i]; +- } +- +- /* convert into LSP domain */ +- for (j = 0; j < 5; j++) { +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- lsp[j][i] = FX_DBL2FX_LPC(fixp_cos( +- fMult(lsp[j][i], FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)), +- LSF_SCALE - LSPARG_SCALE)); +- } +- } +-} +- +-void E_LPC_a_weight(FIXP_LPC *wA, const FIXP_LPC *A, int m) { +- FIXP_DBL f; +- int i; +- +- f = FL2FXCONST_DBL(0.92f); +- for (i = 0; i < m; i++) { +- wA[i] = FX_DBL2FX_LPC(fMult(A[i], f)); +- f = fMult(f, FL2FXCONST_DBL(0.92f)); +- } +-} +- +-void CLpd_DecodeGain(FIXP_DBL *gain, INT *gain_e, int gain_code) { +- /* gain * 2^(gain_e) = 10^(gain_code/28) */ +- *gain = fLdPow( +- FL2FXCONST_DBL(3.3219280948873623478703194294894 / 4.0), /* log2(10)*/ +- 2, +- fMultDiv2((FIXP_DBL)gain_code << (DFRACT_BITS - 1 - 7), +- FL2FXCONST_DBL(2.0f / 28.0f)), +- 7, gain_e); +-} +- +- /** +- * \brief * Find the polynomial F1(z) or F2(z) from the LSPs. +- * This is performed by expanding the product polynomials: +- * +- * F1(z) = product ( 1 - 2 LSP_i z^-1 + z^-2 ) +- * i=0,2,4,6,8 +- * F2(z) = product ( 1 - 2 LSP_i z^-1 + z^-2 ) +- * i=1,3,5,7,9 +- * +- * where LSP_i are the LSPs in the cosine domain. +- * R.A.Salami October 1990 +- * \param lsp input, line spectral freq. (cosine domain) +- * \param f output, the coefficients of F1 or F2, scaled by 8 bits +- * \param n no of coefficients (m/2) +- * \param flag 1 : F1(z) ; 2 : F2(z) +- */ +- +-#define SF_F 8 +- +-static void get_lsppol(FIXP_LPC lsp[], FIXP_DBL f[], int n, int flag) { +- FIXP_DBL b; +- FIXP_LPC *plsp; +- int i, j; +- +- plsp = lsp + flag - 1; +- f[0] = FL2FXCONST_DBL(1.0f / (1 << SF_F)); +- b = -FX_LPC2FX_DBL(*plsp); +- f[1] = b >> (SF_F - 1); +- for (i = 2; i <= n; i++) { +- plsp += 2; +- b = -FX_LPC2FX_DBL(*plsp); +- f[i] = ((fMultDiv2(b, f[i - 1]) << 1) + (f[i - 2])) << 1; +- for (j = i - 1; j > 1; j--) { +- f[j] = f[j] + (fMultDiv2(b, f[j - 1]) << 2) + f[j - 2]; +- } +- f[1] = f[1] + (b >> (SF_F - 1)); +- } +- return; +-} +- +-#define NC M_LP_FILTER_ORDER / 2 +- +-/** +- * \brief lsp input LSP vector +- * \brief a output LP filter coefficient vector scaled by SF_A_COEFFS. +- */ +-void E_LPC_f_lsp_a_conversion(FIXP_LPC *lsp, FIXP_LPC *a, INT *a_exp) { +- FIXP_DBL f1[NC + 1], f2[NC + 1]; +- int i, k; +- +- /*-----------------------------------------------------* +- * Find the polynomials F1(z) and F2(z) * +- *-----------------------------------------------------*/ +- +- get_lsppol(lsp, f1, NC, 1); +- get_lsppol(lsp, f2, NC, 2); +- +- /*-----------------------------------------------------* +- * Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1) * +- *-----------------------------------------------------*/ +- for (i = NC; i > 0; i--) { +- f1[i] += f1[i - 1]; +- f2[i] -= f2[i - 1]; +- } +- +- FIXP_DBL aDBL[M_LP_FILTER_ORDER]; +- +- for (i = 1, k = M_LP_FILTER_ORDER - 1; i <= NC; i++, k--) { +- FIXP_DBL tmp1, tmp2; +- +- tmp1 = f1[i] >> 1; +- tmp2 = f2[i] >> 1; +- +- aDBL[i - 1] = (tmp1 + tmp2); +- aDBL[k] = (tmp1 - tmp2); +- } +- +- int headroom_a = getScalefactor(aDBL, M_LP_FILTER_ORDER); +- +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- a[i] = FX_DBL2FX_LPC(aDBL[i] << headroom_a); +- } +- +- *a_exp = 8 - headroom_a; +-} +diff --git a/libAACdec/src/usacdec_lpc.h b/libAACdec/src/usacdec_lpc.h +deleted file mode 100644 +index a6713c1..0000000 +--- a/libAACdec/src/usacdec_lpc.h ++++ /dev/null +@@ -1,190 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Matthias Hildenbrand, Manuel Jander +- +- Description: USAC LPC/AVQ decode +- +-*******************************************************************************/ +- +-#ifndef USACDEC_LPC_H +-#define USACDEC_LPC_H +- +-#include "channelinfo.h" +-#include "common_fix.h" +-#include "FDK_bitstream.h" +-#include "usacdec_rom.h" +- +-#define LSPARG_SCALE 10 +- +-/** +- * \brief AVQ (refinement) decode +- * \param hBs bitstream handle +- * \param lsfq buffer for AVQ decode output. +- * \param nk_mode quantization mode. +- * \param nqn amount of split/interleaved RE8 vectors. +- * \param total amount of individual data values to decode. +- * \return 0 on success, -1 on error. +- */ +-int CLpc_DecodeAVQ(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *lsfq, int nk_mode, +- int nqn, int length); +- +-/** +- * \brief Read and decode LPC coeficient sets. First stage approximation + AVQ +- * decode. +- * \param[in] hBs bitstream handle to read data from. +- * \param[out] lsp buffer into which the decoded LSP coefficients will be stored +- * into. +- * \param[in,out] lpc4_lsf buffer into which the decoded LCP4 LSF coefficients +- * will be stored into (persistent). +- * \param[out] lsf_adaptive_mean_cand lsf adaptive mean vector needed for +- * concealment. +- * \param[out] pStability array with stability values for the ACELP decoder (and +- * concealment). +- * \param[in] mod array which defines modes (ACELP, TCX20|40|80) are used in +- * the current superframe. +- * \param[in] first_lpd_flag indicates the presence of LPC0 +- * \param[in] last_lpc_lost indicate that LPC4 of previous frame was lost. +- * \param[in] last_frame_ok indicate that the last frame was ok. +- * \return 0 on success, -1 on error. +- */ +-int CLpc_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_LPC lsp[][M_LP_FILTER_ORDER], +- FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER], +- FIXP_LPC lsf_adaptive_mean_cand[M_LP_FILTER_ORDER], +- FIXP_SGL pStability[], UCHAR *mod, int first_lpd_flag, +- int last_lpc_lost, int last_frame_ok); +- +-/** +- * \brief Generate LPC coefficient sets in case frame loss. +- * \param lsp buffer into which the decoded LSP coefficients will be stored +- * into. +- * \param lpc4_lsf buffer into which the decoded LCP4 LSF coefficients will be +- * stored into (persistent). +- * \param isf_adaptive_mean +- * \param first_lpd_flag indicates the previous LSF4 coefficients lpc4_lsf[] are +- * not valid. +- */ +-void CLpc_Conceal(FIXP_LPC lsp[][M_LP_FILTER_ORDER], +- FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER], +- FIXP_LPC isf_adaptive_mean[M_LP_FILTER_ORDER], +- const int first_lpd_flag); +- +-/** +- * \brief apply absolute weighting +- * \param A weighted LPC coefficient vector output. The first coeffcient is +- * implicitly 1.0 +- * \param A LPC coefficient vector. The first coeffcient is implicitly 1.0 +- * \param m length of vector A +- */ +-/* static */ +-void E_LPC_a_weight(FIXP_LPC *wA, const FIXP_LPC *A, const int m); +- +-/** +- * \brief decode TCX/FAC gain. In case of TCX the lg/sqrt(rms) part +- * must still be applied to obtain the gain value. +- * \param gain (o) pointer were the gain mantissa is stored into. +- * \param gain_e (o) pointer were the gain exponent is stored into. +- * \param gain_code (i) the 7 bit binary word from the bitstream +- * representing the gain. +- */ +-void CLpd_DecodeGain(FIXP_DBL *gain, INT *gain_e, int gain_code); +- +-/** +- * \brief convert LSP coefficients into LP domain. +- */ +-void E_LPC_f_lsp_a_conversion(FIXP_LPC *lsp, FIXP_LPC *a, INT *a_exp); +- +-#endif /* USACDEC_LPC_H */ +diff --git a/libAACdec/src/usacdec_lpd.cpp b/libAACdec/src/usacdec_lpd.cpp +deleted file mode 100644 +index fcf7a76..0000000 +--- a/libAACdec/src/usacdec_lpd.cpp ++++ /dev/null +@@ -1,2017 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Manuel Jander +- +- Description: USAC Linear Prediction Domain coding +- +-*******************************************************************************/ +- +-#include "usacdec_lpd.h" +- +-#include "usacdec_rom.h" +-#include "usacdec_fac.h" +-#include "usacdec_lpc.h" +-#include "FDK_tools_rom.h" +-#include "fft.h" +-#include "mdct.h" +-#include "usacdec_acelp.h" +-#include "overlapadd.h" +- +-#include "block.h" +- +-#define SF_PITCH_TRACK 6 +-#define SF_GAIN 3 +-#define MIN_VAL FL2FXCONST_DBL(0.0f) +-#define MAX_VAL (FIXP_DBL) MAXVAL_DBL +- +-#include "ac_arith_coder.h" +- +-void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise, +- const FIXP_SGL *filt, INT stop, int len) { +- INT i, j; +- FIXP_DBL tmp; +- +- for (i = 0; i < stop; i++) { +- tmp = fMultDiv2(noise[i], filt[0]); // Filt in Q-1.16 +- for (j = 1; j <= len; j++) { +- tmp += fMultDiv2((noise[i - j] + noise[i + j]), filt[j]); +- } +- syn_out[i] = (FIXP_PCM)(IMDCT_SCALE(syn[i] - tmp)); +- } +-} +- +-void bass_pf_1sf_delay( +- FIXP_DBL *syn, /* (i) : 12.8kHz synthesis to postfilter */ +- const INT *T_sf, /* (i) : Pitch period for all subframes (T_sf[16]) */ +- FIXP_DBL *pit_gain, +- const int frame_length, /* (i) : frame length (should be 768|1024) */ +- const INT l_frame, +- const INT l_next, /* (i) : look ahead for symmetric filtering */ +- FIXP_PCM *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr) */ +- FIXP_DBL mem_bpf[]) /* i/o : memory state [L_FILT+L_SUBFR] */ +-{ +- INT i, sf, i_subfr, T, T2, lg; +- +- FIXP_DBL tmp, ener, corr, gain; +- FIXP_DBL *noise, *noise_in; +- FIXP_DBL +- noise_buf[L_FILT + (2 * L_SUBFR)]; // L_FILT = 12, L_SUBFR = 64 => 140 +- const FIXP_DBL *x, *y; +- +- { +- noise = noise_buf + L_FILT; // L_FILT = 12 delay of upsampling filter +- noise_in = noise_buf + L_FILT + L_SUBFR; +- /* Input scaling of the BPF memory */ +- scaleValues(mem_bpf, (L_FILT + L_SUBFR), 1); +- } +- +- int gain_exp = 17; +- +- sf = 0; +- for (i_subfr = 0; i_subfr < l_frame; i_subfr += L_SUBFR, sf++) { +- T = T_sf[sf]; +- gain = pit_gain[sf]; +- +- /* Gain is in Q17.14 */ +- /* If gain > 1 set to 1 */ +- if (gain > (FIXP_DBL)(1 << 14)) gain = (FIXP_DBL)(1 << 14); +- +- /* If gain < 0 set to 0 */ +- if (gain < (FIXP_DBL)0) gain = (FIXP_DBL)0; +- +- if (gain > (FIXP_DBL)0) { +- /* pitch tracker: test pitch/2 to avoid continuous pitch doubling */ +- /* Note: pitch is limited to PIT_MIN (34 = 376Hz) at the encoder */ +- T2 = T >> 1; +- x = &syn[i_subfr - L_EXTRA]; +- y = &syn[i_subfr - T2 - L_EXTRA]; +- +- ener = (FIXP_DBL)0; +- corr = (FIXP_DBL)0; +- tmp = (FIXP_DBL)0; +- +- int headroom_x = getScalefactor(x, L_SUBFR + L_EXTRA); +- int headroom_y = getScalefactor(y, L_SUBFR + L_EXTRA); +- +- int width_shift = 7; +- +- for (i = 0; i < (L_SUBFR + L_EXTRA); i++) { +- ener += fPow2Div2((x[i] << headroom_x)) >> width_shift; +- corr += fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >> +- width_shift; +- tmp += fPow2Div2((y[i] << headroom_y)) >> width_shift; +- } +- +- int exp_ener = ((17 - headroom_x) << 1) + width_shift + 1; +- int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1; +- int exp_tmp = ((17 - headroom_y) << 1) + width_shift + 1; +- +- /* Add 0.01 to "ener". Adjust exponents */ +- FIXP_DBL point_zero_one = (FIXP_DBL)0x51eb851f; /* In Q-6.37 */ +- int diff; +- ener = fAddNorm(ener, exp_ener, point_zero_one, -6, &exp_ener); +- corr = fAddNorm(corr, exp_corr, point_zero_one, -6, &exp_corr); +- tmp = fAddNorm(tmp, exp_tmp, point_zero_one, -6, &exp_tmp); +- +- /* use T2 if normalized correlation > 0.95 */ +- INT s1, s2; +- s1 = CntLeadingZeros(ener) - 1; +- s2 = CntLeadingZeros(tmp) - 1; +- +- FIXP_DBL ener_by_tmp = fMultDiv2(ener << s1, tmp << s2); +- int ener_by_tmp_exp = (exp_ener - s1) + (exp_tmp - s2) + 1; +- +- if (ener_by_tmp_exp & 1) { +- ener_by_tmp <<= 1; +- ener_by_tmp_exp -= 1; +- } +- +- int temp_exp = 0; +- +- FIXP_DBL temp1 = invSqrtNorm2(ener_by_tmp, &temp_exp); +- +- int temp1_exp = temp_exp - (ener_by_tmp_exp >> 1); +- +- FIXP_DBL tmp_result = fMult(corr, temp1); +- +- int tmp_result_exp = exp_corr + temp1_exp; +- +- diff = tmp_result_exp - 0; +- FIXP_DBL point95 = FL2FXCONST_DBL(0.95f); +- if (diff >= 0) { +- diff = fMin(diff, 31); +- point95 = FL2FXCONST_DBL(0.95f) >> diff; +- } else { +- diff = fMax(diff, -31); +- tmp_result >>= (-diff); +- } +- +- if (tmp_result > point95) T = T2; +- +- /* prevent that noise calculation below reaches into not defined signal +- parts at the end of the synth_buf or in other words restrict the below +- used index (i+i_subfr+T) < l_frame + l_next +- */ +- lg = l_frame + l_next - T - i_subfr; +- +- if (lg > L_SUBFR) +- lg = L_SUBFR; +- else if (lg < 0) +- lg = 0; +- +- /* limit gain to avoid problem on burst */ +- if (lg > 0) { +- FIXP_DBL tmp1; +- +- /* max(lg) = 64 => scale with 6 bits minus 1 (fPow2Div2) */ +- +- s1 = getScalefactor(&syn[i_subfr], lg); +- s2 = getScalefactor(&syn[i_subfr + T], lg); +- INT s = fixMin(s1, s2); +- +- tmp = (FIXP_DBL)0; +- ener = (FIXP_DBL)0; +- for (i = 0; i < lg; i++) { +- tmp += fPow2Div2(syn[i + i_subfr] << s1) >> (SF_PITCH_TRACK); +- ener += fPow2Div2(syn[i + i_subfr + T] << s2) >> (SF_PITCH_TRACK); +- } +- tmp = tmp >> fMin(DFRACT_BITS - 1, (2 * (s1 - s))); +- ener = ener >> fMin(DFRACT_BITS - 1, (2 * (s2 - s))); +- +- /* error robustness: for the specific case syn[...] == -1.0f for all 64 +- samples ener or tmp might overflow and become negative. For all sane +- cases we have enough headroom. +- */ +- if (ener <= (FIXP_DBL)0) { +- ener = (FIXP_DBL)1; +- } +- if (tmp <= (FIXP_DBL)0) { +- tmp = (FIXP_DBL)1; +- } +- FDK_ASSERT(ener > (FIXP_DBL)0); +- +- /* tmp = sqrt(tmp/ener) */ +- int result_e = 0; +- tmp1 = fDivNorm(tmp, ener, &result_e); +- if (result_e & 1) { +- tmp1 >>= 1; +- result_e += 1; +- } +- tmp = sqrtFixp(tmp1); +- result_e >>= 1; +- +- gain_exp = 17; +- +- diff = result_e - gain_exp; +- +- FIXP_DBL gain1 = gain; +- +- if (diff >= 0) { +- diff = fMin(diff, 31); +- gain1 >>= diff; +- } else { +- result_e += (-diff); +- diff = fMax(diff, -31); +- tmp >>= (-diff); +- } +- +- if (tmp < gain1) { +- gain = tmp; +- gain_exp = result_e; +- } +- } +- +- /* calculate noise based on voiced pitch */ +- /* fMultDiv2() replaces weighting of gain with 0.5 */ +- diff = gain_exp - 17; +- if (diff >= 0) { +- gain <<= diff; +- } else { +- gain >>= (-diff); +- } +- +- s1 = CntLeadingZeros(gain) - 1; +- s1 -= 16; /* Leading bits for SGL */ +- +- FIXP_SGL gainSGL = FX_DBL2FX_SGL(gain << 16); +- +- gainSGL = gainSGL << s1; +- +- { +- for (i = 0; i < lg; i++) { +- /* scaled with SF_SYNTH + gain_sf + 1 */ +- noise_in[i] = +- (fMult(gainSGL, syn[i + i_subfr] - (syn[i + i_subfr - T] >> 1) - +- (syn[i + i_subfr + T] >> 1))) >> +- s1; +- } +- +- for (i = lg; i < L_SUBFR; i++) { +- /* scaled with SF_SYNTH + gain_sf + 1 */ +- noise_in[i] = +- (fMult(gainSGL, syn[i + i_subfr] - syn[i + i_subfr - T])) >> s1; +- } +- } +- } else { +- FDKmemset(noise_in, (FIXP_DBL)0, L_SUBFR * sizeof(FIXP_DBL)); +- } +- +- { +- FDKmemcpy(noise_buf, mem_bpf, (L_FILT + L_SUBFR) * sizeof(FIXP_DBL)); +- +- FDKmemcpy(mem_bpf, noise_buf + L_SUBFR, +- (L_FILT + L_SUBFR) * sizeof(FIXP_DBL)); +- } +- +- /* substract from voiced speech low-pass filtered noise */ +- /* filter coefficients are scaled with factor SF_FILT_LP (1) */ +- +- { +- filtLP(&syn[i_subfr - L_SUBFR], &synth_out[i_subfr], noise, +- fdk_dec_filt_lp, L_SUBFR, L_FILT); +- } +- } +- +- { +- +- } +- +- // To be determined (info from Ben) +- { +- /* Output scaling of the BPF memory */ +- scaleValues(mem_bpf, (L_FILT + L_SUBFR), -1); +- /* Copy the rest of the signal (after the fac) */ +- scaleValuesSaturate((FIXP_PCM *)&synth_out[l_frame], +- (FIXP_DBL *)&syn[l_frame - L_SUBFR], +- (frame_length - l_frame), MDCT_OUT_HEADROOM); +- } +- +- return; +-} +- +-/* +- * Frequency Domain Noise Shaping +- */ +- +-/** +- * \brief Adaptive Low Frequencies Deemphasis of spectral coefficients. +- * +- * Ensure quantization of low frequencies in case where the +- * signal dynamic is higher than the LPC noise shaping. +- * This is the inverse operation of adap_low_freq_emph(). +- * Output gain of all blocks. +- * +- * \param x pointer to the spectral coefficients, requires 1 bit headroom. +- * \param lg length of x. +- * \param bUseNewAlfe if set, apply ALFD for fullband lpd. +- * \param gainLpc1 pointer to gain based on old input LPC coefficients. +- * \param gainLpc2 pointer to gain based on new input LPC coefficients. +- * \param alfd_gains pointer to output gains. +- * \param s current scale shift factor of x. +- */ +-#define ALFDPOW2_SCALE 3 +-/*static*/ +-void CLpd_AdaptLowFreqDeemph(FIXP_DBL x[], int lg, FIXP_DBL alfd_gains[], +- INT s) { +- { +- int i, j, k, i_max; +- FIXP_DBL max, fac; +- /* Note: This stack array saves temporary accumulation results to be used in +- * a second run */ +- /* The size should be limited to (1024/4)/8=32 */ +- FIXP_DBL tmp_pow2[32]; +- +- s = s * 2 + ALFDPOW2_SCALE; +- s = fMin(31, s); +- +- k = 8; +- i_max = lg / 4; /* ALFD range = 1600Hz (lg = 6400Hz) */ +- +- /* find spectral peak */ +- max = FL2FX_DBL(0.01f) >> s; +- for (i = 0; i < i_max; i += k) { +- FIXP_DBL tmp; +- +- tmp = FIXP_DBL(0); +- FIXP_DBL *pX = &x[i]; +- +- j = 8; +- do { +- FIXP_DBL x0 = *pX++; +- FIXP_DBL x1 = *pX++; +- x0 = fPow2Div2(x0); +- x1 = fPow2Div2(x1); +- tmp = tmp + (x0 >> (ALFDPOW2_SCALE - 1)); +- tmp = tmp + (x1 >> (ALFDPOW2_SCALE - 1)); +- } while ((j = j - 2) != 0); +- tmp = fMax(tmp, (FL2FX_DBL(0.01f) >> s)); +- tmp_pow2[i >> 3] = tmp; +- if (tmp > max) { +- max = tmp; +- } +- } +- +- /* deemphasis of all blocks below the peak */ +- fac = FL2FX_DBL(0.1f) >> 1; +- for (i = 0; i < i_max; i += k) { +- FIXP_DBL tmp; +- INT shifti; +- +- tmp = tmp_pow2[i >> 3]; +- +- /* tmp = (float)sqrt(tmp/max); */ +- +- /* value of tmp is between 8/2*max^2 and max^2 / 2. */ +- /* required shift factor of division can grow up to 27 +- (grows exponentially for values toward zero) +- thus using normalized division to assure valid result. */ +- { +- INT sd; +- +- if (tmp != (FIXP_DBL)0) { +- tmp = fDivNorm(max, tmp, &sd); +- if (sd & 1) { +- sd++; +- tmp >>= 1; +- } +- } else { +- tmp = (FIXP_DBL)MAXVAL_DBL; +- sd = 0; +- } +- tmp = invSqrtNorm2(tmp, &shifti); +- tmp = scaleValue(tmp, shifti - 1 - (sd / 2)); +- } +- if (tmp > fac) { +- fac = tmp; +- } +- FIXP_DBL *pX = &x[i]; +- +- j = 8; +- do { +- FIXP_DBL x0 = pX[0]; +- FIXP_DBL x1 = pX[1]; +- x0 = fMultDiv2(x0, fac); +- x1 = fMultDiv2(x1, fac); +- x0 = x0 << 2; +- x1 = x1 << 2; +- *pX++ = x0; +- *pX++ = x1; +- +- } while ((j = j - 2) != 0); +- /* Store gains for FAC */ +- *alfd_gains++ = fac; +- } +- } +-} +- +-/** +- * \brief Interpolated Noise Shaping for mdct coefficients. +- * This algorithm shapes temporally the spectral noise between +- * the two spectral noise represention (FDNS_NPTS of resolution). +- * The noise is shaped monotonically between the two points +- * using a curved shape to favor the lower gain in mid-frame. +- * ODFT and amplitud calculation are applied to the 2 LPC coefficients first. +- * +- * \param r pointer to spectrum data. +- * \param rms RMS of output spectrum. +- * \param lg length of r. +- * \param A1 pointer to old input LPC coefficients of length M_LP_FILTER_ORDER +- * scaled by SF_A_COEFFS. +- * \param A2 pointer to new input LPC coefficients of length M_LP_FILTER_ORDER +- * scaled by SF_A_COEFFS. +- * \param bLpc2Mdct flags control lpc2mdct conversion and noise shaping. +- * \param gainLpc1 pointer to gain based on old input LPC coefficients. +- * \param gainLpc2 pointer to gain based on new input LPC coefficients. +- * \param gLpc_e pointer to exponent of gainLpc1 and gainLpc2. +- */ +-/* static */ +-#define NSHAPE_SCALE (4) +- +-#define LPC2MDCT_CALC (1) +-#define LPC2MDCT_GAIN_LOAD (2) +-#define LPC2MDCT_GAIN_SAVE (4) +-#define LPC2MDCT_APPLY_NSHAPE (8) +- +-void lpc2mdctAndNoiseShaping(FIXP_DBL *r, SHORT *pScale, const INT lg, +- const INT fdns_npts, const FIXP_LPC *A1, +- const INT A1_exp, const FIXP_LPC *A2, +- const INT A2_exp) { +- FIXP_DBL *tmp2 = NULL; +- FIXP_DBL rr_minus_one; +- int i, k, s, step; +- +- C_AALLOC_SCRATCH_START(tmp1, FIXP_DBL, FDNS_NPTS * 8) +- +- { +- tmp2 = tmp1 + fdns_npts * 4; +- +- /* lpc2mdct() */ +- +- /* ODFT. E_LPC_a_weight() for A1 and A2 vectors is included into the loop +- * below. */ +- FIXP_DBL f = FL2FXCONST_DBL(0.92f); +- +- const FIXP_STP *SinTab; +- int k_step; +- /* needed values: sin(phi), cos(phi); phi = i*PI/(2*fdns_npts), i = 0 ... +- * M_LP_FILTER_ORDER */ +- switch (fdns_npts) { +- case 64: +- SinTab = SineTable512; +- k_step = (512 / 64); +- FDK_ASSERT(512 >= 64); +- break; +- case 48: +- SinTab = SineTable384; +- k_step = 384 / 48; +- FDK_ASSERT(384 >= 48); +- break; +- default: +- FDK_ASSERT(0); +- return; +- } +- +- for (i = 0, k = k_step; i < M_LP_FILTER_ORDER; i++, k += k_step) { +- FIXP_STP cs = SinTab[k]; +- FIXP_DBL wA1, wA2; +- +- wA1 = fMult(A1[i], f); +- wA2 = fMult(A2[i], f); +- +- /* r[i] = A[i]*cos() */ +- tmp1[2 + i * 2] = fMult(wA1, cs.v.re); +- tmp2[2 + i * 2] = fMult(wA2, cs.v.re); +- /* i[i] = A[i]*sin() */ +- tmp1[3 + i * 2] = -fMult(wA1, cs.v.im); +- tmp2[3 + i * 2] = -fMult(wA2, cs.v.im); +- +- f = fMult(f, FL2FXCONST_DBL(0.92f)); +- } +- +- /* Guarantee at least 2 bits of headroom for the FFT */ +- /* "3" stands for 1.0 with 2 bits of headroom; (A1_exp + 2) guarantess 2 +- * bits of headroom if A1_exp > 1 */ +- int A1_exp_fix = fMax(3, A1_exp + 2); +- int A2_exp_fix = fMax(3, A2_exp + 2); +- +- /* Set 1.0 in the proper format */ +- tmp1[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A1_exp_fix); +- tmp2[0] = (FIXP_DBL)(INT)((ULONG)0x80000000 >> A2_exp_fix); +- +- tmp1[1] = tmp2[1] = (FIXP_DBL)0; +- +- /* Clear the resto of the array */ +- FDKmemclear( +- tmp1 + 2 * (M_LP_FILTER_ORDER + 1), +- 2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL)); +- FDKmemclear( +- tmp2 + 2 * (M_LP_FILTER_ORDER + 1), +- 2 * (fdns_npts * 2 - (M_LP_FILTER_ORDER + 1)) * sizeof(FIXP_DBL)); +- +- /* Guarantee 2 bits of headroom for FFT */ +- scaleValues(&tmp1[2], (2 * M_LP_FILTER_ORDER), (A1_exp - A1_exp_fix)); +- scaleValues(&tmp2[2], (2 * M_LP_FILTER_ORDER), (A2_exp - A2_exp_fix)); +- +- INT s2; +- s = A1_exp_fix; +- s2 = A2_exp_fix; +- +- fft(2 * fdns_npts, tmp1, &s); +- fft(2 * fdns_npts, tmp2, &s2); +- +- /* Adjust the exponents of both fft outputs if necessary*/ +- if (s > s2) { +- scaleValues(tmp2, 2 * fdns_npts, s2 - s); +- s2 = s; +- } else if (s < s2) { +- scaleValues(tmp1, 2 * fdns_npts, s - s2); +- s = s2; +- } +- +- FDK_ASSERT(s == s2); +- } +- +- /* Get amplitude and apply gains */ +- step = lg / fdns_npts; +- rr_minus_one = (FIXP_DBL)0; +- +- for (k = 0; k < fdns_npts; k++) { +- FIXP_DBL g1, g2, inv_g1_g2, a, b; +- INT inv_g1_g2_e; +- int g_e, shift; +- +- { +- FIXP_DBL real, imag; +- int si1, si2, sInput; +- +- real = tmp1[k * 2]; +- imag = tmp1[k * 2 + 1]; +- sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0); +- real <<= sInput; +- imag <<= sInput; +- /* g1_e = si1 - 2*s/2 */ +- g1 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si1); +- si1 += sInput; +- +- real = tmp2[k * 2]; +- imag = tmp2[k * 2 + 1]; +- sInput = fMax(fMin(fNorm(real), fNorm(imag)) - 1, 0); +- real <<= sInput; +- imag <<= sInput; +- /* g2_e = si2 - 2*s/2 */ +- g2 = invSqrtNorm2(fPow2(real) + fPow2(imag), &si2); +- si2 += sInput; +- +- /* Pick a common scale factor for g1 and g2 */ +- if (si1 > si2) { +- g2 >>= si1 - si2; +- g_e = si1 - s; +- } else { +- g1 >>= si2 - si1; +- g_e = si2 - s; +- } +- } +- +- /* end of lpc2mdct() */ +- +- FDK_ASSERT(g1 >= (FIXP_DBL)0); +- FDK_ASSERT(g2 >= (FIXP_DBL)0); +- +- /* mdct_IntNoiseShaping() */ +- { +- /* inv_g1_g2 * 2^inv_g1_g2_e = 1/(g1+g2) */ +- inv_g1_g2 = (g1 >> 1) + (g2 >> 1); +- if (inv_g1_g2 != (FIXP_DBL)0) { +- inv_g1_g2 = fDivNorm(FL2FXCONST_DBL(0.5f), inv_g1_g2, &inv_g1_g2_e); +- inv_g1_g2_e = inv_g1_g2_e - g_e; +- } else { +- inv_g1_g2 = (FIXP_DBL)MAXVAL_DBL; +- inv_g1_g2_e = 0; +- } +- +- if (g_e < 0) { +- /* a_e = g_e + inv_g1_g2_e + 1 */ +- a = scaleValue(fMult(fMult(g1, g2), inv_g1_g2), g_e); +- /* b_e = g_e + inv_g1_g2_e */ +- b = fMult(g2 - g1, inv_g1_g2); +- shift = g_e + inv_g1_g2_e + 1 - NSHAPE_SCALE; +- } else { +- /* a_e = (g_e+g_e) + inv_g1_g2_e + 1 */ +- a = fMult(fMult(g1, g2), inv_g1_g2); +- /* b_e = (g_e+g_e) + inv_g1_g2_e */ +- b = scaleValue(fMult(g2 - g1, inv_g1_g2), -g_e); +- shift = (g_e + g_e) + inv_g1_g2_e + 1 - NSHAPE_SCALE; +- } +- +- for (i = k * step; i < (k + 1) * step; i++) { +- FIXP_DBL tmp; +- +- /* rr[i] = 2*a*r[i] + b*rr[i-1] */ +- tmp = fMult(a, r[i]); +- tmp += scaleValue(fMultDiv2(b, rr_minus_one), NSHAPE_SCALE); +- tmp = scaleValueSaturate(tmp, shift); +- rr_minus_one = tmp; +- r[i] = tmp; +- } +- } +- } +- +- /* end of mdct_IntNoiseShaping() */ +- { *pScale += NSHAPE_SCALE; } +- +- C_AALLOC_SCRATCH_END(tmp1, FIXP_DBL, FDNS_NPTS * 8) +-} +- +-/** +- * \brief Calculates the energy. +- * \param r pointer to spectrum. +- * \param rs scale factor of spectrum r. +- * \param lg frame length in audio samples. +- * \param rms_e pointer to exponent of energy value. +- * \return mantissa of energy value. +- */ +-static FIXP_DBL calcEnergy(const FIXP_DBL *r, const SHORT rs, const INT lg, +- INT *rms_e) { +- int headroom = getScalefactor(r, lg); +- +- FIXP_DBL rms_m = 0; +- +- /* Calculate number of growth bits due to addition */ +- INT shift = (INT)(fNormz((FIXP_DBL)lg)); +- shift = 31 - shift; +- +- /* Generate 1e-2 in Q-6.37 */ +- const FIXP_DBL value0_01 = 0x51eb851e; +- const INT value0_01_exp = -6; +- +- /* Find the exponent of the resulting energy value */ +- *rms_e = ((rs - headroom) << 1) + shift + 1; +- +- INT delta = *rms_e - value0_01_exp; +- if (delta > 0) { +- /* Limit shift_to 31*/ +- delta = fMin(31, delta); +- rms_m = value0_01 >> delta; +- } else { +- rms_m = value0_01; +- *rms_e = value0_01_exp; +- shift = shift - delta; +- /* Limit shift_to 31*/ +- shift = fMin(31, shift); +- } +- +- for (int i = 0; i < lg; i++) { +- rms_m += fPow2Div2(r[i] << headroom) >> shift; +- } +- +- return rms_m; +-} +- +-/** +- * \brief TCX gain calculation. +- * \param pAacDecoderChannelInfo channel context data. +- * \param r output spectrum. +- * \param rms_e pointer to mantissa of energy value. +- * \param rms_e pointer to exponent of energy value. +- * \param frame the frame index of the LPD super frame. +- * \param lg the frame length in audio samples. +- * \param gain_m pointer to mantissa of TCX gain. +- * \param gain_e pointer to exponent of TCX gain. +- * \param elFlags element specific parser guidance flags. +- * \param lg_fb the fullband frame length in audio samples. +- * \param IGF_bgn the IGF start index. +- */ +-static void calcTCXGain(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- FIXP_DBL *r, FIXP_DBL rms_m, INT rms_e, const INT frame, +- const INT lg) { +- if ((rms_m != (FIXP_DBL)0)) { +- FIXP_DBL tcx_gain_m; +- INT tcx_gain_e; +- +- CLpd_DecodeGain(&tcx_gain_m, &tcx_gain_e, +- pAacDecoderChannelInfo->pDynData->specificTo.usac +- .tcx_global_gain[frame]); +- +- /* rms * 2^rms_e = lg/sqrt(sum(spec^2)) */ +- if (rms_e & 1) { +- rms_m >>= 1; +- rms_e++; +- } +- +- { +- FIXP_DBL fx_lg; +- INT fx_lg_e, s; +- INT inv_e; +- +- /* lg = fx_lg * 2^fx_lg_e */ +- s = fNorm((FIXP_DBL)lg); +- fx_lg = (FIXP_DBL)lg << s; +- fx_lg_e = DFRACT_BITS - 1 - s; +- /* 1/sqrt(rms) */ +- rms_m = invSqrtNorm2(rms_m, &inv_e); +- rms_m = fMult(rms_m, fx_lg); +- rms_e = inv_e - (rms_e >> 1) + fx_lg_e; +- } +- +- { +- int s = fNorm(tcx_gain_m); +- tcx_gain_m = tcx_gain_m << s; +- tcx_gain_e -= s; +- } +- +- tcx_gain_m = fMultDiv2(tcx_gain_m, rms_m); +- tcx_gain_e = tcx_gain_e + rms_e; +- +- /* global_gain * 2^(global_gain_e+rms_e) = (10^(global_gain/28)) * rms * +- * 2^rms_e */ +- { +- { tcx_gain_e += 1; } +- } +- +- pAacDecoderChannelInfo->data.usac.tcx_gain[frame] = tcx_gain_m; +- pAacDecoderChannelInfo->data.usac.tcx_gain_e[frame] = tcx_gain_e; +- +- pAacDecoderChannelInfo->specScale[frame] += tcx_gain_e; +- } +-} +- +-/** +- * \brief FDNS decoding. +- * \param pAacDecoderChannelInfo channel context data. +- * \param pAacDecoderStaticChannelInfo channel context static data. +- * \param r output spectrum. +- * \param lg the frame length in audio samples. +- * \param frame the frame index of the LPD super frame. +- * \param pScale pointer to current scale shift factor of r[]. +- * \param A1 old input LPC coefficients of length M_LP_FILTER_ORDER. +- * \param A2 new input LPC coefficients of length M_LP_FILTER_ORDER. +- * \param pAlfdGains pointer for ALFD gains output scaled by 1. +- * \param fdns_npts number of lines (FDNS_NPTS). +- * \param inf_mask pointer to noise mask. +- * \param IGF_win_mode IGF window mode (LONG, SHORT, TCX10, TCX20). +- * \param frameType (IGF_FRAME_DIVISION_AAC_OR_TCX_LONG or +- * IGF_FRAME_DIVISION_TCX_SHORT_1). +- * \param elFlags element specific parser guidance flags. +- * \param lg_fb the fullband frame length in audio samples. +- * \param IGF_bgn the IGF start index. +- * \param rms_m mantisse of energy. +- * \param rms_e exponent of energy. +- */ +-/* static */ +-void CLpd_FdnsDecode(CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- FIXP_DBL r[], const INT lg, const INT frame, SHORT *pScale, +- const FIXP_LPC A1[M_LP_FILTER_ORDER], const INT A1_exp, +- const FIXP_LPC A2[M_LP_FILTER_ORDER], const INT A2_exp, +- FIXP_DBL pAlfdGains[LFAC / 4], const INT fdns_npts) { +- /* Weight LPC coefficients using Rm values */ +- CLpd_AdaptLowFreqDeemph(r, lg, pAlfdGains, *pScale); +- +- FIXP_DBL rms_m = (FIXP_DBL)0; +- INT rms_e = 0; +- { +- /* Calculate Energy */ +- rms_m = calcEnergy(r, *pScale, lg, &rms_e); +- } +- +- calcTCXGain(pAacDecoderChannelInfo, r, rms_m, rms_e, frame, lg); +- +- /* Apply ODFT and Noise Shaping. LP coefficient (A1, A2) weighting is done +- * inside on the fly. */ +- +- lpc2mdctAndNoiseShaping(r, pScale, lg, fdns_npts, A1, A1_exp, A2, A2_exp); +-} +- +-/** +- * find pitch for TCX20 (time domain) concealment. +- */ +-static int find_mpitch(FIXP_DBL xri[], int lg) { +- FIXP_DBL max, pitch; +- INT pitch_e; +- int i, n; +- +- max = (FIXP_DBL)0; +- n = 2; +- +- /* find maximum below 400Hz */ +- for (i = 2; i < (lg >> 4); i += 2) { +- FIXP_DBL tmp = fPow2Div2(xri[i]) + fPow2Div2(xri[i + 1]); +- if (tmp > max) { +- max = tmp; +- n = i; +- } +- } +- +- // pitch = ((float)lg<<1)/(float)n; +- pitch = fDivNorm((FIXP_DBL)lg << 1, (FIXP_DBL)n, &pitch_e); +- pitch >>= fixMax(0, DFRACT_BITS - 1 - pitch_e - 16); +- +- /* find pitch multiple under 20ms */ +- if (pitch >= (FIXP_DBL)((256 << 16) - 1)) { /*231.0f*/ +- n = 256; +- } else { +- FIXP_DBL mpitch = pitch; +- while (mpitch < (FIXP_DBL)(255 << 16)) { +- mpitch += pitch; +- } +- n = (int)(mpitch - pitch) >> 16; +- } +- +- return (n); +-} +- +-/** +- * number of spectral coefficients / time domain samples using frame mode as +- * index. +- */ +-static const int lg_table_ccfl[2][4] = { +- {256, 256, 512, 1024}, /* coreCoderFrameLength = 1024 */ +- {192, 192, 384, 768} /* coreCoderFrameLength = 768 */ +-}; +- +-/** +- * \brief Decode and render one MDCT-TCX frame. +- * \param pAacDecoderChannelInfo channel context data. +- * \param lg the frame length in audio samples. +- * \param frame the frame index of the LPD super frame. +- */ +-static void CLpd_TcxDecode( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags, +- int mod, int last_mod, int frame, int frameOk) { +- FIXP_DBL *pAlfd_gains = pAacDecoderStaticChannelInfo->last_alfd_gains; +- ULONG *pSeed = &pAacDecoderStaticChannelInfo->nfRandomSeed; +- int lg = (pAacDecoderChannelInfo->granuleLength == 128) +- ? lg_table_ccfl[0][mod + 0] +- : lg_table_ccfl[1][mod + 0]; +- int next_frame = frame + (1 << (mod - 1)); +- int isFullBandLpd = 0; +- +- /* Obtain r[] vector by combining the quant[] and noise[] vectors */ +- { +- FIXP_DBL noise_level; +- FIXP_DBL *coeffs = +- SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame, +- pAacDecoderChannelInfo->granuleLength, isFullBandLpd); +- int scale = pAacDecoderChannelInfo->specScale[frame]; +- int i, nfBgn, nfEnd; +- UCHAR tcx_noise_factor = pAacDecoderChannelInfo->pDynData->specificTo.usac +- .tcx_noise_factor[frame]; +- +- /* find pitch for bfi case */ +- pAacDecoderStaticChannelInfo->last_tcx_pitch = find_mpitch(coeffs, lg); +- +- if (frameOk) { +- /* store for concealment */ +- pAacDecoderStaticChannelInfo->last_tcx_noise_factor = tcx_noise_factor; +- } else { +- /* restore last frames value */ +- tcx_noise_factor = pAacDecoderStaticChannelInfo->last_tcx_noise_factor; +- } +- +- noise_level = +- (FIXP_DBL)((LONG)FL2FXCONST_DBL(0.0625f) * (8 - tcx_noise_factor)); +- noise_level = scaleValue(noise_level, -scale); +- +- const FIXP_DBL neg_noise_level = -noise_level; +- +- { +- nfBgn = lg / 6; +- nfEnd = lg; +- } +- +- for (i = nfBgn; i < nfEnd - 7; i += 8) { +- LONG tmp; +- +- /* Fill all 8 consecutive zero coeffs with noise */ +- tmp = coeffs[i + 0] | coeffs[i + 1] | coeffs[i + 2] | coeffs[i + 3] | +- coeffs[i + 4] | coeffs[i + 5] | coeffs[i + 6] | coeffs[i + 7]; +- +- if (tmp == 0) { +- for (int k = i; k < i + 8; k++) { +- UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level) +- : (coeffs[k] = noise_level); +- } +- } +- } +- if ((nfEnd - i) > +- 0) { /* noise filling for last "band" with less than 8 bins */ +- LONG tmp = (LONG)coeffs[i]; +- int k; +- +- FDK_ASSERT((nfEnd - i) < 8); +- for (k = 1; k < (nfEnd - i); k++) { +- tmp |= (LONG)coeffs[i + k]; +- } +- if (tmp == 0) { +- for (k = i; k < nfEnd; k++) { +- UsacRandomSign(pSeed) ? (coeffs[k] = neg_noise_level) +- : (coeffs[k] = noise_level); +- } +- } +- } +- } +- +- { +- /* Convert LPC to LP domain */ +- if (last_mod == 0) { +- /* Note: The case where last_mod == 255 is handled by other means +- * in CLpdChannelStream_Read() */ +- E_LPC_f_lsp_a_conversion( +- pAacDecoderChannelInfo->data.usac.lsp_coeff[frame], +- pAacDecoderChannelInfo->data.usac.lp_coeff[frame], +- &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame]); +- } +- +- E_LPC_f_lsp_a_conversion( +- pAacDecoderChannelInfo->data.usac.lsp_coeff[next_frame], +- pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame], +- &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame]); +- +- /* FDNS decoding */ +- CLpd_FdnsDecode( +- pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, +- SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame, +- pAacDecoderChannelInfo->granuleLength, isFullBandLpd), +- lg, frame, pAacDecoderChannelInfo->specScale + frame, +- pAacDecoderChannelInfo->data.usac.lp_coeff[frame], +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[frame], +- pAacDecoderChannelInfo->data.usac.lp_coeff[next_frame], +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[next_frame], pAlfd_gains, +- pAacDecoderChannelInfo->granuleLength / 2 /* == FDNS_NPTS(ccfl) */ +- ); +- } +-} +- +-/** +- * \brief Read the tcx_coding bitstream part +- * \param hBs bitstream handle to read from. +- * \param pAacDecoderChannelInfo channel context info to store data into. +- * \param lg the frame length in audio samples. +- * \param first_tcx_flag flag indicating that this is the first TCX frame. +- * \param frame the frame index of the LPD super frame. +- */ +-static AAC_DECODER_ERROR CLpd_TCX_Read( +- HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, int lg, +- int first_tcx_flag, int frame, UINT flags) { +- AAC_DECODER_ERROR errorAAC = AAC_DEC_OK; +- ARITH_CODING_ERROR error = ARITH_CODER_OK; +- FIXP_DBL *pSpec; +- int arith_reset_flag = 0; +- int isFullBandLpd = 0; +- +- pSpec = SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, frame, +- pAacDecoderChannelInfo->granuleLength, isFullBandLpd); +- +- /* TCX noise level */ +- { +- pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_noise_factor[frame] = +- FDKreadBits(hBs, 3); +- } +- /* TCX global gain */ +- pAacDecoderChannelInfo->pDynData->specificTo.usac.tcx_global_gain[frame] = +- FDKreadBits(hBs, 7); +- +- /* Arithmetic coded residual/spectrum */ +- if (first_tcx_flag) { +- if (flags & AC_INDEP) { +- arith_reset_flag = 1; +- } else { +- arith_reset_flag = FDKreadBits(hBs, 1); +- } +- } +- +- /* CArco_DecodeArithData() output scale of "pSpec" is DFRACT_BITS-1 */ +- error = CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs, pSpec, +- lg, lg, arith_reset_flag); +- +- /* Rescale residual/spectrum */ +- { +- int scale = getScalefactor(pSpec, lg) - 2; /* Leave 2 bits headroom */ +- +- /* Exponent of CArco_DecodeArithData() output is DFRACT_BITS; integer +- * values. */ +- scaleValues(pSpec, lg, scale); +- scale = DFRACT_BITS - 1 - scale; +- +- pAacDecoderChannelInfo->specScale[frame] = scale; +- } +- +- if (error == ARITH_CODER_ERROR) errorAAC = AAC_DEC_UNKNOWN; +- +- return errorAAC; +-} +- +-/** +- * \brief translate lpd_mode into the mod[] array which describes the mode of +- * each each LPD frame +- * \param mod[] the array that will be filled with the mode indexes of the +- * inidividual frames. +- * \param lpd_mode the lpd_mode field read from the lpd_channel_stream +- */ +-static AAC_DECODER_ERROR CLpd_ReadAndMapLpdModeToModArray( +- UCHAR mod[4], HANDLE_FDK_BITSTREAM hBs, UINT elFlags) { +- int lpd_mode; +- +- { +- lpd_mode = FDKreadBits(hBs, 5); +- +- if (lpd_mode > 25 || lpd_mode < 0) { +- return AAC_DEC_PARSE_ERROR; +- } +- +- switch (lpd_mode) { +- case 25: +- /* 1 80MS frame */ +- mod[0] = mod[1] = mod[2] = mod[3] = 3; +- break; +- case 24: +- /* 2 40MS frames */ +- mod[0] = mod[1] = mod[2] = mod[3] = 2; +- break; +- default: +- switch (lpd_mode >> 2) { +- case 4: +- /* lpd_mode 19 - 16 => 1 40MS and 2 20MS frames */ +- mod[0] = mod[1] = 2; +- mod[2] = (lpd_mode & 1) ? 1 : 0; +- mod[3] = (lpd_mode & 2) ? 1 : 0; +- break; +- case 5: +- /* lpd_mode 23 - 20 => 2 20MS and 1 40MS frames */ +- mod[2] = mod[3] = 2; +- mod[0] = (lpd_mode & 1) ? 1 : 0; +- mod[1] = (lpd_mode & 2) ? 1 : 0; +- break; +- default: +- /* lpd_mode < 16 => 4 20MS frames */ +- mod[0] = (lpd_mode & 1) ? 1 : 0; +- mod[1] = (lpd_mode & 2) ? 1 : 0; +- mod[2] = (lpd_mode & 4) ? 1 : 0; +- mod[3] = (lpd_mode & 8) ? 1 : 0; +- break; +- } +- break; +- } +- } +- return AAC_DEC_OK; +-} +- +-static void CLpd_Reset( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- int keep_past_signal) { +- int i; +- +- /* Reset TCX / ACELP common memory */ +- if (!keep_past_signal) { +- FDKmemclear(pAacDecoderStaticChannelInfo->old_synth, +- sizeof(pAacDecoderStaticChannelInfo->old_synth)); +- } +- +- /* Initialize the LSFs */ +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- pAacDecoderStaticChannelInfo->lpc4_lsf[i] = fdk_dec_lsf_init[i]; +- } +- +- /* Reset memory needed by bass post-filter */ +- FDKmemclear(pAacDecoderStaticChannelInfo->mem_bpf, +- sizeof(pAacDecoderStaticChannelInfo->mem_bpf)); +- +- pAacDecoderStaticChannelInfo->old_bpf_control_info = 0; +- for (i = 0; i < SYN_SFD; i++) { +- pAacDecoderStaticChannelInfo->old_T_pf[i] = 64; +- pAacDecoderStaticChannelInfo->old_gain_pf[i] = (FIXP_DBL)0; +- } +- +- /* Reset ACELP memory */ +- CLpd_AcelpReset(&pAacDecoderStaticChannelInfo->acelp); +- +- pAacDecoderStaticChannelInfo->last_lpc_lost = 0; /* prev_lpc_lost */ +- pAacDecoderStaticChannelInfo->last_tcx_pitch = L_DIV; /* pitch_tcx */ +- pAacDecoderStaticChannelInfo->numLostLpdFrames = 0; /* nbLostCmpt */ +-} +- +-/* +- * Externally visible functions +- */ +- +-AAC_DECODER_ERROR CLpdChannelStream_Read( +- HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, UINT flags) { +- AAC_DECODER_ERROR error = AAC_DEC_OK; +- int first_tcx_flag; +- int k, nbDiv, fFacDataPresent, first_lpd_flag, acelp_core_mode, +- facGetMemState = 0; +- UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod; +- int lpd_mode_last, prev_frame_was_lpd; +- USAC_COREMODE core_mode_last; +- const int lg_table_offset = 0; +- const int *lg_table = (pAacDecoderChannelInfo->granuleLength == 128) +- ? &lg_table_ccfl[0][lg_table_offset] +- : &lg_table_ccfl[1][lg_table_offset]; +- int last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost; +- +- int last_frame_ok = 1; +- +- INT i_offset; +- UINT samplingRate; +- +- samplingRate = pSamplingRateInfo->samplingRate; +- +- i_offset = +- (INT)(samplingRate * PIT_MIN_12k8 + (FSCALE_DENOM / 2)) / FSCALE_DENOM - +- (INT)PIT_MIN_12k8; +- +- if ((samplingRate < FAC_FSCALE_MIN) || (samplingRate > FAC_FSCALE_MAX)) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- +- acelp_core_mode = FDKreadBits(hBs, 3); +- +- /* lpd_mode */ +- error = CLpd_ReadAndMapLpdModeToModArray(mod, hBs, 0); +- if (error != AAC_DEC_OK) { +- goto bail; +- } +- +- /* bpf_control_info */ +- pAacDecoderChannelInfo->data.usac.bpf_control_info = FDKreadBit(hBs); +- +- /* last_core_mode */ +- prev_frame_was_lpd = FDKreadBit(hBs); +- /* fac_data_present */ +- fFacDataPresent = FDKreadBit(hBs); +- +- /* Set valid values from +- * pAacDecoderStaticChannelInfo->{last_core_mode,last_lpd_mode} */ +- pAacDecoderChannelInfo->data.usac.core_mode_last = +- pAacDecoderStaticChannelInfo->last_core_mode; +- lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last = +- pAacDecoderStaticChannelInfo->last_lpd_mode; +- +- if (prev_frame_was_lpd == 0) { +- /* Last frame was FD */ +- pAacDecoderChannelInfo->data.usac.core_mode_last = FD_LONG; +- pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255; +- } else { +- /* Last frame was LPD */ +- pAacDecoderChannelInfo->data.usac.core_mode_last = LPD; +- if (((mod[0] == 0) && fFacDataPresent) || +- ((mod[0] != 0) && !fFacDataPresent)) { +- /* Currend mod is ACELP, fac data present -> TCX, current mod TCX, no fac +- * data -> TCX */ +- if (lpd_mode_last == 0) { +- /* Bit stream interruption detected. Assume last TCX mode as TCX20. */ +- pAacDecoderChannelInfo->data.usac.lpd_mode_last = 1; +- } +- /* Else assume that remembered TCX mode is correct. */ +- } else { +- pAacDecoderChannelInfo->data.usac.lpd_mode_last = 0; +- } +- } +- +- first_lpd_flag = (pAacDecoderChannelInfo->data.usac.core_mode_last != +- LPD); /* Depends on bitstream configuration */ +- first_tcx_flag = 1; +- +- if (pAacDecoderStaticChannelInfo->last_core_mode != +- LPD) { /* ATTENTION: Reset depends on what we rendered before! */ +- CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, 0); +- +- if (!last_frame_ok) { +- /* If last rendered frame was not LPD and first lpd flag is not set, this +- * must be an error - set last_lpc_lost flag */ +- last_lpc_lost |= (first_lpd_flag) ? 0 : 1; +- } +- } +- +- core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last; +- lpd_mode_last = pAacDecoderChannelInfo->data.usac.lpd_mode_last; +- +- nbDiv = NB_DIV; +- +- /* k is the frame index. If a frame is of size 40MS or 80MS, +- this frame index is incremented 2 or 4 instead of 1 respectively. */ +- +- k = 0; +- while (k < nbDiv) { +- /* Reset FAC data pointers in order to avoid applying old random FAC data. +- */ +- pAacDecoderChannelInfo->data.usac.fac_data[k] = NULL; +- +- if ((k == 0 && core_mode_last == LPD && fFacDataPresent) || +- (lpd_mode_last == 0 && mod[k] > 0) || +- ((lpd_mode_last != 255) && lpd_mode_last > 0 && mod[k] == 0)) { +- int err; +- +- /* Assign FAC memory */ +- pAacDecoderChannelInfo->data.usac.fac_data[k] = +- CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState); +- +- /* FAC for (ACELP -> TCX) or (TCX -> ACELP) */ +- err = CLpd_FAC_Read( +- hBs, pAacDecoderChannelInfo->data.usac.fac_data[k], +- pAacDecoderChannelInfo->data.usac.fac_data_e, +- pAacDecoderChannelInfo->granuleLength, /* == fac_length */ +- 0, k); +- if (err != 0) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- } +- +- if (mod[k] == 0) /* acelp-mode */ +- { +- int err; +- err = CLpd_AcelpRead( +- hBs, &pAacDecoderChannelInfo->data.usac.acelp[k], acelp_core_mode, +- pAacDecoderChannelInfo->granuleLength * 8 /* coreCoderFrameLength */, +- i_offset); +- if (err != 0) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- +- lpd_mode_last = 0; +- k++; +- } else /* mode != 0 => TCX */ +- { +- error = CLpd_TCX_Read(hBs, pAacDecoderChannelInfo, +- pAacDecoderStaticChannelInfo, lg_table[mod[k]], +- first_tcx_flag, k, flags); +- +- lpd_mode_last = mod[k]; +- first_tcx_flag = 0; +- k += 1 << (mod[k] - 1); +- } +- if (error != AAC_DEC_OK) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- } +- +- { +- int err; +- +- /* Read LPC coefficients */ +- err = CLpc_Read( +- hBs, pAacDecoderChannelInfo->data.usac.lsp_coeff, +- pAacDecoderStaticChannelInfo->lpc4_lsf, +- pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand, +- pAacDecoderChannelInfo->data.usac.aStability, mod, first_lpd_flag, +- /* if last lpc4 is available from concealment do not extrapolate lpc0 +- from lpc2 */ +- (mod[0] & 0x3) ? 0 +- : (last_lpc_lost && +- pAacDecoderStaticChannelInfo->last_core_mode != LPD), +- last_frame_ok); +- if (err != 0) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- } +- +- /* adjust old lsp[] following to a bad frame (to avoid overshoot) (ref: +- * dec_LPD.c) */ +- if (last_lpc_lost && !last_frame_ok) { +- int k_next; +- k = 0; +- while (k < nbDiv) { +- int i; +- k_next = k + (((mod[k] & 0x3) == 0) ? 1 : (1 << (mod[k] - 1))); +- FIXP_LPC *lsp_old = pAacDecoderChannelInfo->data.usac.lsp_coeff[k]; +- FIXP_LPC *lsp_new = pAacDecoderChannelInfo->data.usac.lsp_coeff[k_next]; +- +- for (i = 0; i < M_LP_FILTER_ORDER; i++) { +- if (lsp_new[i] < lsp_old[i]) { +- lsp_old[i] = lsp_new[i]; +- } +- } +- k = k_next; +- } +- } +- +- if (pAacDecoderStaticChannelInfo->last_lpd_mode != 0) { +- if (pAacDecoderStaticChannelInfo->last_lpd_mode == 255) { +- /* We need it for TCX decoding or ACELP excitation update */ +- E_LPC_f_lsp_a_conversion( +- pAacDecoderChannelInfo->data.usac.lsp_coeff[0], +- pAacDecoderChannelInfo->data.usac.lp_coeff[0], +- &pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]); +- } else { /* last_lpd_mode was TCX */ +- /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid +- * converting LSP coefficients again). */ +- FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0], +- pAacDecoderStaticChannelInfo->lp_coeff_old[0], +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] = +- pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0]; +- } +- } /* case last_lpd_mode was ACELP is handled by CLpd_TcxDecode() */ +- +- if (fFacDataPresent && (core_mode_last != LPD)) { +- int prev_frame_was_short; +- +- prev_frame_was_short = FDKreadBit(hBs); +- +- if (prev_frame_was_short) { +- core_mode_last = pAacDecoderChannelInfo->data.usac.core_mode_last = +- FD_SHORT; +- pAacDecoderChannelInfo->data.usac.lpd_mode_last = 255; +- +- if ((pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT)) { +- /* USAC Conformance document: +- short_fac_flag shall be encoded with a value of 1 if the +- window_sequence of the previous frame was 2 (EIGHT_SHORT_SEQUENCE). +- Otherwise short_fac_flag shall be encoded with a +- value of 0. */ +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- } +- +- /* Assign memory */ +- pAacDecoderChannelInfo->data.usac.fac_data[0] = +- CLpd_FAC_GetMemory(pAacDecoderChannelInfo, mod, &facGetMemState); +- +- { +- int err; +- +- /* FAC for FD -> ACELP */ +- err = CLpd_FAC_Read( +- hBs, pAacDecoderChannelInfo->data.usac.fac_data[0], +- pAacDecoderChannelInfo->data.usac.fac_data_e, +- CLpd_FAC_getLength(core_mode_last != FD_SHORT, +- pAacDecoderChannelInfo->granuleLength), +- 1, 0); +- if (err != 0) { +- error = AAC_DEC_PARSE_ERROR; +- goto bail; +- } +- } +- } +- +-bail: +- if (error == AAC_DEC_OK) { +- /* check consitency of last core/lpd mode values */ +- if ((pAacDecoderChannelInfo->data.usac.core_mode_last != +- pAacDecoderStaticChannelInfo->last_core_mode) && +- (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) { +- /* Something got wrong! */ +- /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */ +- } else if ((pAacDecoderChannelInfo->data.usac.core_mode_last == LPD) && +- (pAacDecoderChannelInfo->data.usac.lpd_mode_last != +- pAacDecoderStaticChannelInfo->last_lpd_mode) && +- (pAacDecoderStaticChannelInfo->last_lpc_lost == 0)) { +- /* Something got wrong! */ +- /* error = AAC_DEC_PARSE_ERROR; */ /* Throwing errors does not help */ +- } +- } +- +- return error; +-} +- +-void CLpdChannelStream_Decode( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags) { +- UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod; +- int k; +- UCHAR last_lpd_mode; +- int nbDiv = NB_DIV; +- +- /* k is the frame index. If a frame is of size 40MS or 80MS, +- this frame index is incremented 2 or 4 instead of 1 respectively. */ +- k = 0; +- last_lpd_mode = +- pAacDecoderChannelInfo->data.usac +- .lpd_mode_last; /* could be different to what has been rendered */ +- while (k < nbDiv) { +- if (mod[k] == 0) { +- /* ACELP */ +- +- /* If FAC (fac_data[k] != NULL), and previous frame was TCX, apply (TCX) +- * gains to FAC data */ +- if (last_lpd_mode > 0 && last_lpd_mode != 255 && +- pAacDecoderChannelInfo->data.usac.fac_data[k]) { +- CFac_ApplyGains(pAacDecoderChannelInfo->data.usac.fac_data[k], +- pAacDecoderChannelInfo->granuleLength, +- pAacDecoderStaticChannelInfo->last_tcx_gain, +- pAacDecoderStaticChannelInfo->last_alfd_gains, +- (last_lpd_mode < 4) ? last_lpd_mode : 3); +- +- pAacDecoderChannelInfo->data.usac.fac_data_e[k] += +- pAacDecoderStaticChannelInfo->last_tcx_gain_e; +- } +- } else { +- /* TCX */ +- CLpd_TcxDecode(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, +- flags, mod[k], last_lpd_mode, k, 1 /* frameOk == 1 */ +- ); +- +- /* Store TCX gain scale for next possible FAC transition. */ +- pAacDecoderStaticChannelInfo->last_tcx_gain = +- pAacDecoderChannelInfo->data.usac.tcx_gain[k]; +- pAacDecoderStaticChannelInfo->last_tcx_gain_e = +- pAacDecoderChannelInfo->data.usac.tcx_gain_e[k]; +- +- /* If FAC (fac_data[k] != NULL), apply gains */ +- if (last_lpd_mode == 0 && pAacDecoderChannelInfo->data.usac.fac_data[k]) { +- CFac_ApplyGains( +- pAacDecoderChannelInfo->data.usac.fac_data[k], +- pAacDecoderChannelInfo->granuleLength /* == fac_length */, +- pAacDecoderChannelInfo->data.usac.tcx_gain[k], +- pAacDecoderStaticChannelInfo->last_alfd_gains, mod[k]); +- +- pAacDecoderChannelInfo->data.usac.fac_data_e[k] += +- pAacDecoderChannelInfo->data.usac.tcx_gain_e[k]; +- } +- } +- +- /* remember previous mode */ +- last_lpd_mode = mod[k]; +- +- /* Increase k to next frame */ +- k += (mod[k] == 0) ? 1 : (1 << (mod[k] - 1)); +- } +-} +- +-AAC_DECODER_ERROR CLpd_RenderTimeSignal( +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData, +- INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, UINT flags, +- UINT strmFlags) { +- UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod; +- AAC_DECODER_ERROR error = AAC_DEC_OK; +- int k, i_offset; +- int last_k; +- int nrSamples = 0; +- int facFB = 1; +- int nbDiv = NB_DIV; +- int lDiv = lFrame / nbDiv; /* length of division (acelp or tcx20 frame)*/ +- int lFac = lDiv / 2; +- int nbSubfr = +- lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */ +- int nbSubfrSuperfr = nbDiv * nbSubfr; +- int synSfd = (nbSubfrSuperfr / 2) - BPF_SFD; +- int SynDelay = synSfd * L_SUBFR; +- int aacDelay = lFrame / 2; +- +- /* +- In respect to the reference software, the synth pointer here is lagging by +- aacDelay ( == SYN_DELAY + BPF_DELAY ) samples. The corresponding old +- synthesis samples are handled by the IMDCT overlap. +- */ +- +- FIXP_DBL *synth_buf = +- pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->synth_buf; +- FIXP_DBL *synth = synth_buf + PIT_MAX_MAX - BPF_DELAY; +- UCHAR last_lpd_mode, last_last_lpd_mode, last_lpc_lost, last_frame_lost; +- +- INT pitch[NB_SUBFR_SUPERFR + SYN_SFD]; +- FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD]; +- +- const int *lg_table; +- int lg_table_offset = 0; +- +- UINT samplingRate = pSamplingRateInfo->samplingRate; +- +- FDKmemclear(pitch, (NB_SUBFR_SUPERFR + SYN_SFD) * sizeof(INT)); +- +- if (flags & AACDEC_FLUSH) { +- CLpd_Reset(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, +- flags & AACDEC_FLUSH); +- frameOk = 0; +- } +- +- switch (lFrame) { +- case 1024: +- lg_table = &lg_table_ccfl[0][lg_table_offset]; +- break; +- case 768: +- lg_table = &lg_table_ccfl[1][lg_table_offset]; +- break; +- default: +- FDK_ASSERT(0); +- return AAC_DEC_UNKNOWN; +- } +- +- last_frame_lost = 0; +- +- /* Maintain LPD mode from previous frame */ +- if ((pAacDecoderStaticChannelInfo->last_core_mode == FD_LONG) || +- (pAacDecoderStaticChannelInfo->last_core_mode == FD_SHORT)) { +- pAacDecoderStaticChannelInfo->last_lpd_mode = 255; +- } +- +- if (!frameOk) { +- FIXP_DBL old_tcx_gain; +- FIXP_SGL old_stab; +- SCHAR old_tcx_gain_e; +- int nLostSf; +- +- last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode; +- old_tcx_gain = pAacDecoderStaticChannelInfo->last_tcx_gain; +- old_tcx_gain_e = pAacDecoderStaticChannelInfo->last_tcx_gain_e; +- old_stab = pAacDecoderStaticChannelInfo->oldStability; +- nLostSf = pAacDecoderStaticChannelInfo->numLostLpdFrames; +- +- /* patch the last LPD mode */ +- pAacDecoderChannelInfo->data.usac.lpd_mode_last = last_lpd_mode; +- +- /* Do mode extrapolation and repeat the previous mode: +- if previous mode = ACELP -> ACELP +- if previous mode = TCX-20/40 -> TCX-20 +- if previous mode = TCX-80 -> TCX-80 +- notes: +- - ACELP is not allowed after TCX (no pitch information to reuse) +- - TCX-40 is not allowed in the mode repetition to keep the logic simple +- */ +- switch (last_lpd_mode) { +- case 0: +- mod[0] = mod[1] = mod[2] = mod[3] = 0; /* -> ACELP concealment */ +- break; +- case 3: +- mod[0] = mod[1] = mod[2] = mod[3] = 3; /* -> TCX FD concealment */ +- break; +- case 2: +- mod[0] = mod[1] = mod[2] = mod[3] = 2; /* -> TCX FD concealment */ +- break; +- case 1: +- default: +- mod[0] = mod[1] = mod[2] = mod[3] = 4; /* -> TCX TD concealment */ +- break; +- } +- +- /* LPC extrapolation */ +- CLpc_Conceal(pAacDecoderChannelInfo->data.usac.lsp_coeff, +- pAacDecoderStaticChannelInfo->lpc4_lsf, +- pAacDecoderStaticChannelInfo->lsf_adaptive_mean, +- /*(pAacDecoderStaticChannelInfo->numLostLpdFrames == 0) ||*/ +- (last_lpd_mode == 255)); +- +- if ((last_lpd_mode > 0) && (last_lpd_mode < 255)) { +- /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid +- * converting LSP coefficients again). */ +- FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0], +- pAacDecoderStaticChannelInfo->lp_coeff_old[0], +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] = +- pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0]; +- } /* case last_lpd_mode was ACELP is handled by CLpd_TcxDecode() */ +- /* case last_lpd_mode was Time domain TCX concealment is handled after this +- * "if (!frameOk)"-block */ +- +- /* k is the frame index. If a frame is of size 40MS or 80MS, +- this frame index is incremented 2 or 4 instead of 1 respectively. */ +- k = 0; +- while (k < nbDiv) { +- pAacDecoderChannelInfo->data.usac.tcx_gain[k] = old_tcx_gain; +- pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] = old_tcx_gain_e; +- +- /* restore stability value from last frame */ +- pAacDecoderChannelInfo->data.usac.aStability[k] = old_stab; +- +- /* Increase k to next frame */ +- k += ((mod[k] & 0x3) == 0) ? 1 : (1 << ((mod[k] & 0x3) - 1)); +- +- nLostSf++; +- } +- } else { +- if ((pAacDecoderStaticChannelInfo->last_lpd_mode == 4) && (mod[0] > 0)) { +- /* Copy old LPC4 LP domain coefficients to LPC0 LP domain buffer (to avoid +- * converting LSP coefficients again). */ +- FDKmemcpy(pAacDecoderChannelInfo->data.usac.lp_coeff[0], +- pAacDecoderStaticChannelInfo->lp_coeff_old[0], +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0] = +- pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0]; +- } +- } +- +- Acelp_PreProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth, pitch, +- pAacDecoderStaticChannelInfo->old_T_pf, pit_gain, +- pAacDecoderStaticChannelInfo->old_gain_pf, samplingRate, +- &i_offset, lFrame, synSfd, nbSubfrSuperfr); +- +- /* k is the frame index. If a frame is of size 40MS or 80MS, +- this frame index is incremented 2 or 4 instead of 1 respectively. */ +- k = 0; +- last_k = -1; /* mark invalid */ +- last_lpd_mode = pAacDecoderStaticChannelInfo->last_lpd_mode; +- last_last_lpd_mode = pAacDecoderStaticChannelInfo->last_last_lpd_mode; +- last_lpc_lost = pAacDecoderStaticChannelInfo->last_lpc_lost | last_frame_lost; +- +- /* This buffer must be avalable for the case of FD->ACELP transition. The +- beginning of the buffer is used after the BPF to overwrite the output signal. +- Only the FAC area must be affected by the BPF */ +- +- while (k < nbDiv) { +- if (frameOk == 0) { +- pAacDecoderStaticChannelInfo->numLostLpdFrames++; +- } else { +- last_frame_lost |= +- (pAacDecoderStaticChannelInfo->numLostLpdFrames > 0) ? 1 : 0; +- pAacDecoderStaticChannelInfo->numLostLpdFrames = 0; +- } +- if (mod[k] == 0 || mod[k] == 4) { +- /* ACELP or TCX time domain concealment */ +- FIXP_DBL *acelp_out; +- +- /* FAC management */ +- if ((last_lpd_mode != 0) && (last_lpd_mode != 4)) /* TCX TD concealment */ +- { +- FIXP_DBL *pFacData = NULL; +- +- if (frameOk && !last_frame_lost) { +- pFacData = pAacDecoderChannelInfo->data.usac.fac_data[k]; +- } +- +- nrSamples += CLpd_FAC_Mdct2Acelp( +- &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples, pFacData, +- pAacDecoderChannelInfo->data.usac.fac_data_e[k], +- pAacDecoderChannelInfo->data.usac.lp_coeff[k], +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k], +- lFrame - nrSamples, +- CLpd_FAC_getLength( +- (pAacDecoderStaticChannelInfo->last_core_mode != FD_SHORT) || +- (k > 0), +- lFac), +- (pAacDecoderStaticChannelInfo->last_core_mode != LPD) && (k == 0), +- 0); +- +- FDKmemcpy( +- synth + nrSamples, pAacDecoderStaticChannelInfo->IMdct.overlap.time, +- pAacDecoderStaticChannelInfo->IMdct.ov_offset * sizeof(FIXP_DBL)); +- { +- FIXP_LPC *lp_prev = +- pAacDecoderChannelInfo->data.usac +- .lp_coeff[0]; /* init value does not real matter */ +- INT lp_prev_exp = pAacDecoderChannelInfo->data.usac.lp_coeff_exp[0]; +- +- if (last_lpd_mode != 255) { /* last mode was tcx */ +- last_k = k - (1 << (last_lpd_mode - 1)); +- if (last_k < 0) { +- lp_prev = pAacDecoderStaticChannelInfo->lp_coeff_old[1]; +- lp_prev_exp = pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1]; +- } else { +- lp_prev = pAacDecoderChannelInfo->data.usac.lp_coeff[last_k]; +- lp_prev_exp = +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k]; +- } +- } +- +- CLpd_AcelpPrepareInternalMem( +- synth + aacDelay + k * lDiv, last_lpd_mode, +- (last_last_lpd_mode == 4) ? 0 : last_last_lpd_mode, +- pAacDecoderChannelInfo->data.usac.lp_coeff[k], +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k], lp_prev, +- lp_prev_exp, &pAacDecoderStaticChannelInfo->acelp, lFrame, +- (last_frame_lost && k < 2), mod[k]); +- } +- } else { +- if (k == 0 && pAacDecoderStaticChannelInfo->IMdct.ov_offset != +- lFrame / facFB / 2) { +- pAacDecoderStaticChannelInfo->IMdct.ov_offset = lFrame / facFB / 2; +- } +- nrSamples += imdct_drain(&pAacDecoderStaticChannelInfo->IMdct, +- synth + nrSamples, lFrame / facFB - nrSamples); +- } +- +- if (nrSamples >= lFrame / facFB) { +- /* Write ACELP time domain samples into IMDCT overlap buffer at +- * pAacDecoderStaticChannelInfo->IMdct.overlap.time + +- * pAacDecoderStaticChannelInfo->IMdct.ov_offset +- */ +- acelp_out = pAacDecoderStaticChannelInfo->IMdct.overlap.time + +- pAacDecoderStaticChannelInfo->IMdct.ov_offset; +- +- /* Account ACELP time domain output samples to overlap buffer */ +- pAacDecoderStaticChannelInfo->IMdct.ov_offset += lDiv; +- } else { +- /* Write ACELP time domain samples into output buffer at pTimeData + +- * nrSamples */ +- acelp_out = synth + nrSamples; +- +- /* Account ACELP time domain output samples to output buffer */ +- nrSamples += lDiv; +- } +- +- if (mod[k] == 4) { +- pAacDecoderStaticChannelInfo->acelp.wsyn_rms = scaleValue( +- pAacDecoderChannelInfo->data.usac.tcx_gain[k], +- fixMin(0, +- pAacDecoderChannelInfo->data.usac.tcx_gain_e[k] - SF_EXC)); +- CLpd_TcxTDConceal(&pAacDecoderStaticChannelInfo->acelp, +- &pAacDecoderStaticChannelInfo->last_tcx_pitch, +- pAacDecoderChannelInfo->data.usac.lsp_coeff[k], +- pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1], +- pAacDecoderChannelInfo->data.usac.aStability[k], +- pAacDecoderStaticChannelInfo->numLostLpdFrames, +- acelp_out, lFrame, +- pAacDecoderStaticChannelInfo->last_tcx_noise_factor); +- +- } else { +- FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[k] >= +- (FIXP_SGL)0); +- CLpd_AcelpDecode(&pAacDecoderStaticChannelInfo->acelp, i_offset, +- pAacDecoderChannelInfo->data.usac.lsp_coeff[k], +- pAacDecoderChannelInfo->data.usac.lsp_coeff[k + 1], +- pAacDecoderChannelInfo->data.usac.aStability[k], +- &pAacDecoderChannelInfo->data.usac.acelp[k], +- pAacDecoderStaticChannelInfo->numLostLpdFrames, +- last_lpc_lost, k, acelp_out, +- &pitch[(k * nbSubfr) + synSfd], +- &pit_gain[(k * nbSubfr) + synSfd], lFrame); +- } +- +- if (mod[k] != 4) { +- if (last_lpd_mode != 0 && +- pAacDecoderChannelInfo->data.usac +- .bpf_control_info) { /* FD/TCX -> ACELP transition */ +- /* bass post-filter past FAC area (past two (one for FD short) +- * subframes) */ +- int currentSf = synSfd + k * nbSubfr; +- +- if ((k > 0) || (pAacDecoderStaticChannelInfo->last_core_mode != +- FD_SHORT)) { /* TCX or FD long -> ACELP */ +- pitch[currentSf - 2] = pitch[currentSf - 1] = pitch[currentSf]; +- pit_gain[currentSf - 2] = pit_gain[currentSf - 1] = +- pit_gain[currentSf]; +- } else { /* FD short -> ACELP */ +- pitch[currentSf - 1] = pitch[currentSf]; +- pit_gain[currentSf - 1] = pit_gain[currentSf]; +- } +- } +- } +- } else { /* TCX */ +- int lg = lg_table[mod[k]]; +- int isFullBandLpd = 0; +- +- /* FAC management */ +- if ((last_lpd_mode == 0) || (last_lpd_mode == 4)) /* TCX TD concealment */ +- { +- C_AALLOC_SCRATCH_START(fac_buf, FIXP_DBL, 1024 / 8); +- +- /* pAacDecoderChannelInfo->data.usac.fac_data[k] == NULL means no FAC +- * data available. */ +- if (last_frame_lost == 1 || +- pAacDecoderChannelInfo->data.usac.fac_data[k] == NULL) { +- FDKmemclear(fac_buf, 1024 / 8 * sizeof(FIXP_DBL)); +- pAacDecoderChannelInfo->data.usac.fac_data[k] = fac_buf; +- pAacDecoderChannelInfo->data.usac.fac_data_e[k] = 0; +- } +- +- nrSamples += CLpd_FAC_Acelp2Mdct( +- &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples, +- SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k, +- pAacDecoderChannelInfo->granuleLength, isFullBandLpd), +- pAacDecoderChannelInfo->specScale + k, 1, +- pAacDecoderChannelInfo->data.usac.fac_data[k], +- pAacDecoderChannelInfo->data.usac.fac_data_e[k], +- pAacDecoderChannelInfo->granuleLength /* == fac_length */, +- lFrame - nrSamples, lg, +- FDKgetWindowSlope(lDiv, +- GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- lDiv, pAacDecoderChannelInfo->data.usac.lp_coeff[k], +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[k], +- &pAacDecoderStaticChannelInfo->acelp, +- pAacDecoderChannelInfo->data.usac.tcx_gain[k], +- (last_frame_lost || !frameOk), 0 /* is not FD FAC */ +- , +- last_lpd_mode, k, +- pAacDecoderChannelInfo +- ->currAliasingSymmetry /* Note: The current aliasing +- symmetry for a TCX (i.e. LPD) +- frame must always be 0 */ +- ); +- +- pitch[(k * nbSubfr) + synSfd + 1] = pitch[(k * nbSubfr) + synSfd] = +- pitch[(k * nbSubfr) + synSfd - 1]; +- pit_gain[(k * nbSubfr) + synSfd + 1] = +- pit_gain[(k * nbSubfr) + synSfd] = +- pit_gain[(k * nbSubfr) + synSfd - 1]; +- +- C_AALLOC_SCRATCH_END(fac_buf, FIXP_DBL, 1024 / 8); +- } else { +- int tl = lg; +- int fl = lDiv; +- int fr = lDiv; +- +- nrSamples += imlt_block( +- &pAacDecoderStaticChannelInfo->IMdct, synth + nrSamples, +- SPEC_TCX(pAacDecoderChannelInfo->pSpectralCoefficient, k, +- pAacDecoderChannelInfo->granuleLength, isFullBandLpd), +- pAacDecoderChannelInfo->specScale + k, 1, lFrame - nrSamples, tl, +- FDKgetWindowSlope(fl, +- GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- fl, +- FDKgetWindowSlope(fr, +- GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), +- fr, pAacDecoderChannelInfo->data.usac.tcx_gain[k], +- pAacDecoderChannelInfo->currAliasingSymmetry +- ? MLT_FLAG_CURR_ALIAS_SYMMETRY +- : 0); +- } +- } +- /* remember previous mode */ +- last_last_lpd_mode = last_lpd_mode; +- last_lpd_mode = mod[k]; +- last_lpc_lost = (frameOk == 0) ? 1 : 0; +- +- /* Increase k to next frame */ +- last_k = k; +- k += ((mod[k] & 0x3) == 0) ? 1 : (1 << (mod[k] - 1)); +- } +- +- if (frameOk) { +- /* assume data was ok => store for concealment */ +- FDK_ASSERT(pAacDecoderChannelInfo->data.usac.aStability[last_k] >= +- (FIXP_SGL)0); +- pAacDecoderStaticChannelInfo->oldStability = +- pAacDecoderChannelInfo->data.usac.aStability[last_k]; +- FDKmemcpy(pAacDecoderStaticChannelInfo->lsf_adaptive_mean, +- pAacDecoderChannelInfo->data.usac.lsf_adaptive_mean_cand, +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- } +- +- /* store past lp coeffs for next superframe (they are only valid and needed if +- * last_lpd_mode was tcx) */ +- if (last_lpd_mode > 0) { +- FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[0], +- pAacDecoderChannelInfo->data.usac.lp_coeff[nbDiv], +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- pAacDecoderStaticChannelInfo->lp_coeff_old_exp[0] = +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[nbDiv]; +- FDKmemcpy(pAacDecoderStaticChannelInfo->lp_coeff_old[1], +- pAacDecoderChannelInfo->data.usac.lp_coeff[last_k], +- M_LP_FILTER_ORDER * sizeof(FIXP_LPC)); +- pAacDecoderStaticChannelInfo->lp_coeff_old_exp[1] = +- pAacDecoderChannelInfo->data.usac.lp_coeff_exp[last_k]; +- } +- +- FDK_ASSERT(nrSamples == lFrame); +- +- /* check whether usage of bass postfilter was de-activated in the bitstream; +- if yes, set pitch gain to 0 */ +- if (!(pAacDecoderChannelInfo->data.usac.bpf_control_info)) { +- if (mod[0] != 0 && (pAacDecoderStaticChannelInfo->old_bpf_control_info)) { +- for (int i = 2; i < nbSubfrSuperfr; i++) +- pit_gain[synSfd + i] = (FIXP_DBL)0; +- } else { +- for (int i = 0; i < nbSubfrSuperfr; i++) +- pit_gain[synSfd + i] = (FIXP_DBL)0; +- } +- } +- +- /* for bass postfilter */ +- for (int n = 0; n < synSfd; n++) { +- pAacDecoderStaticChannelInfo->old_T_pf[n] = pitch[nbSubfrSuperfr + n]; +- pAacDecoderStaticChannelInfo->old_gain_pf[n] = pit_gain[nbSubfrSuperfr + n]; +- } +- +- pAacDecoderStaticChannelInfo->old_bpf_control_info = +- pAacDecoderChannelInfo->data.usac.bpf_control_info; +- +- { +- INT lookahead = -BPF_DELAY; +- int copySamp = (mod[nbDiv - 1] == 0) ? (aacDelay) : (aacDelay - lFac); +- +- /* Copy enough time domain samples from MDCT to synthesis buffer as needed +- * by the bass postfilter */ +- +- lookahead += imdct_copy_ov_and_nr(&pAacDecoderStaticChannelInfo->IMdct, +- synth + nrSamples, copySamp); +- +- FDK_ASSERT(lookahead == copySamp - BPF_DELAY); +- +- FIXP_DBL *p2_synth = synth + BPF_DELAY; +- +- /* recalculate pitch gain to allow postfilering on FAC area */ +- for (int i = 0; i < nbSubfrSuperfr; i++) { +- int T = pitch[i]; +- FIXP_DBL gain = pit_gain[i]; +- +- if (gain > (FIXP_DBL)0) { +- gain = get_gain(&p2_synth[i * L_SUBFR], &p2_synth[(i * L_SUBFR) - T], +- L_SUBFR); +- pit_gain[i] = gain; +- } +- } +- +- { +- bass_pf_1sf_delay(p2_synth, pitch, pit_gain, lFrame, lFrame / facFB, +- mod[nbDiv - 1] ? (SynDelay - (lDiv / 2)) : SynDelay, +- pTimeData, pAacDecoderStaticChannelInfo->mem_bpf); +- } +- } +- +- Acelp_PostProcessing(synth_buf, pAacDecoderStaticChannelInfo->old_synth, +- pitch, pAacDecoderStaticChannelInfo->old_T_pf, lFrame, +- synSfd, nbSubfrSuperfr); +- +- /* Store last mode for next super frame */ +- { pAacDecoderStaticChannelInfo->last_core_mode = LPD; } +- pAacDecoderStaticChannelInfo->last_lpd_mode = last_lpd_mode; +- pAacDecoderStaticChannelInfo->last_last_lpd_mode = last_last_lpd_mode; +- pAacDecoderStaticChannelInfo->last_lpc_lost = last_lpc_lost; +- +- return error; +-} +diff --git a/libAACdec/src/usacdec_lpd.h b/libAACdec/src/usacdec_lpd.h +deleted file mode 100644 +index 3e7938d..0000000 +--- a/libAACdec/src/usacdec_lpd.h ++++ /dev/null +@@ -1,198 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): Manuel Jander +- +- Description: USAC Linear Prediction Domain coding +- +-*******************************************************************************/ +- +-#ifndef USACDEC_LPD_H +-#define USACDEC_LPD_H +- +-#include "channelinfo.h" +- +-#define OPTIMIZE_AVG_PERFORMANCE +- +-/** +- * \brief read a lpd_channel_stream. +- * \param hBs a bit stream handle, where the lpd_channel_stream is located. +- * \param pAacDecoderChannelInfo the channel context structure for storing read +- * data. +- * \param flags bit stream syntax flags. +- * \return AAC_DECODER_ERROR error code. +- */ +-AAC_DECODER_ERROR CLpdChannelStream_Read( +- HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- const SamplingRateInfo *pSamplingRateInfo, UINT flags); +- +-/** +- * \brief decode one lpd_channel_stream and render the audio output. +- * \param pAacDecoderChannelInfo struct holding the channel information to be +- * rendered. +- * \param pAacDecoderStaticChannelInfo struct holding the persistent channel +- * information to be rendered. +- * \param pSamplingRateInfo holds the sampling rate information +- * \param elFlags holds the internal decoder flags +- */ +-void CLpdChannelStream_Decode( +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, UINT flags); +- +-/** +- * \brief generate time domain output signal for LPD channel streams +- * \param pAacDecoderStaticChannelInfo +- * \param pAacDecoderChannelInfo +- * \param pTimeData pointer to output buffer +- * \param samplesPerFrame amount of output samples +- * \param pSamplingRateInfo holds the sampling rate information +- * \param pWorkBuffer1 pointer to work buffer for temporal data +- */ +-AAC_DECODER_ERROR CLpd_RenderTimeSignal( +- CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, +- CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData, +- INT samplesPerFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, +- UINT flags, UINT strmFlags); +- +-static inline INT CLpd_FAC_getLength(int fNotShortBlock, int fac_length_long) { +- if (fNotShortBlock) { +- return (fac_length_long); +- } else { +- return fac_length_long / 2; +- } +-} +- +-void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise, +- const FIXP_SGL *filt, INT stop, int len); +- +-/** +- * \brief perform a low-frequency pitch enhancement on time domain signal +- * \param[in] syn pointer to time domain input signal +- * \param[in] synFB pointer to time domain input signal +- * \param[in] upsampling factor +- * \param[in] T_sf array with past decoded pitch period values for each subframe +- * \param[in] non_zero_gain_flags indicates whether pitch gains of past +- * subframes are zero or not, msb -> [1 BPF_DELAY subfr][7 SYN_DELAY subfr][16 +- * new subfr] <- lsb +- * \param[in] l_frame length of filtering, must be multiple of L_SUBFR +- * \param[in] l_next length of allowed look ahead on syn[i], i < l_frame+l_next +- * \param[out] synth_out pointer to time domain output signal +- * \param[in,out] mem_bpf pointer to filter memory (L_FILT+L_SUBFR) +- */ +- +-void bass_pf_1sf_delay(FIXP_DBL syn[], const INT T_sf[], FIXP_DBL *pit_gain, +- const int frame_length, const INT l_frame, +- const INT l_next, FIXP_PCM *synth_out, +- FIXP_DBL mem_bpf[]); +- +-/** +- * \brief random sign generator for FD and TCX noise filling +- * \param[in,out] seed pointer to random seed +- * \return if return value is zero use positive sign +- * \Note: This code is also implemented as a copy in block.cpp, grep for +- * "UsacRandomSign" +- */ +-FDK_INLINE +-int UsacRandomSign(ULONG *seed) { +- *seed = (ULONG)((UINT64)(*seed) * 69069 + 5); +- +- return (int)((*seed) & 0x10000); +-} +- +-void CFdp_Reset(CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo); +- +-#endif /* USACDEC_LPD_H */ +diff --git a/libAACdec/src/usacdec_rom.cpp b/libAACdec/src/usacdec_rom.cpp +deleted file mode 100644 +index ca3009e..0000000 +--- a/libAACdec/src/usacdec_rom.cpp ++++ /dev/null +@@ -1,1504 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): M. Jander +- +- Description: +- +-*******************************************************************************/ +- +-#include "usacdec_rom.h" +- +-#define NB_SPHERE 32 +-#define NB_LEADER 37 +-#define NB_LDSIGN 226 +-#define NB_LDQ3 9 +-#define NB_LDQ4 28 +- +-/* For bass post filter */ +-#define FL2FXCONST_SGL_FILT(a) FL2FXCONST_SGL(a*(1 << SF_FILT_LP)) +-#define SF_FILT_LP 1 +- +-/* table of factorial */ +-const UINT fdk_dec_tab_factorial[8] = {5040, 720, 120, 24, 6, 2, 1, 1}; +- +-/* Da - Absolute leaders */ +-const UCHAR fdk_dec_Da[NB_LEADER][8] = { +- {1, 1, 1, 1, 1, 1, 1, 1}, {2, 2, 0, 0, 0, 0, 0, 0}, +- {2, 2, 2, 2, 0, 0, 0, 0}, {3, 1, 1, 1, 1, 1, 1, 1}, +- {4, 0, 0, 0, 0, 0, 0, 0}, {2, 2, 2, 2, 2, 2, 0, 0}, +- {3, 3, 1, 1, 1, 1, 1, 1}, {4, 2, 2, 0, 0, 0, 0, 0}, +- {2, 2, 2, 2, 2, 2, 2, 2}, {3, 3, 3, 1, 1, 1, 1, 1}, +- {4, 2, 2, 2, 2, 0, 0, 0}, {4, 4, 0, 0, 0, 0, 0, 0}, +- {5, 1, 1, 1, 1, 1, 1, 1}, {3, 3, 3, 3, 1, 1, 1, 1}, +- {4, 2, 2, 2, 2, 2, 2, 0}, {4, 4, 2, 2, 0, 0, 0, 0}, +- {5, 3, 1, 1, 1, 1, 1, 1}, {6, 2, 0, 0, 0, 0, 0, 0}, +- {4, 4, 4, 0, 0, 0, 0, 0}, {6, 2, 2, 2, 0, 0, 0, 0}, +- {6, 4, 2, 0, 0, 0, 0, 0}, {7, 1, 1, 1, 1, 1, 1, 1}, +- {8, 0, 0, 0, 0, 0, 0, 0}, {6, 6, 0, 0, 0, 0, 0, 0}, +- {8, 2, 2, 0, 0, 0, 0, 0}, {8, 4, 0, 0, 0, 0, 0, 0}, +- {9, 1, 1, 1, 1, 1, 1, 1}, {10, 2, 0, 0, 0, 0, 0, 0}, +- {8, 8, 0, 0, 0, 0, 0, 0}, {10, 6, 0, 0, 0, 0, 0, 0}, +- {12, 0, 0, 0, 0, 0, 0, 0}, {12, 4, 0, 0, 0, 0, 0, 0}, +- {10, 10, 0, 0, 0, 0, 0, 0}, {14, 2, 0, 0, 0, 0, 0, 0}, +- {12, 8, 0, 0, 0, 0, 0, 0}, {16, 0, 0, 0, 0, 0, 0, 0}, +- {20, 0, 0, 0, 0, 0, 0, 0}}; +- +-/* Ds - Sign codes of all signed leaders */ +-const UCHAR fdk_dec_Ds[NB_LDSIGN] = { +- 0, 3, 15, 63, 255, 0, 64, 192, 0, 16, 48, 112, 240, 1, 7, +- 31, 127, 128, 131, 143, 191, 0, 128, 0, 4, 12, 28, 60, 124, 252, +- 0, 3, 15, 63, 65, 71, 95, 192, 195, 207, 255, 0, 32, 96, 128, +- 160, 224, 0, 1, 3, 7, 15, 31, 63, 127, 255, 1, 7, 31, 32, +- 35, 47, 97, 103, 127, 224, 227, 239, 0, 8, 24, 56, 120, 128, 136, +- 152, 184, 248, 0, 64, 192, 0, 3, 15, 63, 129, 135, 159, 255, 0, +- 3, 15, 17, 23, 48, 51, 63, 113, 119, 240, 243, 255, 0, 2, 6, +- 14, 30, 62, 126, 128, 130, 134, 142, 158, 190, 254, 0, 16, 48, 64, +- 80, 112, 192, 208, 240, 1, 7, 31, 64, 67, 79, 127, 128, 131, 143, +- 191, 193, 199, 223, 0, 64, 128, 192, 0, 32, 96, 224, 0, 16, 48, +- 112, 128, 144, 176, 240, 0, 32, 64, 96, 128, 160, 192, 224, 1, 7, +- 31, 127, 128, 131, 143, 191, 0, 128, 0, 64, 192, 0, 32, 96, 128, +- 160, 224, 0, 64, 128, 192, 0, 3, 15, 63, 129, 135, 159, 255, 0, +- 64, 128, 192, 0, 64, 192, 0, 64, 128, 192, 0, 128, 0, 64, 128, +- 192, 0, 64, 192, 0, 64, 128, 192, 0, 64, 128, 192, 0, 128, 0, +- 128}; +- +-/* Ns - Number of signed leader associated to a given absolute leader */ +-const UCHAR fdk_dec_Ns[NB_LEADER] = { +- 5, 3, 5, 8, 2, 7, 11, 6, 9, 12, 10, 3, 8, 13, 14, 9, 14, 4, 4, +- 8, 8, 8, 2, 3, 6, 4, 8, 4, 3, 4, 2, 4, 3, 4, 4, 2, 2}; +- +-/* Ia - Position of the first signed leader associated to an absolute leader */ +-const UCHAR fdk_dec_Ia[NB_LEADER] = { +- 0, 5, 8, 13, 21, 23, 30, 41, 47, 56, 68, 78, 81, +- 89, 102, 116, 125, 139, 143, 147, 155, 163, 171, 173, 176, 182, +- 186, 194, 198, 201, 205, 207, 211, 214, 218, 222, 224}; +- +-/* Is - Cardinalite offset of signed leaders */ +-const USHORT fdk_dec_Is[NB_LDSIGN] = { +- 0, 1, 29, 99, 127, 128, 156, 212, 256, 326, 606, +- 1026, 1306, 1376, 1432, 1712, 1880, 1888, 1896, 2064, 2344, 240, +- 248, 0, 28, 196, 616, 1176, 1596, 1764, 1792, 1820, 2240, +- 2660, 2688, 3024, 4144, 4480, 4508, 4928, 5348, 2400, 2568, 2904, +- 3072, 3240, 3576, 5376, 5377, 5385, 5413, 5469, 5539, 5595, 5623, +- 5631, 5632, 5912, 6472, 6528, 6696, 8376, 9216, 10056, 11736, 11904, +- 11960, 12520, 12800, 13080, 14200, 15880, 17000, 17280, 17560, 18680, 20360, +- 21480, 3744, 3772, 3828, 21760, 21768, 21936, 22216, 22272, 22328, 22608, +- 22776, 22784, 22854, 23274, 23344, 24464, 25584, 26004, 28524, 28944, 30064, +- 31184, 31254, 31674, 31744, 31800, 32136, 32976, 34096, 34936, 35272, 35328, +- 35384, 35720, 36560, 37680, 38520, 38856, 38912, 39332, 40172, 40592, 41432, +- 43112, 43952, 44372, 45212, 45632, 45968, 47088, 47424, 47480, 48320, 49160, +- 49216, 49272, 50112, 50952, 51008, 51344, 52464, 3856, 3912, 3968, 4024, +- 52800, 52856, 53024, 53192, 53248, 53528, 54368, 55208, 55488, 55768, 56608, +- 57448, 57728, 58064, 58400, 58736, 59072, 59408, 59744, 60080, 60416, 60472, +- 60752, 60920, 60928, 60936, 61104, 61384, 4080, 4088, 61440, 61468, 61524, +- 61552, 61720, 62056, 62224, 62392, 62728, 62896, 62952, 63008, 63064, 63120, +- 63128, 63296, 63576, 63632, 63688, 63968, 64136, 64144, 64200, 64256, 64312, +- 64368, 64396, 64452, 64480, 64536, 64592, 64648, 64704, 64712, 64720, 64776, +- 64832, 64888, 64944, 64972, 65028, 65056, 65112, 65168, 65224, 65280, 65336, +- 65392, 65448, 65504, 65512, 65520, 65528}; +- +-/* A3 - Number of the absolute leaders in codebooks Q2 and Q3 */ +-const UCHAR fdk_dec_A3[NB_LDQ3] = {0, 1, 4, 2, 3, 7, 11, 17, 22}; +- +-/* A4 - Number of the absolute leaders in codebook Q4 */ +-const UCHAR fdk_dec_A4[NB_LDQ4] = {5, 6, 8, 9, 10, 12, 13, 14, 15, 16, +- 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, +- 29, 30, 31, 32, 33, 34, 35, 36}; +- +-/* I3 - Cardinality offsets for absolute leaders in Q3 */ +-const USHORT fdk_dec_I3[NB_LDQ3] = {0, 128, 240, 256, 1376, +- 2400, 3744, 3856, 4080}; +- +-/* I4 - Cardinality offset for absolute leaders in Q4 */ +-const USHORT fdk_dec_I4[NB_LDQ4] = { +- 0, 1792, 5376, 5632, 12800, 21760, 22784, 31744, 38912, 45632, +- 52800, 53248, 57728, 60416, 61440, 61552, 62896, 63120, 64144, 64368, +- 64480, 64704, 64720, 64944, 65056, 65280, 65504, 65520}; +- +-/* Initial ISF memory for concealment case */ +-#define LSFI(x) ((x) << (FRACT_BITS - LSF_SCALE - 1)) +- +-const FIXP_LPC fdk_dec_lsf_init[16] = {1506, 3012, 4518, 6024, 7529, 9035, +- 10541, 12047, 13553, 15059, 16565, 18071, +- 19576, 21082, 22588, 24094}; +- +-/* dico_lsf_abs_8b is scaled by 1/(1<<13) */ +-#define DICO(x) FX_DBL2FXCONST_LPC(x >> (LSF_SCALE - 13)) +- +-const FIXP_LPC fdk_dec_dico_lsf_abs_8b[] = { +- DICO(0x05e57fe8), DICO(0x0ac00810), DICO(0x11ed8500), DICO(0x16d42ce0), +- DICO(0x1beb1e20), DICO(0x217eaf40), DICO(0x2768c740), DICO(0x2d26f600), +- DICO(0x32fe68c0), DICO(0x38b1d980), DICO(0x3e95bd80), DICO(0x446dab00), +- DICO(0x4abfd280), DICO(0x5094b380), DICO(0x56ccb800), DICO(0x5c9aba00), +- DICO(0x09660ca0), DICO(0x10ab4c00), DICO(0x15a16f20), DICO(0x19d3c780), +- DICO(0x1ee99060), DICO(0x241d1200), DICO(0x29c83700), DICO(0x2f098f00), +- DICO(0x34803fc0), DICO(0x3a37bc00), DICO(0x3ff55580), DICO(0x45da9280), +- DICO(0x4bec6700), DICO(0x5169e300), DICO(0x57797c80), DICO(0x5d09ae80), +- DICO(0x08a203b0), DICO(0x0d6ed1a0), DICO(0x152ccf20), DICO(0x19639dc0), +- DICO(0x1d7e3e60), DICO(0x21f4a7c0), DICO(0x27b2f8c0), DICO(0x2dbb4480), +- DICO(0x33ecde80), DICO(0x3982e100), DICO(0x3ea16100), DICO(0x43ab6080), +- DICO(0x49534a80), DICO(0x4ea7e100), DICO(0x550d6300), DICO(0x5bcdcc80), +- DICO(0x072dd048), DICO(0x0c654690), DICO(0x1436e940), DICO(0x19459680), +- DICO(0x1e0041c0), DICO(0x2240dc80), DICO(0x26de4040), DICO(0x2b509b00), +- DICO(0x309d8780), DICO(0x36151180), DICO(0x3c6c1200), DICO(0x42df6b80), +- DICO(0x4a144400), DICO(0x50541280), DICO(0x56c34b80), DICO(0x5cb6c600), +- DICO(0x051fef00), DICO(0x06b9fb48), DICO(0x0b4f9cc0), DICO(0x17e27800), +- DICO(0x1b8c7340), DICO(0x1f772ca0), DICO(0x2478dc80), DICO(0x28242240), +- DICO(0x2f27c640), DICO(0x33b03e80), DICO(0x381f20c0), DICO(0x3c662c00), +- DICO(0x49565080), DICO(0x529b0f00), DICO(0x583ed080), DICO(0x5d8cec00), +- DICO(0x071c4d18), DICO(0x097853b0), DICO(0x0f0f0690), DICO(0x157bf980), +- DICO(0x1801f580), DICO(0x1deb0c20), DICO(0x2523da40), DICO(0x28534600), +- DICO(0x2eb499c0), DICO(0x32eb5ac0), DICO(0x36749580), DICO(0x3a748200), +- DICO(0x4325f700), DICO(0x515d8300), DICO(0x58a18700), DICO(0x5d722100), +- DICO(0x06cbcd88), DICO(0x08bb6740), DICO(0x0dead310), DICO(0x152f0cc0), +- DICO(0x18427640), DICO(0x1d9f2f20), DICO(0x22ba3b40), DICO(0x271a6e80), +- DICO(0x2c677ec0), DICO(0x31061b00), DICO(0x349eef40), DICO(0x3c531b80), +- DICO(0x4aed0580), DICO(0x4f8bbf80), DICO(0x54b74980), DICO(0x5bc9b700), +- DICO(0x046410c8), DICO(0x06522ab0), DICO(0x0b6528c0), DICO(0x0f94bd90), +- DICO(0x1a8f8b80), DICO(0x1ea57820), DICO(0x233ee180), DICO(0x27b3acc0), +- DICO(0x2bd1d240), DICO(0x2fc4bcc0), DICO(0x3a98ea40), DICO(0x43d3f500), +- DICO(0x49b37580), DICO(0x4e2afd00), DICO(0x55953300), DICO(0x5d36f600), +- DICO(0x05d0f6c8), DICO(0x07e56d90), DICO(0x0be98080), DICO(0x0f956f30), +- DICO(0x1259b3c0), DICO(0x1f08b240), DICO(0x25008c00), DICO(0x2900b180), +- DICO(0x31ea6f00), DICO(0x352d1e00), DICO(0x3c970c80), DICO(0x45271200), +- DICO(0x4b632280), DICO(0x5098a480), DICO(0x5672fc80), DICO(0x5c163180), +- DICO(0x05bd81a0), DICO(0x07d4b8f0), DICO(0x0ce224b0), DICO(0x110abe20), +- DICO(0x13dfeac0), DICO(0x17dedae0), DICO(0x2535c0c0), DICO(0x2a19da80), +- DICO(0x2e5224c0), DICO(0x38ddeec0), DICO(0x3da99d80), DICO(0x42799100), +- DICO(0x48973b00), DICO(0x4ea62880), DICO(0x53f77e80), DICO(0x5bd9c100), +- DICO(0x0395cd50), DICO(0x058244b8), DICO(0x0af45520), DICO(0x1329cea0), +- DICO(0x1a3970c0), DICO(0x1d9f2e00), DICO(0x21704400), DICO(0x277a34c0), +- DICO(0x30215b40), DICO(0x33875040), DICO(0x3c159840), DICO(0x452fea00), +- DICO(0x4981d200), DICO(0x4e15a980), DICO(0x54e84780), DICO(0x5c79ea00), +- DICO(0x05413b98), DICO(0x08132a80), DICO(0x0dc7f050), DICO(0x13e25460), +- DICO(0x1784bf80), DICO(0x1d630200), DICO(0x238bc880), DICO(0x28cc0880), +- DICO(0x30da1a40), DICO(0x391e2200), DICO(0x415d8d00), DICO(0x48f13280), +- DICO(0x4e300300), DICO(0x52e56580), DICO(0x5849fe80), DICO(0x5cdef400), +- DICO(0x04a058c8), DICO(0x07569b88), DICO(0x0ef26610), DICO(0x13208140), +- DICO(0x168c0500), DICO(0x1afec080), DICO(0x22a0abc0), DICO(0x2a057880), +- DICO(0x2fd1c840), DICO(0x3703c680), DICO(0x3d326b80), DICO(0x43df2e80), +- DICO(0x4a6f9000), DICO(0x50900d80), DICO(0x56c73f00), DICO(0x5cc3da80), +- DICO(0x065c99e8), DICO(0x09060c50), DICO(0x0d1ef1c0), DICO(0x16bd9020), +- DICO(0x1a04dae0), DICO(0x1e3c0580), DICO(0x25783700), DICO(0x29710ac0), +- DICO(0x309cbb80), DICO(0x36c66280), DICO(0x3adb0580), DICO(0x41b37e00), +- DICO(0x496ca700), DICO(0x4dab7600), DICO(0x52be6280), DICO(0x58fec480), +- DICO(0x04640880), DICO(0x05a75ab8), DICO(0x0edba410), DICO(0x16e076a0), +- DICO(0x198acec0), DICO(0x1eb5fae0), DICO(0x228c9000), DICO(0x29986c00), +- DICO(0x2c780c80), DICO(0x38078dc0), DICO(0x3f42dc00), DICO(0x441ba900), +- DICO(0x492f8080), DICO(0x4ed85d00), DICO(0x54605800), DICO(0x5d106a80), +- DICO(0x045cb970), DICO(0x0627a828), DICO(0x0db35290), DICO(0x1778f780), +- DICO(0x1a243c60), DICO(0x23c2dd40), DICO(0x27c57840), DICO(0x2f53cd80), +- DICO(0x36f65600), DICO(0x3bc1b2c0), DICO(0x40c36500), DICO(0x46074180), +- DICO(0x4b551b80), DICO(0x50a99700), DICO(0x569b6c80), DICO(0x5ca25780), +- DICO(0x05ef2828), DICO(0x07d3adf8), DICO(0x0b5416d0), DICO(0x0f9adb70), +- DICO(0x126e7360), DICO(0x1baff460), DICO(0x2b5decc0), DICO(0x31036200), +- DICO(0x34ca7500), DICO(0x39681340), DICO(0x3da97100), DICO(0x4161ee00), +- DICO(0x46a62e80), DICO(0x4d1b9380), DICO(0x530e0300), DICO(0x59ff0480), +- DICO(0x04f5bc50), DICO(0x06e90d18), DICO(0x0c2af480), DICO(0x123f7400), +- DICO(0x1530a160), DICO(0x18aa3dc0), DICO(0x1cc0a240), DICO(0x2cdb02c0), +- DICO(0x32909a00), DICO(0x36bae640), DICO(0x3c917a80), DICO(0x40121900), +- DICO(0x48a90d80), DICO(0x51ccc180), DICO(0x5884ea00), DICO(0x5dbc4280), +- DICO(0x05791410), DICO(0x07b0dd80), DICO(0x0bec4190), DICO(0x13c30520), +- DICO(0x17ac1900), DICO(0x1b6f1d00), DICO(0x26e54f40), DICO(0x2d4a8040), +- DICO(0x311c6840), DICO(0x38ec4180), DICO(0x3f0c4340), DICO(0x427c5b00), +- DICO(0x4886e480), DICO(0x504a0b00), DICO(0x56d48700), DICO(0x5c80f600), +- DICO(0x04b58880), DICO(0x0743f0d8), DICO(0x0be95e20), DICO(0x0fd0d9b0), +- DICO(0x1c2e11a0), DICO(0x2241af80), DICO(0x296e83c0), DICO(0x2f16adc0), +- DICO(0x32cd6fc0), DICO(0x374ddec0), DICO(0x3da95f80), DICO(0x45d56c80), +- DICO(0x4c6afa80), DICO(0x5141f380), DICO(0x5616b380), DICO(0x5c58f580), +- DICO(0x03f4b368), DICO(0x05939890), DICO(0x09d95480), DICO(0x122cac60), +- DICO(0x17e27e00), DICO(0x1f9dc680), DICO(0x26e26680), DICO(0x2ae64040), +- DICO(0x2dd6cf40), DICO(0x3295c400), DICO(0x3e23b400), DICO(0x44fd0380), +- DICO(0x4ad7a700), DICO(0x51295e80), DICO(0x594a9400), DICO(0x5e41aa00), +- DICO(0x0424b9d8), DICO(0x05b30508), DICO(0x09380f20), DICO(0x0c9509c0), +- DICO(0x18730860), DICO(0x219a9d40), DICO(0x24f699c0), DICO(0x289b2680), +- DICO(0x2cb62240), DICO(0x36e88180), DICO(0x3e968800), DICO(0x48053c80), +- DICO(0x4d6dca80), DICO(0x51d9a580), DICO(0x563e5a80), DICO(0x5c0b2b80), +- DICO(0x03456ae8), DICO(0x04e49948), DICO(0x07dd0e88), DICO(0x0ed5cd30), +- DICO(0x1b06e980), DICO(0x1de2b9c0), DICO(0x21160540), DICO(0x270a8240), +- DICO(0x3352a280), DICO(0x3b8b6c00), DICO(0x40241400), DICO(0x43f60f80), +- DICO(0x4a897900), DICO(0x51692a00), DICO(0x57449d00), DICO(0x5d497480), +- DICO(0x04b94290), DICO(0x067e99d0), DICO(0x0ab06840), DICO(0x0e697070), +- DICO(0x1745c460), DICO(0x22ee8040), DICO(0x2647e8c0), DICO(0x2bc2c680), +- DICO(0x2fd57d00), DICO(0x37186680), DICO(0x3d074500), DICO(0x412b2800), +- DICO(0x4579af00), DICO(0x4caff980), DICO(0x557add00), DICO(0x5c6ae780), +- DICO(0x0423a090), DICO(0x05b9bca0), DICO(0x091b45d0), DICO(0x0c5b6d60), +- DICO(0x194dd1c0), DICO(0x1fc85020), DICO(0x2486b080), DICO(0x2920af80), +- DICO(0x2dd4f140), DICO(0x3598be40), DICO(0x3b9c1440), DICO(0x42d19280), +- DICO(0x4a314280), DICO(0x50b00a00), DICO(0x56c55400), DICO(0x5d5ba300), +- DICO(0x03e68b28), DICO(0x05a7b190), DICO(0x0917f000), DICO(0x0d247050), +- DICO(0x19e637a0), DICO(0x2221a540), DICO(0x2777e540), DICO(0x2c103380), +- DICO(0x30c2e040), DICO(0x389f1240), DICO(0x3f4a2c80), DICO(0x454a4c00), +- DICO(0x4b0ab680), DICO(0x50cf6000), DICO(0x571c0700), DICO(0x5d2ef600), +- DICO(0x04886f18), DICO(0x065103e8), DICO(0x0a607d40), DICO(0x0db91960), +- DICO(0x13546f20), DICO(0x22f5e200), DICO(0x27064240), DICO(0x2e371d40), +- DICO(0x33659240), DICO(0x38aa1c40), DICO(0x417bb280), DICO(0x47ca9480), +- DICO(0x4dd6fb80), DICO(0x528e3480), DICO(0x57c49d80), DICO(0x5cc98100), +- DICO(0x02db2370), DICO(0x04398848), DICO(0x07a8da38), DICO(0x10b90280), +- DICO(0x1a2a4a20), DICO(0x20b1f640), DICO(0x277096c0), DICO(0x2dc568c0), +- DICO(0x341b33c0), DICO(0x3a000640), DICO(0x40152880), DICO(0x45eeee00), +- DICO(0x4c08c480), DICO(0x51bf0600), DICO(0x5799a180), DICO(0x5d23db80), +- DICO(0x047b1498), DICO(0x06089848), DICO(0x0905af20), DICO(0x0bf13c20), +- DICO(0x11fcf620), DICO(0x1f79cd00), DICO(0x257f6b40), DICO(0x2cfc2600), +- DICO(0x31610040), DICO(0x35ea8280), DICO(0x3c774bc0), DICO(0x44417280), +- DICO(0x4b432500), DICO(0x510e9480), DICO(0x56f2e480), DICO(0x5d282780), +- DICO(0x02cfd0b0), DICO(0x042845d8), DICO(0x0a1fa610), DICO(0x15911fc0), +- DICO(0x1bc07f00), DICO(0x2281d640), DICO(0x287abcc0), DICO(0x2ec6b400), +- DICO(0x34a0d040), DICO(0x3aa4dcc0), DICO(0x4074d980), DICO(0x46726b80), +- DICO(0x4c3bf900), DICO(0x52055100), DICO(0x57b20500), DICO(0x5d34da80), +- DICO(0x04d4f768), DICO(0x06cad828), DICO(0x0b52a540), DICO(0x0ea224e0), +- DICO(0x13c3f460), DICO(0x23808900), DICO(0x27d1cec0), DICO(0x2d6051c0), +- DICO(0x33c5ff00), DICO(0x37ef2440), DICO(0x3d2a5300), DICO(0x43266000), +- DICO(0x4a53a100), DICO(0x50acce80), DICO(0x57612100), DICO(0x5cdee380), +- DICO(0x04039a88), DICO(0x0626dcb0), DICO(0x0c059620), DICO(0x12c3db20), +- DICO(0x1bb9eb40), DICO(0x240fda00), DICO(0x2baab840), DICO(0x3177c5c0), +- DICO(0x36cf2e40), DICO(0x3c025100), DICO(0x40bb8d00), DICO(0x45960800), +- DICO(0x4adaca00), DICO(0x505a7300), DICO(0x566a6400), DICO(0x5c8ce000), +- DICO(0x062891e8), DICO(0x09680810), DICO(0x0e9a11b0), DICO(0x1523e320), +- DICO(0x1c57db00), DICO(0x21f22c80), DICO(0x28aeeb00), DICO(0x2e4fd600), +- DICO(0x341cf000), DICO(0x3a5034c0), DICO(0x40600f80), DICO(0x461fde00), +- DICO(0x4c368480), DICO(0x51dbbc00), DICO(0x57709780), DICO(0x5cce9880), +- DICO(0x05d41f70), DICO(0x0a65bb30), DICO(0x132ddfa0), DICO(0x17d26820), +- DICO(0x1e6d8380), DICO(0x24e68dc0), DICO(0x2b68c4c0), DICO(0x30fa2880), +- DICO(0x361998c0), DICO(0x3aa1d640), DICO(0x3f942400), DICO(0x44d11680), +- DICO(0x4ab8e580), DICO(0x50643b80), DICO(0x5697fe00), DICO(0x5cb3a780), +- DICO(0x0707fa10), DICO(0x0cb8beb0), DICO(0x15011d20), DICO(0x1a4ad300), +- DICO(0x20997080), DICO(0x26dbe240), DICO(0x2d907880), DICO(0x3307a3c0), +- DICO(0x38819740), DICO(0x3d3e89c0), DICO(0x41ea2300), DICO(0x469ce200), +- DICO(0x4be61680), DICO(0x51261b80), DICO(0x5716ef80), DICO(0x5cba2900), +- DICO(0x084dc830), DICO(0x0f16f610), DICO(0x16ca2420), DICO(0x1bb58380), +- DICO(0x22f00f00), DICO(0x296ba4c0), DICO(0x306d2600), DICO(0x362ca080), +- DICO(0x3b86d280), DICO(0x3ffa96c0), DICO(0x446a5300), DICO(0x48d0fd00), +- DICO(0x4d8a0800), DICO(0x525bf200), DICO(0x57f5aa00), DICO(0x5d569480), +- DICO(0x08d664f0), DICO(0x110c8520), DICO(0x1865fa40), DICO(0x1efe3160), +- DICO(0x26f38740), DICO(0x2d4608c0), DICO(0x32862500), DICO(0x374f8840), +- DICO(0x3bfa9900), DICO(0x3ff5c8c0), DICO(0x4450c500), DICO(0x4918e680), +- DICO(0x4e1d0f00), DICO(0x53342600), DICO(0x58a38e00), DICO(0x5dbbff00), +- DICO(0x09143fd0), DICO(0x0f401c30), DICO(0x169c1ee0), DICO(0x1bcfb280), +- DICO(0x2190dd00), DICO(0x27bf56c0), DICO(0x2e8e0640), DICO(0x34b67080), +- DICO(0x3b534dc0), DICO(0x41134c00), DICO(0x467a3280), DICO(0x4bd63600), +- DICO(0x50de8700), DICO(0x55657580), DICO(0x5a0cef00), DICO(0x5e8aa200), +- DICO(0x06b5d860), DICO(0x0c8a5000), DICO(0x13343620), DICO(0x17a2abe0), +- DICO(0x1caf7340), DICO(0x22a3f740), DICO(0x29059980), DICO(0x2ecff880), +- DICO(0x34ce0f00), DICO(0x3ad32280), DICO(0x40f08d80), DICO(0x46d1d400), +- DICO(0x4ca9df00), DICO(0x523b9580), DICO(0x57ea9b80), DICO(0x5d4a9a00), +- DICO(0x03822fec), DICO(0x0522c670), DICO(0x099f89a0), DICO(0x12ddc9c0), +- DICO(0x17c3d380), DICO(0x1d27ec20), DICO(0x2219e480), DICO(0x25fdf580), +- DICO(0x329d6500), DICO(0x368ba040), DICO(0x3afedb00), DICO(0x430db980), +- DICO(0x4a105380), DICO(0x51205080), DICO(0x5673b880), DICO(0x5ca2e500), +- DICO(0x04e07408), DICO(0x06a13dc0), DICO(0x0b31c780), DICO(0x0e67fcd0), +- DICO(0x13723240), DICO(0x1f87a840), DICO(0x2321ab00), DICO(0x2c604680), +- DICO(0x310bc180), DICO(0x351eea40), DICO(0x3a2d6440), DICO(0x3e7ebac0), +- DICO(0x4798ef80), DICO(0x50721100), DICO(0x57ff9880), DICO(0x5dc2e080), +- DICO(0x05d626b8), DICO(0x07eaf140), DICO(0x0c5675b0), DICO(0x0eba7b00), +- DICO(0x1a7f36c0), DICO(0x1f969200), DICO(0x244d8c00), DICO(0x29666440), +- DICO(0x2c94b100), DICO(0x31865380), DICO(0x3713c000), DICO(0x3c228f40), +- DICO(0x4296ed80), DICO(0x4dcbde00), DICO(0x56059a00), DICO(0x5c932d00), +- DICO(0x07dceb20), DICO(0x0b533fe0), DICO(0x0eb18880), DICO(0x13124220), +- DICO(0x167f74e0), DICO(0x1afbee40), DICO(0x229e2f80), DICO(0x26b05ec0), +- DICO(0x2c7b4040), DICO(0x32806140), DICO(0x38da6540), DICO(0x3e495540), +- DICO(0x444d3880), DICO(0x4e784400), DICO(0x5865f580), DICO(0x5e616180), +- DICO(0x06395790), DICO(0x084b8f20), DICO(0x0d0e26a0), DICO(0x10897ac0), +- DICO(0x14bcd080), DICO(0x1c5babe0), DICO(0x2108f9c0), DICO(0x274f8e80), +- DICO(0x2b0ba180), DICO(0x305b8480), DICO(0x383ad300), DICO(0x3e34f440), +- DICO(0x47f7aa00), DICO(0x4fdb5880), DICO(0x56b8c280), DICO(0x5d07d700), +- DICO(0x051f0880), DICO(0x071b8fa8), DICO(0x0ce79c90), DICO(0x1005bd60), +- DICO(0x14a4a080), DICO(0x183def40), DICO(0x1ee8d0a0), DICO(0x2c5b9bc0), +- DICO(0x309f9dc0), DICO(0x35659380), DICO(0x3c0439c0), DICO(0x49603800), +- DICO(0x5018a800), DICO(0x54862380), DICO(0x593edd80), DICO(0x5d415b80), +- DICO(0x051c8108), DICO(0x06bd97d8), DICO(0x0b47d030), DICO(0x0d9c81a0), +- DICO(0x178f0be0), DICO(0x1cdf7c80), DICO(0x2183db40), DICO(0x26ec7180), +- DICO(0x2a3856c0), DICO(0x366c9b40), DICO(0x3d3611c0), DICO(0x42788100), +- DICO(0x4981f200), DICO(0x4dd68380), DICO(0x55286a00), DICO(0x5cc72500), +- DICO(0x06ee58c8), DICO(0x098b1310), DICO(0x0ccbd880), DICO(0x0f9d68f0), +- DICO(0x1277ac40), DICO(0x1d71faa0), DICO(0x230d9480), DICO(0x276b8c00), +- DICO(0x2ec77000), DICO(0x31f2a700), DICO(0x3bee0200), DICO(0x42250700), +- DICO(0x466b7100), DICO(0x4de41980), DICO(0x56a08d80), DICO(0x5d700880), +- DICO(0x062f1d80), DICO(0x091bcd30), DICO(0x0cd875e0), DICO(0x0fd42e60), +- DICO(0x1322b980), DICO(0x1f11b480), DICO(0x2651e5c0), DICO(0x29f9b480), +- DICO(0x2e238840), DICO(0x30fc58c0), DICO(0x37aa3040), DICO(0x3e9ac580), +- DICO(0x44c6fd00), DICO(0x4eba4300), DICO(0x56fdad00), DICO(0x5d885700), +- DICO(0x04213a78), DICO(0x05d028c0), DICO(0x09a1f9e0), DICO(0x0d28ae90), +- DICO(0x151819a0), DICO(0x1c78c860), DICO(0x21d78f00), DICO(0x29992cc0), +- DICO(0x2fbdc180), DICO(0x36bab700), DICO(0x3d4db1c0), DICO(0x4402a280), +- DICO(0x4a920700), DICO(0x50988600), DICO(0x5717c100), DICO(0x5d52c200), +- DICO(0x036af4bc), DICO(0x0514cf40), DICO(0x09ec2d30), DICO(0x113de160), +- DICO(0x1991b700), DICO(0x20590bc0), DICO(0x23892a00), DICO(0x2654cd00), +- DICO(0x2ff5c0c0), DICO(0x387ed380), DICO(0x3e305300), DICO(0x46137700), +- DICO(0x4bc29100), DICO(0x4f96dd80), DICO(0x564aca00), DICO(0x5c4d9e80), +- DICO(0x041051a0), DICO(0x0734dad8), DICO(0x1064e780), DICO(0x14d8bf00), +- DICO(0x19727e40), DICO(0x1f7bede0), DICO(0x25b5ebc0), DICO(0x2c71fd40), +- DICO(0x32813740), DICO(0x39340c80), DICO(0x3f974f40), DICO(0x45ca1580), +- DICO(0x4be69f00), DICO(0x51c9c900), DICO(0x57a1ce80), DICO(0x5d0b2b00), +- DICO(0x04b73008), DICO(0x06598b60), DICO(0x0b0aee00), DICO(0x15ac7ba0), +- DICO(0x18b5e340), DICO(0x1f5308c0), DICO(0x23cfc4c0), DICO(0x27d3fdc0), +- DICO(0x30138080), DICO(0x343c85c0), DICO(0x389cb540), DICO(0x42def900), +- DICO(0x4aa6a000), DICO(0x4f719580), DICO(0x5585d080), DICO(0x5bc03f00), +- DICO(0x05601b88), DICO(0x07616b88), DICO(0x0c22ba40), DICO(0x16bc8200), +- DICO(0x192ebf80), DICO(0x1f71c120), DICO(0x25c59d00), DICO(0x28f76d00), +- DICO(0x33dbdd80), DICO(0x39f40d80), DICO(0x3da0c880), DICO(0x432c1e00), +- DICO(0x4aa19d80), DICO(0x51006f80), DICO(0x56a62e80), DICO(0x5c67d000), +- DICO(0x053095d0), DICO(0x06c43fc8), DICO(0x0f80a460), DICO(0x139b4960), +- DICO(0x1769ed80), DICO(0x1c828b00), DICO(0x21195980), DICO(0x26329800), +- DICO(0x29f35900), DICO(0x2dc9df80), DICO(0x3795f0c0), DICO(0x43139b00), +- DICO(0x4acae680), DICO(0x5048de00), DICO(0x57c11880), DICO(0x5db35900), +- DICO(0x0466e180), DICO(0x05d31550), DICO(0x10cad200), DICO(0x168c2be0), +- DICO(0x1a5e9580), DICO(0x1ef2d480), DICO(0x238db240), DICO(0x2920ce80), +- DICO(0x2c80b4c0), DICO(0x30bb2700), DICO(0x38b257c0), DICO(0x46abd580), +- DICO(0x4c30dd80), DICO(0x50e51880), DICO(0x5782ab80), DICO(0x5d23da80), +- DICO(0x06700f78), DICO(0x085ec0a0), DICO(0x0c037280), DICO(0x16d90a60), +- DICO(0x1bf46c00), DICO(0x1e6f4740), DICO(0x22c2c180), DICO(0x263fa2c0), +- DICO(0x2c4a74c0), DICO(0x3642b040), DICO(0x3a476900), DICO(0x3ea12840), +- DICO(0x46b6e880), DICO(0x4b5bad80), DICO(0x5152a500), DICO(0x5c1c6080), +- DICO(0x041f8108), DICO(0x05ef1d98), DICO(0x0ce43300), DICO(0x11647cc0), +- DICO(0x16e77fe0), DICO(0x1cdafc40), DICO(0x218832c0), DICO(0x26dd1b40), +- DICO(0x2c776100), DICO(0x34f1eb80), DICO(0x3caf6100), DICO(0x45630a80), +- DICO(0x4c0c5380), DICO(0x517ae980), DICO(0x567f4280), DICO(0x5c4bf900), +- DICO(0x06673f18), DICO(0x091ee510), DICO(0x0d6ccb10), DICO(0x12503240), +- DICO(0x158696e0), DICO(0x1f035420), DICO(0x24e6eac0), DICO(0x2a03bf40), +- DICO(0x329aa000), DICO(0x375aafc0), DICO(0x3da133c0), DICO(0x45645600), +- DICO(0x4c447c00), DICO(0x51a26b00), DICO(0x57917c00), DICO(0x5c557680), +- DICO(0x04f84c18), DICO(0x06db4c30), DICO(0x0d53a940), DICO(0x1095cd20), +- DICO(0x142b0b20), DICO(0x184229c0), DICO(0x20147280), DICO(0x25152740), +- DICO(0x2db89fc0), DICO(0x35f3d200), DICO(0x400aa680), DICO(0x47a51c00), +- DICO(0x4d9c5c00), DICO(0x525d1680), DICO(0x5832af00), DICO(0x5d27d580), +- DICO(0x05c973d0), DICO(0x07c25810), DICO(0x0e928e50), DICO(0x12f5ad00), +- DICO(0x16b2a800), DICO(0x1c2c9ce0), DICO(0x20b0f100), DICO(0x28be1940), +- DICO(0x2d0f3c00), DICO(0x30a06f40), DICO(0x399e4340), DICO(0x46b48280), +- DICO(0x4bbbc300), DICO(0x50283700), DICO(0x54a1a800), DICO(0x5ab20c80), +- DICO(0x03df9390), DICO(0x055ff1e0), DICO(0x0bbeb640), DICO(0x17d906c0), +- DICO(0x1ac20140), DICO(0x1fd84440), DICO(0x24502600), DICO(0x2a9fe640), +- DICO(0x2ef79700), DICO(0x34cbed40), DICO(0x3c48cd00), DICO(0x43ccce80), +- DICO(0x49b1d500), DICO(0x50145e00), DICO(0x56f16f80), DICO(0x5d46dd80), +- DICO(0x04a69ef0), DICO(0x06470480), DICO(0x0defbd00), DICO(0x1590e900), +- DICO(0x18114000), DICO(0x1bda6c60), DICO(0x1f64d160), DICO(0x28d8d640), +- DICO(0x2d4e2880), DICO(0x34cfe380), DICO(0x3b7077c0), DICO(0x42f36a80), +- DICO(0x49615580), DICO(0x4ff9d200), DICO(0x5657ef80), DICO(0x5cb91300), +- DICO(0x038893dc), DICO(0x0535cdf0), DICO(0x0aabff80), DICO(0x146daaa0), +- DICO(0x1848c700), DICO(0x1ce578c0), DICO(0x21116000), DICO(0x2b116d40), +- DICO(0x32113500), DICO(0x3751a480), DICO(0x3e88c200), DICO(0x44cb1800), +- DICO(0x4af1c200), DICO(0x5122b980), DICO(0x5782bc80), DICO(0x5d20be00), +- DICO(0x03118434), DICO(0x04afe2e8), DICO(0x08f144f0), DICO(0x12c787c0), +- DICO(0x1c32e4e0), DICO(0x1f701180), DICO(0x2362f740), DICO(0x2b995cc0), +- DICO(0x3322c540), DICO(0x3951f200), DICO(0x3f7c2c80), DICO(0x4569c480), +- DICO(0x4b2a6200), DICO(0x50905e80), DICO(0x56236680), DICO(0x5c32fa00), +- DICO(0x0460c3b0), DICO(0x061e1378), DICO(0x0b07f610), DICO(0x166e0680), +- DICO(0x18d0f020), DICO(0x21120340), DICO(0x24d4c000), DICO(0x29bafc00), +- DICO(0x338c0740), DICO(0x36cfbc00), DICO(0x3f313900), DICO(0x47bf9c00), +- DICO(0x4dd5d480), DICO(0x52848200), DICO(0x585add00), DICO(0x5cf7b480), +- DICO(0x041a4bc8), DICO(0x05ca0920), DICO(0x0a3ae5b0), DICO(0x13fbb840), +- DICO(0x1cdd3d00), DICO(0x209d5b80), DICO(0x27e78e80), DICO(0x2d1f4ec0), +- DICO(0x32d84c80), DICO(0x3b8aa680), DICO(0x4289c180), DICO(0x46c33580), +- DICO(0x4c23e580), DICO(0x51583180), DICO(0x56f52680), DICO(0x5c7a3d00), +- DICO(0x03067404), DICO(0x05914038), DICO(0x10d33e60), DICO(0x17377180), +- DICO(0x1d7f32a0), DICO(0x23848880), DICO(0x29d32200), DICO(0x2fb167c0), +- DICO(0x356c8480), DICO(0x3b420280), DICO(0x4106d080), DICO(0x46d29280), +- DICO(0x4c8a1200), DICO(0x52383300), DICO(0x57db8f80), DICO(0x5d61f200), +- DICO(0x04baf368), DICO(0x06670a08), DICO(0x0e0cbd90), DICO(0x126299c0), +- DICO(0x17ed7220), DICO(0x1e369900), DICO(0x22d7d300), DICO(0x2c0f9300), +- DICO(0x2f5e7fc0), DICO(0x3b7c0d40), DICO(0x405aff80), DICO(0x44f2ef80), +- DICO(0x4982b400), DICO(0x4e501380), DICO(0x539daa00), DICO(0x5c114b00), +- DICO(0x0694c170), DICO(0x092d6890), DICO(0x0d0faee0), DICO(0x13800d00), +- DICO(0x170f8d80), DICO(0x1bcd8240), DICO(0x246a8480), DICO(0x28bab640), +- DICO(0x2f482ac0), DICO(0x36e736c0), DICO(0x3aaa68c0), DICO(0x3fc43500), +- DICO(0x46e16000), DICO(0x4b3fbc00), DICO(0x4ff68e80), DICO(0x5aabf600), +- DICO(0x05e849a0), DICO(0x0b485a80), DICO(0x14be52c0), DICO(0x1a079380), +- DICO(0x1e8b1ce0), DICO(0x22fbca00), DICO(0x28c36a40), DICO(0x2e3b2a00), +- DICO(0x34360b80), DICO(0x3a24cf00), DICO(0x3fff6200), DICO(0x45a6bf00), +- DICO(0x4baf7800), DICO(0x51720e80), DICO(0x57560c80), DICO(0x5ce57e00), +- DICO(0x0751da38), DICO(0x0f0949f0), DICO(0x18141860), DICO(0x1dfcb2c0), +- DICO(0x24adbf00), DICO(0x296af240), DICO(0x2dbe60c0), DICO(0x3179ae40), +- DICO(0x35ec4400), DICO(0x3ab76400), DICO(0x4034f400), DICO(0x45cfc700), +- DICO(0x4bea6b00), DICO(0x516f5f00), DICO(0x57655300), DICO(0x5cfc0e00), +- DICO(0x069900d0), DICO(0x0d379520), DICO(0x175d0560), DICO(0x1c4d92c0), +- DICO(0x21407680), DICO(0x250d0340), DICO(0x29804940), DICO(0x2dfb9ac0), +- DICO(0x337a1f80), DICO(0x39105fc0), DICO(0x3efd0380), DICO(0x44bce380), +- DICO(0x4b07cc80), DICO(0x50ad7d00), DICO(0x56ddce80), DICO(0x5cb9a000), +- DICO(0x069c6948), DICO(0x0a56ea10), DICO(0x0f7cca20), DICO(0x12d18680), +- DICO(0x17036d00), DICO(0x1f4c1e80), DICO(0x262e5540), DICO(0x2b951e40), +- DICO(0x3468ad40), DICO(0x3a2b2100), DICO(0x3f02f0c0), DICO(0x4383e400), +- DICO(0x48374180), DICO(0x4d8eec80), DICO(0x54d74800), DICO(0x5c309600), +- DICO(0x05a50158), DICO(0x0797e350), DICO(0x0cf1f230), DICO(0x14f3fb20), +- DICO(0x17676400), DICO(0x20636780), DICO(0x2617ef80), DICO(0x29cbf700), +- DICO(0x32ed57c0), DICO(0x374c3080), DICO(0x3b348e40), DICO(0x3fde0180), +- DICO(0x44d38c00), DICO(0x4a8c6100), DICO(0x55f0e400), DICO(0x5dfed100), +- DICO(0x04b74228), DICO(0x0623d3e0), DICO(0x0ab4c670), DICO(0x1bde7fa0), +- DICO(0x1fcb6ac0), DICO(0x2344a540), DICO(0x275f7c40), DICO(0x2b7a8300), +- DICO(0x31407440), DICO(0x35237700), DICO(0x38798540), DICO(0x3d0af340), +- DICO(0x4224c980), DICO(0x49a17900), DICO(0x57702880), DICO(0x5dba4c00), +- DICO(0x03c83c84), DICO(0x05cc52d8), DICO(0x0b644c10), DICO(0x129ab9a0), +- DICO(0x1cee46c0), DICO(0x2152b080), DICO(0x247b1c00), DICO(0x27697180), +- DICO(0x304f7500), DICO(0x3895d880), DICO(0x3c3a1740), DICO(0x413ace80), +- DICO(0x462b0100), DICO(0x4ab07e00), DICO(0x50967580), DICO(0x5ba5e700), +- DICO(0x06bcfda8), DICO(0x08c8b920), DICO(0x0de21530), DICO(0x1028d320), +- DICO(0x168cfe00), DICO(0x20f78a40), DICO(0x248493c0), DICO(0x2c34bf80), +- DICO(0x2ff88540), DICO(0x32d28c40), DICO(0x36d99640), DICO(0x4438e500), +- DICO(0x4bacdb00), DICO(0x50343700), DICO(0x56b79080), DICO(0x5b694d00), +- DICO(0x069109a0), DICO(0x0a73bc50), DICO(0x0e3c8330), DICO(0x13082620), +- DICO(0x1c3a3760), DICO(0x200b5e80), DICO(0x256a4880), DICO(0x2b256ac0), +- DICO(0x2f34afc0), DICO(0x35580200), DICO(0x3e0bd9c0), DICO(0x43d92900), +- DICO(0x494e6e00), DICO(0x4f1a2780), DICO(0x5532a980), DICO(0x5a835a80), +- DICO(0x04053450), DICO(0x05cb8fe0), DICO(0x097387b0), DICO(0x1121af00), +- DICO(0x1abf62c0), DICO(0x1e39bbe0), DICO(0x243de300), DICO(0x2b440ec0), +- DICO(0x2f2c1480), DICO(0x34697d80), DICO(0x405f8600), DICO(0x440b6f80), +- DICO(0x47373100), DICO(0x4c764f80), DICO(0x55293780), DICO(0x5c59a780), +- DICO(0x03c5b4a4), DICO(0x056fb380), DICO(0x09b8f910), DICO(0x13833fa0), +- DICO(0x185eed60), DICO(0x1ce33d40), DICO(0x242e4100), DICO(0x282e5b80), +- DICO(0x2cfe4d40), DICO(0x38a06d80), DICO(0x3e002240), DICO(0x423be400), +- DICO(0x49a5e600), DICO(0x5092b780), DICO(0x57023d00), DICO(0x5d5f7c80), +- DICO(0x077ada38), DICO(0x09d5ac70), DICO(0x0e58be30), DICO(0x14fb2040), +- DICO(0x17fc9dc0), DICO(0x1c2c31e0), DICO(0x26cf1b00), DICO(0x2a91ba80), +- DICO(0x2ed880c0), DICO(0x38cbf900), DICO(0x3d2fc700), DICO(0x405d2280), +- DICO(0x439c1d00), DICO(0x4dd16800), DICO(0x5672c080), DICO(0x5d313880), +- DICO(0x04272090), DICO(0x05d76e18), DICO(0x0b4d8080), DICO(0x12883f60), +- DICO(0x17952180), DICO(0x2040d480), DICO(0x23e8cc00), DICO(0x2819c200), +- DICO(0x2b871040), DICO(0x357c8f00), DICO(0x3caf9ac0), DICO(0x40a39380), +- DICO(0x45bc2780), DICO(0x4e4aa300), DICO(0x568c2280), DICO(0x5cadc400), +- DICO(0x0375b03c), DICO(0x056f0b40), DICO(0x0b0dc930), DICO(0x128c51e0), +- DICO(0x189fa360), DICO(0x1c8197e0), DICO(0x1eed52a0), DICO(0x23ed4500), +- DICO(0x2e5eb840), DICO(0x36415a40), DICO(0x3dcf6340), DICO(0x43126e80), +- DICO(0x4aeb7f80), DICO(0x501e1280), DICO(0x5852b100), DICO(0x5d040d80), +- DICO(0x06351b88), DICO(0x07f90ac0), DICO(0x0bab4ea0), DICO(0x18d04b40), +- DICO(0x1f1e1480), DICO(0x219abcc0), DICO(0x261c31c0), DICO(0x2a611a00), +- DICO(0x2e725480), DICO(0x36b511c0), DICO(0x3d362f00), DICO(0x40be6d80), +- DICO(0x456dc400), DICO(0x4b74c580), DICO(0x55c82680), DICO(0x5e318480), +- DICO(0x046212d8), DICO(0x05ca95e8), DICO(0x0a02d910), DICO(0x1ae58f40), +- DICO(0x1e73ec20), DICO(0x2197d640), DICO(0x2581df00), DICO(0x29c83780), +- DICO(0x31294300), DICO(0x356f8a40), DICO(0x3b97d240), DICO(0x4505cc80), +- DICO(0x4b497600), DICO(0x504e8780), DICO(0x55644480), DICO(0x5bdedf80), +- DICO(0x0514f798), DICO(0x06bd0d00), DICO(0x0fc31550), DICO(0x13dfb1a0), +- DICO(0x17dda900), DICO(0x204a8c40), DICO(0x23095300), DICO(0x2d0da040), +- DICO(0x31b2a540), DICO(0x34620180), DICO(0x3ab3e000), DICO(0x448ac300), +- DICO(0x4be6a600), DICO(0x5114e280), DICO(0x562b0780), DICO(0x5b833c00), +- DICO(0x070f5ef0), DICO(0x0919c2b0), DICO(0x0e778740), DICO(0x154db320), +- DICO(0x177cfbe0), DICO(0x1ea66040), DICO(0x23666680), DICO(0x2839c400), +- DICO(0x30cc4ec0), DICO(0x3444a280), DICO(0x38c93580), DICO(0x42a80e00), +- DICO(0x4c433880), DICO(0x519e4f80), DICO(0x56ff8f80), DICO(0x5be18200), +- DICO(0x066c5968), DICO(0x08a589f0), DICO(0x0ca4d7a0), DICO(0x0ffdefb0), +- DICO(0x12943f40), DICO(0x1be84ee0), DICO(0x21276540), DICO(0x265a9540), +- DICO(0x2e0de140), DICO(0x325148c0), DICO(0x3bd05d40), DICO(0x41e81780), +- DICO(0x4b7cf400), DICO(0x53289400), DICO(0x597d9000), DICO(0x5e458e00), +- DICO(0x04da3e40), DICO(0x06e8e1b0), DICO(0x0b9b1a20), DICO(0x11264bc0), +- DICO(0x14f3d7e0), DICO(0x1cf9c100), DICO(0x23568f40), DICO(0x292b5380), +- DICO(0x33878d40), DICO(0x38dac840), DICO(0x3d578200), DICO(0x4223a880), +- DICO(0x473fb700), DICO(0x4c765500), DICO(0x546c6480), DICO(0x5c76d280), +- DICO(0x05e63bb0), DICO(0x07a1a428), DICO(0x0ec4ff10), DICO(0x1348a100), +- DICO(0x16204f40), DICO(0x1a0a6440), DICO(0x1e33f6c0), DICO(0x2ae8ccc0), +- DICO(0x2ed5e6c0), DICO(0x32427600), DICO(0x379d9980), DICO(0x3c0f4080), +- DICO(0x441ea680), DICO(0x4e592b00), DICO(0x56e27700), DICO(0x5da2e280), +- DICO(0x0474de80), DICO(0x06167248), DICO(0x0ce650e0), DICO(0x135b4aa0), +- DICO(0x16cea2a0), DICO(0x1d138ac0), DICO(0x220a84c0), DICO(0x275ca380), +- DICO(0x2c300340), DICO(0x333b3d80), DICO(0x37a35080), DICO(0x40b83880), +- DICO(0x494c4780), DICO(0x4ff71c80), DICO(0x56db2d80), DICO(0x5d0aac00), +- DICO(0x0746cd00), DICO(0x09deff10), DICO(0x0e4a3560), DICO(0x14f005e0), +- DICO(0x186a4de0), DICO(0x1cd0b240), DICO(0x22287bc0), DICO(0x26ced500), +- DICO(0x2d57c440), DICO(0x31d943c0), DICO(0x364b0f80), DICO(0x3c85a040), +- DICO(0x4240ca00), DICO(0x4a648080), DICO(0x54d12200), DICO(0x5d1a1c00), +- DICO(0x05522eb0), DICO(0x0704efb8), DICO(0x0c66cd50), DICO(0x15aefca0), +- DICO(0x184f7b00), DICO(0x1e4b26a0), DICO(0x22667640), DICO(0x284e4e00), +- DICO(0x2d8be3c0), DICO(0x31376f00), DICO(0x39cd9800), DICO(0x3e46b740), +- DICO(0x43af0380), DICO(0x4e1dec00), DICO(0x562ac500), DICO(0x5d45f580), +- DICO(0x062f5708), DICO(0x08d079a0), DICO(0x0c1b4920), DICO(0x13f147c0), +- DICO(0x1ae77c80), DICO(0x1d200ea0), DICO(0x236e4740), DICO(0x2b98d000), +- DICO(0x2eefc600), DICO(0x34c674c0), DICO(0x3d36f540), DICO(0x411d8c00), +- DICO(0x45c50300), DICO(0x4d207480), DICO(0x55603100), DICO(0x5c442d80), +- DICO(0x0510bcd0), DICO(0x06ec00a0), DICO(0x0b639550), DICO(0x15daa2c0), +- DICO(0x18c0ba60), DICO(0x1e0f7d60), DICO(0x24b05c80), DICO(0x280638c0), +- DICO(0x314a6580), DICO(0x35e4b2c0), DICO(0x3aef2bc0), DICO(0x4158c280), +- DICO(0x4d245100), DICO(0x53c69a80), DICO(0x597f1000), DICO(0x5dcb0080), +- DICO(0x042cb748), DICO(0x05d710b0), DICO(0x0afe6130), DICO(0x1256cdc0), +- DICO(0x15b8cd00), DICO(0x1dc72d20), DICO(0x2205fc00), DICO(0x2a3d0d00), +- DICO(0x2f3ba600), DICO(0x33b3d840), DICO(0x3b5a5440), DICO(0x416c9d00), +- DICO(0x497cdd80), DICO(0x50405e00), DICO(0x570ca980), DICO(0x5d3aa180), +- DICO(0x0443b7b8), DICO(0x063d8588), DICO(0x0c76ef20), DICO(0x12709b40), +- DICO(0x1649f0a0), DICO(0x20c522c0), DICO(0x24cde400), DICO(0x2ba78280), +- DICO(0x3104c340), DICO(0x360b1740), DICO(0x3cd6a6c0), DICO(0x42573800), +- DICO(0x48b18480), DICO(0x4fca1e00), DICO(0x5700c100), DICO(0x5cf14480), +- DICO(0x05123628), DICO(0x06bf10b0), DICO(0x0bde7570), DICO(0x175b7ee0), +- DICO(0x1a134460), DICO(0x20fa4100), DICO(0x25eda440), DICO(0x29c3b540), +- DICO(0x318a1b40), DICO(0x35e0d500), DICO(0x3a147f00), DICO(0x3f08e980), +- DICO(0x445d7580), DICO(0x4ec48c80), DICO(0x588bce80), DICO(0x5dfae300), +- DICO(0x04c9e750), DICO(0x065224f8), DICO(0x0c6f1e30), DICO(0x1a2ffca0), +- DICO(0x1cac6140), DICO(0x21c2a640), DICO(0x25fb8ac0), DICO(0x2ab90f00), +- DICO(0x33189200), DICO(0x38088ac0), DICO(0x3bb7de40), DICO(0x40180800), +- DICO(0x4453c300), DICO(0x4cdba880), DICO(0x54902680), DICO(0x5bb21700), +- DICO(0x06958570), DICO(0x097f32b0), DICO(0x0cb418b0), DICO(0x141b6900), +- DICO(0x1c8cfb00), DICO(0x1fab7920), DICO(0x2477c800), DICO(0x2aabed40), +- DICO(0x2eb1a080), DICO(0x339f67c0), DICO(0x3abcc240), DICO(0x3f661b00), +- DICO(0x45663280), DICO(0x4c680800), DICO(0x51703000), DICO(0x58a0e000), +- DICO(0x069f6c88), DICO(0x095e1490), DICO(0x0cf442b0), DICO(0x10ea8d60), +- DICO(0x1377b580), DICO(0x195ed480), DICO(0x26542b00), DICO(0x2c9ea700), +- DICO(0x318d8ac0), DICO(0x364e5a40), DICO(0x3a0db000), DICO(0x3e1087c0), +- DICO(0x450ca380), DICO(0x4c781d00), DICO(0x53cf7a00), DICO(0x5c7d1280), +- DICO(0x06e51d98), DICO(0x09eb8d30), DICO(0x0e6683d0), DICO(0x129418a0), +- DICO(0x1562fc80), DICO(0x1f708660), DICO(0x253f1000), DICO(0x293a16c0), +- DICO(0x2e7c1d80), DICO(0x316e75c0), DICO(0x35a7fbc0), DICO(0x3bfbf780), +- DICO(0x416a9200), DICO(0x4be36400), DICO(0x56dc7a80), DICO(0x5d64ea80), +- DICO(0x0574d0c8), DICO(0x0748efd0), DICO(0x0b510860), DICO(0x0e219e00), +- DICO(0x1299cc00), DICO(0x1ef706a0), DICO(0x22ca38c0), DICO(0x28820a00), +- DICO(0x2cc635c0), DICO(0x31ef4740), DICO(0x3a5e89c0), DICO(0x42acaa00), +- DICO(0x4b2bf500), DICO(0x515e0980), DICO(0x57949400), DICO(0x5d002500), +- DICO(0x07c715d0), DICO(0x0b3fa110), DICO(0x0e745370), DICO(0x11e93560), +- DICO(0x14bad680), DICO(0x189a0400), DICO(0x240b1240), DICO(0x2a6b3580), +- DICO(0x2e5e1380), DICO(0x352072c0), DICO(0x3a5037c0), DICO(0x3e3726c0), +- DICO(0x4725ed80), DICO(0x4f885900), DICO(0x54c8d580), DICO(0x5b261680), +- DICO(0x075f02a8), DICO(0x0a214900), DICO(0x0e189de0), DICO(0x1376d5a0), +- DICO(0x163d5c80), DICO(0x1a94b3e0), DICO(0x21376980), DICO(0x259c3140), +- DICO(0x2e663bc0), DICO(0x337884c0), DICO(0x3a035c00), DICO(0x40b32c00), +- DICO(0x4b21de00), DICO(0x53298f00), DICO(0x58788080), DICO(0x5cfa7c00), +- DICO(0x05658988), DICO(0x0797f470), DICO(0x0d250810), DICO(0x102fc2a0), +- DICO(0x13738fe0), DICO(0x1740bbc0), DICO(0x2491b380), DICO(0x28bc5800), +- DICO(0x2c75a940), DICO(0x325cb500), DICO(0x37944740), DICO(0x405f2d80), +- DICO(0x48eb8f00), DICO(0x50676f80), DICO(0x56f70380), DICO(0x5d62c000), +- DICO(0x0531b540), DICO(0x06ae64c0), DICO(0x0cf7ad30), DICO(0x11c83000), +- DICO(0x14edc980), DICO(0x18d436c0), DICO(0x1e184080), DICO(0x2603bb80), +- DICO(0x2a2f2f80), DICO(0x33bdbe00), DICO(0x3a1066c0), DICO(0x42b9ff00), +- DICO(0x4a617580), DICO(0x51619480), DICO(0x57ccd500), DICO(0x5d4d1600), +- DICO(0x03e40bac), DICO(0x05f53158), DICO(0x0e76d3b0), DICO(0x17c157a0), +- DICO(0x1ccb5bc0), DICO(0x250129c0), DICO(0x2b7d9d00), DICO(0x33224d80), +- DICO(0x3966f600), DICO(0x3f399480), DICO(0x4449fc80), DICO(0x49401b80), +- DICO(0x4e2ab580), DICO(0x53117000), DICO(0x5848e080), DICO(0x5d66a280), +- DICO(0x041d4f60), DICO(0x070e8080), DICO(0x1390ec40), DICO(0x177c42c0), +- DICO(0x1beb1400), DICO(0x208b0580), DICO(0x264cbb40), DICO(0x2bd30940), +- DICO(0x30b30880), DICO(0x36978e80), DICO(0x3cb2a140), DICO(0x43f6b080), +- DICO(0x4a881000), DICO(0x505ca780), DICO(0x569a5d80), DICO(0x5cae3580), +- DICO(0x03f3c760), DICO(0x05564e08), DICO(0x09e310d0), DICO(0x1b9b3d00), +- DICO(0x20909ac0), DICO(0x2382eec0), DICO(0x278c6700), DICO(0x2b34d500), +- DICO(0x30fa2ac0), DICO(0x34d27d40), DICO(0x38e334c0), DICO(0x3d732440), +- DICO(0x46d07800), DICO(0x51f4d400), DICO(0x57744f80), DICO(0x5d56bb80), +- DICO(0x03abfdd8), DICO(0x0512b140), DICO(0x135f7500), DICO(0x19fcc4c0), +- DICO(0x1d0b1b80), DICO(0x21eca540), DICO(0x258f8700), DICO(0x29e292c0), +- DICO(0x2c51fe80), DICO(0x31e2a180), DICO(0x3c638640), DICO(0x44873a00), +- DICO(0x4bb7e800), DICO(0x5078f700), DICO(0x57fc9b80), DICO(0x5def1c00), +- DICO(0x04721ef0), DICO(0x06688158), DICO(0x0f65a5d0), DICO(0x14499840), +- DICO(0x1bf5b8c0), DICO(0x1f33b700), DICO(0x264b6900), DICO(0x2c3e6780), +- DICO(0x2ec8d440), DICO(0x323885c0), DICO(0x37143300), DICO(0x3bafa800), +- DICO(0x49030480), DICO(0x54c16b00), DICO(0x58ec4b00), DICO(0x5d713d00), +- DICO(0x03d114e4), DICO(0x067e5b40), DICO(0x10393420), DICO(0x14961300), +- DICO(0x1a59cfa0), DICO(0x20854240), DICO(0x26b3f300), DICO(0x2e3e2840), +- DICO(0x323bd300), DICO(0x37c49280), DICO(0x3d79e500), DICO(0x4352d880), +- DICO(0x49e17980), DICO(0x4fc72f80), DICO(0x55c0c680), DICO(0x5c53c700), +- DICO(0x053f5de8), DICO(0x075162b8), DICO(0x0fae8050), DICO(0x13ec0ee0), +- DICO(0x17f92440), DICO(0x1f054440), DICO(0x24b15d40), DICO(0x2add4480), +- DICO(0x2e306300), DICO(0x35420680), DICO(0x3c6b6e00), DICO(0x42fc0380), +- DICO(0x4732e380), DICO(0x4ceb2200), DICO(0x522efe00), DICO(0x5aa12680), +- DICO(0x06111728), DICO(0x08183c80), DICO(0x0d026650), DICO(0x14b41940), +- DICO(0x17e37320), DICO(0x1c40b160), DICO(0x219c5400), DICO(0x26d88840), +- DICO(0x2bfdfe00), DICO(0x315a2800), DICO(0x38cd7140), DICO(0x3de22740), +- DICO(0x48ff1300), DICO(0x53ef4180), DICO(0x5a479380), DICO(0x5ea1e380), +- DICO(0x07ea0fa8), DICO(0x0a844ef0), DICO(0x0e1023c0), DICO(0x1208d980), +- DICO(0x15891360), DICO(0x1bebc380), DICO(0x2087da40), DICO(0x257ac940), +- DICO(0x2caefa00), DICO(0x300defc0), DICO(0x376aa000), DICO(0x438aad80), +- DICO(0x49f00500), DICO(0x4e023780), DICO(0x524e5800), DICO(0x5abcb980), +- DICO(0x079cfc88), DICO(0x0a367240), DICO(0x0f224330), DICO(0x15b51540), +- DICO(0x19065420), DICO(0x1ddbe0a0), DICO(0x23a99d80), DICO(0x28c2d340), +- DICO(0x2f627e40), DICO(0x3487e080), DICO(0x38b76bc0), DICO(0x3d135580), +- DICO(0x43799a80), DICO(0x489a5000), DICO(0x4ece6280), DICO(0x5a82f500), +- DICO(0x06c37e40), DICO(0x093f0540), DICO(0x0e0d0c30), DICO(0x17487860), +- DICO(0x1bf78020), DICO(0x20318000), DICO(0x260b8300), DICO(0x2c615980), +- DICO(0x30c88440), DICO(0x36433b40), DICO(0x3bdb8c40), DICO(0x40050c80), +- DICO(0x44062f80), DICO(0x48a8d480), DICO(0x4dd64d00), DICO(0x55abd380), +- DICO(0x05e9e828), DICO(0x07f24330), DICO(0x0c8b4fe0), DICO(0x0ecd2820), +- DICO(0x17f05c00), DICO(0x1fdb4560), DICO(0x24b4c940), DICO(0x2968d0c0), +- DICO(0x2cbf3500), DICO(0x381eadc0), DICO(0x3d3baf40), DICO(0x42828080), +- DICO(0x47f36300), DICO(0x4c8c6600), DICO(0x51d66f00), DICO(0x5a7e0300), +- DICO(0x065c5cf8), DICO(0x08882540), DICO(0x0d887c70), DICO(0x112ac560), +- DICO(0x150ccdc0), DICO(0x19e49c20), DICO(0x1eb65680), DICO(0x2a76e040), +- DICO(0x2f65fc00), DICO(0x36d79cc0), DICO(0x3c85a900), DICO(0x408dc680), +- DICO(0x44964700), DICO(0x4a98eb00), DICO(0x5528b500), DICO(0x5d660f80), +- DICO(0x06b56230), DICO(0x08e340f0), DICO(0x0e1e4380), DICO(0x112d2d40), +- DICO(0x158dfde0), DICO(0x227e6040), DICO(0x26bff7c0), DICO(0x2b73a100), +- DICO(0x32199580), DICO(0x3585a240), DICO(0x398a5d40), DICO(0x3db8c6c0), +- DICO(0x43905600), DICO(0x4945f800), DICO(0x4f310380), DICO(0x5a6d2400), +- DICO(0x05cfc6f8), DICO(0x0832e650), DICO(0x0de82f80), DICO(0x1a1afe80), +- DICO(0x1e9a1f80), DICO(0x221acd80), DICO(0x27fa00c0), DICO(0x2c4df980), +- DICO(0x31e04bc0), DICO(0x38c9ed40), DICO(0x3db86080), DICO(0x428ec800), +- DICO(0x48500500), DICO(0x4e1ca580), DICO(0x53d3f500), DICO(0x5aa6be00), +- DICO(0x050cc4d0), DICO(0x070c2180), DICO(0x0c4ca980), DICO(0x0fce9f40), +- DICO(0x14af4160), DICO(0x2206a780), DICO(0x25848e80), DICO(0x2c2b84c0), +- DICO(0x35a39980), DICO(0x3914bd80), DICO(0x3caff580), DICO(0x3fcb0600), +- DICO(0x4426b380), DICO(0x486c9700), DICO(0x4f730480), DICO(0x5afd3980), +- DICO(0x05e40640), DICO(0x0830df50), DICO(0x0b9e83e0), DICO(0x158bacc0), +- DICO(0x1d0692e0), DICO(0x2021e0c0), DICO(0x26572e00), DICO(0x2d58cc40), +- DICO(0x30dd0f80), DICO(0x361d68c0), DICO(0x3e3086c0), DICO(0x42450800), +- DICO(0x46c25800), DICO(0x4c45cf00), DICO(0x51dd4200), DICO(0x57326500), +- DICO(0x04d32fa0), DICO(0x064ed2c0), DICO(0x0b07cd70), DICO(0x1c7f6da0), +- DICO(0x213bc140), DICO(0x25051fc0), DICO(0x295cd1c0), DICO(0x2c9f4f80), +- DICO(0x32271540), DICO(0x36a8ec80), DICO(0x3a8e6b40), DICO(0x3e137580), +- DICO(0x42795480), DICO(0x4779b780), DICO(0x4f7d9600), DICO(0x5c09b000), +- DICO(0x044b0748), DICO(0x05fee680), DICO(0x08f66960), DICO(0x11db5940), +- DICO(0x219ede80), DICO(0x27fb96c0), DICO(0x2affc980), DICO(0x2eadc3c0), +- DICO(0x32895700), DICO(0x37180d00), DICO(0x3d4bf880), DICO(0x41741980), +- DICO(0x460d8280), DICO(0x4c34be80), DICO(0x54531e80), DICO(0x5c874000), +- DICO(0x03e25dcc), DICO(0x069e8170), DICO(0x13b3d9c0), DICO(0x1a803260), +- DICO(0x1ed3a4a0), DICO(0x23ea6380), DICO(0x2883b900), DICO(0x2e0ceac0), +- DICO(0x3308e400), DICO(0x38796dc0), DICO(0x3e318e80), DICO(0x441da080), +- DICO(0x4a892300), DICO(0x509b9f80), DICO(0x56caa380), DICO(0x5cc39e00), +- DICO(0x05023038), DICO(0x06b6b4d8), DICO(0x0a449370), DICO(0x15b86ea0), +- DICO(0x224a9200), DICO(0x272e6f40), DICO(0x2a617700), DICO(0x2e915d00), +- DICO(0x3240ac40), DICO(0x37636300), DICO(0x3dd3ea80), DICO(0x420e1f80), +- DICO(0x45bf0680), DICO(0x4a26d980), DICO(0x4f82a900), DICO(0x56576800), +- DICO(0x03d630f4), DICO(0x082140a0), DICO(0x12644700), DICO(0x16b80cc0), +- DICO(0x1ba90c40), DICO(0x21c38300), DICO(0x27dd1480), DICO(0x2e18ee00), +- DICO(0x33fb72c0), DICO(0x39f9d980), DICO(0x40219300), DICO(0x4607fd00), +- DICO(0x4c07e500), DICO(0x51ba8f00), DICO(0x57a24280), DICO(0x5d367700), +- DICO(0x080a5880), DICO(0x0ef3f570), DICO(0x141fd6c0), DICO(0x17c163a0), +- DICO(0x1c2840a0), DICO(0x2111fe00), DICO(0x27376bc0), DICO(0x2cc7edc0), +- DICO(0x329b0100), DICO(0x386d3e40), DICO(0x3ec1bdc0), DICO(0x453f6200), +- DICO(0x4bf16080), DICO(0x51bded00), DICO(0x57ba6800), DICO(0x5d2ffd80), +- DICO(0x08643590), DICO(0x0e911f00), DICO(0x15911380), DICO(0x1ab5e180), +- DICO(0x207ff600), DICO(0x26399b00), DICO(0x2cadae80), DICO(0x3276ca40), +- DICO(0x389d9cc0), DICO(0x3eb22180), DICO(0x44570700), DICO(0x49d15800), +- DICO(0x4f591300), DICO(0x54566a80), DICO(0x5967db00), DICO(0x5e307780), +- DICO(0x07120fa8), DICO(0x0c791c60), DICO(0x112d3b60), DICO(0x149452a0), +- DICO(0x19d2c100), DICO(0x202f1540), DICO(0x269c10c0), DICO(0x2be22880), +- DICO(0x312a07c0), DICO(0x36984fc0), DICO(0x3c7ac3c0), DICO(0x435b5000), +- DICO(0x4aa60280), DICO(0x50f50c00), DICO(0x5719f700), DICO(0x5cb98680), +- DICO(0x05517c88), DICO(0x06ba0a70), DICO(0x0da167c0), DICO(0x19918440), +- DICO(0x1bb37220), DICO(0x20681080), DICO(0x23dc6740), DICO(0x2a1403c0), +- DICO(0x31a71580), DICO(0x34ff0600), DICO(0x395b7cc0), DICO(0x42019200), +- DICO(0x4c818d00), DICO(0x513ff400), DICO(0x5731ce00), DICO(0x5c5f1180), +- DICO(0x04f74ec0), DICO(0x067b4628), DICO(0x0dc4c9c0), DICO(0x19e9fa40), +- DICO(0x1cf00a00), DICO(0x21602a80), DICO(0x25334a80), DICO(0x29b3a800), +- DICO(0x2f9b3600), DICO(0x338c0540), DICO(0x370c3cc0), DICO(0x3abbc3c0), +- DICO(0x4053a000), DICO(0x4f14d980), DICO(0x57e0b600), DICO(0x5d95e780), +- DICO(0x05d844b8), DICO(0x07a05608), DICO(0x0b7837f0), DICO(0x161fb460), +- DICO(0x19c31d00), DICO(0x1cf36280), DICO(0x20ccc200), DICO(0x24ae3980), +- DICO(0x2e2b5800), DICO(0x3316af80), DICO(0x37432b00), DICO(0x4050b280), +- DICO(0x4605be00), DICO(0x4cc78900), DICO(0x556d2080), DICO(0x5c578300), +- DICO(0x0551b768), DICO(0x07024f60), DICO(0x1045fde0), DICO(0x16480120), +- DICO(0x19974420), DICO(0x1ec2b280), DICO(0x228b30c0), DICO(0x295e0ec0), +- DICO(0x2d8775c0), DICO(0x30ef1440), DICO(0x35978080), DICO(0x3a2ab480), +- DICO(0x40229780), DICO(0x4da40980), DICO(0x5718e480), DICO(0x5d68d400), +- DICO(0x03f903e4), DICO(0x06731580), DICO(0x0ecf4850), DICO(0x12e57920), +- DICO(0x1a69ece0), DICO(0x1fe32700), DICO(0x2585b9c0), DICO(0x2aa006c0), +- DICO(0x2f20ea80), DICO(0x37298bc0), DICO(0x3df2a000), DICO(0x44a6c600), +- DICO(0x4b10de00), DICO(0x510fb880), DICO(0x5749c280), DICO(0x5d0b9480), +- DICO(0x03c418fc), DICO(0x056c4cd0), DICO(0x0d0cf070), DICO(0x1907a2c0), +- DICO(0x1be9bc00), DICO(0x21599480), DICO(0x25700e40), DICO(0x2c83e280), +- DICO(0x329fa7c0), DICO(0x389f4cc0), DICO(0x3ef60900), DICO(0x44c19300), +- DICO(0x4af56d00), DICO(0x512eec80), DICO(0x5772ad00), DICO(0x5d37f380), +- DICO(0x04d57920), DICO(0x0716b5e0), DICO(0x0cb3bcc0), DICO(0x1197f740), +- DICO(0x163e5fc0), DICO(0x2194e400), DICO(0x274bb600), DICO(0x2f5d7080), +- DICO(0x361ee340), DICO(0x3b3b22c0), DICO(0x3f800400), DICO(0x4327ef80), +- DICO(0x48b5d200), DICO(0x5116d300), DICO(0x59652e80), DICO(0x5e444d00), +- DICO(0x0755b6b0), DICO(0x0b68c2c0), DICO(0x0f3441d0), DICO(0x124a01a0), +- DICO(0x18910600), DICO(0x20911b80), DICO(0x281f7100), DICO(0x2e4dd640), +- DICO(0x335bd8c0), DICO(0x37f14a80), DICO(0x3cab7b80), DICO(0x43be3180), +- DICO(0x4beee100), DICO(0x52292180), DICO(0x57efea00), DICO(0x5d177300), +- DICO(0x071a7748), DICO(0x0c6cf1b0), DICO(0x10db1500), DICO(0x143bca00), +- DICO(0x1b86a900), DICO(0x22ed1d80), DICO(0x2a1f61c0), DICO(0x305f1400), +- DICO(0x3645f580), DICO(0x3be45b00), DICO(0x4166ea80), DICO(0x46c3f200), +- DICO(0x4c740400), DICO(0x51e30d00), DICO(0x57a37000), DICO(0x5cfc4980), +- DICO(0x08cdd5b0), DICO(0x0daf9840), DICO(0x11cc02a0), DICO(0x1588ed40), +- DICO(0x1cfef5e0), DICO(0x239f12c0), DICO(0x296d3b40), DICO(0x2e61c240), +- DICO(0x333dc800), DICO(0x385d0000), DICO(0x3e1e5180), DICO(0x44196e00), +- DICO(0x4a833000), DICO(0x503d7b80), DICO(0x56556680), DICO(0x5c410c00), +- DICO(0x07372408), DICO(0x0d5c41f0), DICO(0x155dc140), DICO(0x1a9a3cc0), +- DICO(0x21740980), DICO(0x27139f40), DICO(0x2c977040), DICO(0x30cfe5c0), +- DICO(0x35381240), DICO(0x39b83140), DICO(0x3ef3fe80), DICO(0x44547200), +- DICO(0x4a812800), DICO(0x5046c200), DICO(0x56957d00), DICO(0x5c85cd80), +- DICO(0x06da6990), DICO(0x0bc41250), DICO(0x13d54800), DICO(0x1979c220), +- DICO(0x1fad2f00), DICO(0x24bbe0c0), DICO(0x29c08f00), DICO(0x2e34b940), +- DICO(0x32c89e40), DICO(0x376a2040), DICO(0x3cd81080), DICO(0x4267bd00), +- DICO(0x48e8e800), DICO(0x4f150280), DICO(0x55cb1980), DICO(0x5c428b80), +- DICO(0x087d45d0), DICO(0x0cf1ef20), DICO(0x135cba20), DICO(0x16fc7420), +- DICO(0x1b2772e0), DICO(0x1fd4fe60), DICO(0x260a0b80), DICO(0x2bc54c00), +- DICO(0x31694cc0), DICO(0x36d08080), DICO(0x3c245c80), DICO(0x41170900), +- DICO(0x47b18600), DICO(0x4e706180), DICO(0x558d2000), DICO(0x5c428d00), +- DICO(0x081e6490), DICO(0x0d16a7d0), DICO(0x124ccd20), DICO(0x154c20c0), +- DICO(0x1945d8c0), DICO(0x1ee0b700), DICO(0x26a01f00), DICO(0x2d554e40), +- DICO(0x3432eb80), DICO(0x3a605500), DICO(0x401d8980), DICO(0x45737680), +- DICO(0x4b03cb00), DICO(0x50666780), DICO(0x56a0cd00), DICO(0x5cb46480), +- DICO(0x06c58278), DICO(0x091b10b0), DICO(0x0e0e74f0), DICO(0x11faf980), +- DICO(0x14a48600), DICO(0x1e6f7500), DICO(0x27f77100), DICO(0x2ab49940), +- DICO(0x32a1f680), DICO(0x38cb2a80), DICO(0x3c3ff140), DICO(0x3f681cc0), +- DICO(0x44310700), DICO(0x4fa21700), DICO(0x586c6180), DICO(0x5df74200), +- DICO(0x06a3e478), DICO(0x09714400), DICO(0x0d90b7a0), DICO(0x12df2720), +- DICO(0x1618f320), DICO(0x1ac52840), DICO(0x27612900), DICO(0x2e438e00), +- DICO(0x322b6ac0), DICO(0x38022940), DICO(0x3d2a5180), DICO(0x40d76b80), +- DICO(0x46671500), DICO(0x4c5bd480), DICO(0x517a2500), DICO(0x57775b00), +- DICO(0x056c2230), DICO(0x07b8f9d8), DICO(0x0bc6e060), DICO(0x16ac2c80), +- DICO(0x1a92fc00), DICO(0x1e15f000), DICO(0x28b73200), DICO(0x2cd9e5c0), +- DICO(0x3196ecc0), DICO(0x3abae340), DICO(0x4040c580), DICO(0x44c18d80), +- DICO(0x4c086800), DICO(0x50b78500), DICO(0x54e42600), DICO(0x5a549a80), +- DICO(0x04f9fa10), DICO(0x07419358), DICO(0x0c3e15f0), DICO(0x174c1800), +- DICO(0x1ab1fe60), DICO(0x23a12680), DICO(0x27955780), DICO(0x2d14b1c0), +- DICO(0x35cefb00), DICO(0x39576700), DICO(0x3e82b780), DICO(0x42b6a680), +- DICO(0x476d1880), DICO(0x4b6cdd00), DICO(0x52758680), DICO(0x5b69e500), +- DICO(0x060b7ab0), DICO(0x081c05c0), DICO(0x0b540300), DICO(0x0f564270), +- DICO(0x1210aa80), DICO(0x1771e060), DICO(0x25d73280), DICO(0x2e49e380), +- DICO(0x319c1100), DICO(0x3771e700), DICO(0x3c532f40), DICO(0x40c9a900), +- DICO(0x48cbf580), DICO(0x4f819980), DICO(0x566f9400), DICO(0x5cfdd980), +- DICO(0x04efb7b8), DICO(0x0b8a3710), DICO(0x124fd520), DICO(0x1846dde0), +- DICO(0x1e77a9e0), DICO(0x243ea800), DICO(0x2a4e3280), DICO(0x2ff532c0), +- DICO(0x35d27680), DICO(0x3b8cdb00), DICO(0x41463000), DICO(0x4706c700), +- DICO(0x4ca42d80), DICO(0x525d9200), DICO(0x57dabb80), DICO(0x5d59a800), +- DICO(0x03620dec), DICO(0x095872e0), DICO(0x108d4920), DICO(0x16e9ea00), +- DICO(0x1d60b2e0), DICO(0x235e9d00), DICO(0x29893b80), DICO(0x2f59a3c0), +- DICO(0x3556b880), DICO(0x3b10bdc0), DICO(0x40f49500), DICO(0x469cc480), +- DICO(0x4c762d00), DICO(0x51f16980), DICO(0x578c6d00), DICO(0x5c9b5a00), +- DICO(0x05dd9bc0), DICO(0x079c5b20), DICO(0x0d319af0), DICO(0x18997040), +- DICO(0x1c0a1980), DICO(0x20e926c0), DICO(0x25ca1640), DICO(0x29879340), +- DICO(0x30b27040), DICO(0x36077340), DICO(0x39ac3d00), DICO(0x3d686cc0), +- DICO(0x428e5f00), DICO(0x47c1bf80), DICO(0x4e720800), DICO(0x5b419880), +- DICO(0x07694258), DICO(0x0b50db90), DICO(0x0f384950), DICO(0x140dac40), +- DICO(0x17c50d80), DICO(0x1b49b300), DICO(0x24746200), DICO(0x2ce92fc0), +- DICO(0x309fdac0), DICO(0x35c02a00), DICO(0x3aa3df00), DICO(0x3e1edb00), +- DICO(0x431ad280), DICO(0x4b57f500), DICO(0x51463980), DICO(0x586b5200), +- DICO(0x06401dd0), DICO(0x08d3d9b0), DICO(0x0ca0f510), DICO(0x10ed1920), +- DICO(0x1451c2e0), DICO(0x2082f640), DICO(0x2872c0c0), DICO(0x2ca9da00), +- DICO(0x3219cd00), DICO(0x35977300), DICO(0x3a8ba1c0), DICO(0x43d5f280), +- DICO(0x49a51f00), DICO(0x4de9b400), DICO(0x5362ef80), DICO(0x59387300), +- DICO(0x0589c430), DICO(0x07809918), DICO(0x0d086f80), DICO(0x10371c20), +- DICO(0x151842c0), DICO(0x1bfcb1c0), DICO(0x22441040), DICO(0x2722b5c0), +- DICO(0x2b603fc0), DICO(0x314465c0), DICO(0x40308b00), DICO(0x47d5a200), +- DICO(0x4bf7e000), DICO(0x4f937200), DICO(0x5584eb00), DICO(0x5cb02200), +- DICO(0x03b592f0), DICO(0x056ba738), DICO(0x0a8e2250), DICO(0x172436c0), +- DICO(0x1ad35da0), DICO(0x1d72dc80), DICO(0x20cd3900), DICO(0x2a962940), +- DICO(0x2f3b6700), DICO(0x33312b40), DICO(0x38dc6680), DICO(0x41659200), +- DICO(0x4d36a380), DICO(0x52b00980), DICO(0x58c82800), DICO(0x5d741600), +- DICO(0x05bdfe10), DICO(0x0756da20), DICO(0x0cd31fe0), DICO(0x130f1820), +- DICO(0x1561caa0), DICO(0x1962ab20), DICO(0x1c310840), DICO(0x28bf6f80), +- DICO(0x2d2d4500), DICO(0x3230f900), DICO(0x3ac2ea80), DICO(0x3ebe71c0), +- DICO(0x48280700), DICO(0x50254900), DICO(0x5850a200), DICO(0x5e687200), +- DICO(0x04e2b7e8), DICO(0x067f5430), DICO(0x0a8899a0), DICO(0x0d571560), +- DICO(0x1c42f440), DICO(0x22e21fc0), DICO(0x27074340), DICO(0x2c493240), +- DICO(0x2f7ece00), DICO(0x33959ec0), DICO(0x392d3000), DICO(0x459fc800), +- DICO(0x4ba5f700), DICO(0x4fde7780), DICO(0x55f90380), DICO(0x5c928b00), +- DICO(0x0557b940), DICO(0x075f0158), DICO(0x0bd8c540), DICO(0x0f4ee370), +- DICO(0x141dc900), DICO(0x1b241f00), DICO(0x21c32a80), DICO(0x29a23980), +- DICO(0x2e475380), DICO(0x3616f9c0), DICO(0x3a52a500), DICO(0x40345f00), +- DICO(0x4763a500), DICO(0x4eb5bb80), DICO(0x561d4480), DICO(0x5d388580), +- DICO(0x057d7d08), DICO(0x0738c240), DICO(0x0bf46e10), DICO(0x0ec93da0), +- DICO(0x14ab3cc0), DICO(0x23d0f5c0), DICO(0x271e9900), DICO(0x2c0ee4c0), +- DICO(0x301d1f00), DICO(0x33868040), DICO(0x37cdde00), DICO(0x3c805440), +- DICO(0x43c69200), DICO(0x4f5c9a00), DICO(0x56eb3e80), DICO(0x5cdadc80), +- DICO(0x06cdbab0), DICO(0x0999e600), DICO(0x0df39790), DICO(0x12ffc9a0), +- DICO(0x15cfe7a0), DICO(0x1c599300), DICO(0x21afd600), DICO(0x26842bc0), +- DICO(0x32067c00), DICO(0x368bb080), DICO(0x3c350c40), DICO(0x44e8be00), +- DICO(0x4ac84000), DICO(0x4f9c1280), DICO(0x5449ec00), DICO(0x594d5880), +- DICO(0x049a6bd0), DICO(0x06849f08), DICO(0x10592b40), DICO(0x168c1940), +- DICO(0x1992df40), DICO(0x1e91b300), DICO(0x2237e100), DICO(0x2cd73a80), +- DICO(0x30e7c100), DICO(0x361a45c0), DICO(0x3cdd1f40), DICO(0x41d5d100), +- DICO(0x46f79480), DICO(0x4e44c880), DICO(0x55830e80), DICO(0x5d7c0680), +- DICO(0x05087958), DICO(0x06fb7e40), DICO(0x0ac5ace0), DICO(0x14e91d80), +- DICO(0x19ac68c0), DICO(0x1dbf7600), DICO(0x26f916c0), DICO(0x2bd2c980), +- DICO(0x307f7900), DICO(0x38e07e40), DICO(0x3df7f1c0), DICO(0x41323d00), +- DICO(0x44d2f480), DICO(0x48fb0480), DICO(0x51e17900), DICO(0x5c15d700), +- DICO(0x0346cf40), DICO(0x05423408), DICO(0x0b640ce0), DICO(0x13055060), +- DICO(0x1a8c0b60), DICO(0x1d8d2280), DICO(0x218b6500), DICO(0x2c385700), +- DICO(0x30927b40), DICO(0x35d82880), DICO(0x3aa87e00), DICO(0x3da46a40), +- DICO(0x45ea5280), DICO(0x511ecb80), DICO(0x57b53b00), DICO(0x5d491400), +- DICO(0x056aa1c8), DICO(0x075a09a0), DICO(0x0a5d61d0), DICO(0x13cb9fe0), +- DICO(0x1f924dc0), DICO(0x237a11c0), DICO(0x277d6b80), DICO(0x2c2ba440), +- DICO(0x30195c80), DICO(0x35250cc0), DICO(0x3b718200), DICO(0x40113c80), +- DICO(0x44df2680), DICO(0x49f0ed80), DICO(0x50791980), DICO(0x5ac10600), +- DICO(0x046f1e50), DICO(0x061dd758), DICO(0x1236bec0), DICO(0x16c07340), +- DICO(0x1a7399c0), DICO(0x1f61ee20), DICO(0x244b2280), DICO(0x2b803e40), +- DICO(0x2eda5300), DICO(0x331210c0), DICO(0x3773bfc0), DICO(0x411c8400), +- DICO(0x488ff380), DICO(0x4fad2700), DICO(0x55845000), DICO(0x5ca74c00), +- DICO(0x04b456f0), DICO(0x05fca198), DICO(0x0ad056d0), DICO(0x19c3bfe0), +- DICO(0x1d446100), DICO(0x20f67200), DICO(0x24a40b40), DICO(0x28d472c0), +- DICO(0x2da813c0), DICO(0x31880200), DICO(0x35344f40), DICO(0x3ca7f340), +- DICO(0x4aa94300), DICO(0x4f921500), DICO(0x5516d700), DICO(0x5c832880), +- DICO(0x07f468c0), DICO(0x0bbb6e90), DICO(0x0f0f8730), DICO(0x143d6180), +- DICO(0x198b84c0), DICO(0x1c6b30a0), DICO(0x219c8000), DICO(0x28795780), +- DICO(0x2cce3d00), DICO(0x329b1100), DICO(0x3a8d2240), DICO(0x3f579080), +- DICO(0x45a74400), DICO(0x4d000f80), DICO(0x52bd6880), DICO(0x5a743a80), +- DICO(0x06979498), DICO(0x088fecf0), DICO(0x0f1dac90), DICO(0x12077160), +- DICO(0x16d5b120), DICO(0x1c5465c0), DICO(0x21ad14c0), DICO(0x282be280), +- DICO(0x2b66a380), DICO(0x2fa3f200), DICO(0x35a06500), DICO(0x3a458d00), +- DICO(0x44aefc00), DICO(0x4e92f600), DICO(0x55b9fa80), DICO(0x5cfe0280), +- DICO(0x0552b408), DICO(0x06f6ce38), DICO(0x0e8f8d80), DICO(0x1395e900), +- DICO(0x17c7b440), DICO(0x1ec64dc0), DICO(0x236e2200), DICO(0x2abc0b80), +- DICO(0x2e131240), DICO(0x32921100), DICO(0x372633c0), DICO(0x3ca97840), +- DICO(0x496e5000), DICO(0x4f86a800), DICO(0x54072300), DICO(0x5be31c80), +- DICO(0x0470c0b8), DICO(0x0662c468), DICO(0x0c493fd0), DICO(0x1a1949c0), +- DICO(0x1febcc20), DICO(0x2364e900), DICO(0x2a0cce00), DICO(0x2f6f8140), +- DICO(0x3418b000), DICO(0x3c5c7a40), DICO(0x42d39100), DICO(0x476c2b00), +- DICO(0x4e11c300), DICO(0x53621500), DICO(0x583fd280), DICO(0x5ce26600), +- DICO(0x04b006c0), DICO(0x09a1ed40), DICO(0x135aee00), DICO(0x193b5180), +- DICO(0x1f3679a0), DICO(0x24fdbcc0), DICO(0x2b823e00), DICO(0x31835780), +- DICO(0x37c74cc0), DICO(0x3df66780), DICO(0x43c18580), DICO(0x49465980), +- DICO(0x4ed0ce00), DICO(0x53d6fb80), DICO(0x59064300), DICO(0x5deaa100), +- DICO(0x03cbc49c), DICO(0x07735930), DICO(0x138aaa20), DICO(0x1a1e69a0), +- DICO(0x21be93c0), DICO(0x2936f780), DICO(0x2fa76f80), DICO(0x34ae6b00), +- DICO(0x396b7b80), DICO(0x3dbc6700), DICO(0x421a9100), DICO(0x46fd2180), +- DICO(0x4c5dca80), DICO(0x51923b80), DICO(0x576d1300), DICO(0x5d288680), +- DICO(0x03cab7d0), DICO(0x052c88b8), DICO(0x09ed24f0), DICO(0x1c261820), +- DICO(0x209096c0), DICO(0x2361e080), DICO(0x27292800), DICO(0x2bbdc6c0), +- DICO(0x3292da80), DICO(0x36866a40), DICO(0x3c4d5100), DICO(0x45233400), +- DICO(0x4d928a00), DICO(0x52ca9d00), DICO(0x5820d000), DICO(0x5d903880), +- DICO(0x03f83718), DICO(0x0540fa90), DICO(0x13028120), DICO(0x1ad6e160), +- DICO(0x1d784880), DICO(0x22028900), DICO(0x25976b40), DICO(0x2b293700), +- DICO(0x2ddb86c0), DICO(0x317c4340), DICO(0x34e62ec0), DICO(0x3b71bd00), +- DICO(0x4bc34780), DICO(0x52982400), DICO(0x57fa2800), DICO(0x5f19cc00), +- DICO(0x049ceb50), DICO(0x06a8d4e0), DICO(0x09db2470), DICO(0x120e3e60), +- DICO(0x1c8ebb80), DICO(0x21221d00), DICO(0x2679bfc0), DICO(0x2b1e7600), +- DICO(0x2ebbcf80), DICO(0x32d5afc0), DICO(0x3d1bef00), DICO(0x41b11a00), +- DICO(0x45bb2d80), DICO(0x4cb70300), DICO(0x572fdc80), DICO(0x5d876e80), +- DICO(0x04abda68), DICO(0x06698cd0), DICO(0x0ca87230), DICO(0x15086a80), +- DICO(0x176cf4e0), DICO(0x22899440), DICO(0x268fc500), DICO(0x2ba2d940), +- DICO(0x33505980), DICO(0x36944bc0), DICO(0x3b20c280), DICO(0x437e8f00), +- DICO(0x4bf29e80), DICO(0x51776a80), DICO(0x57a77800), DICO(0x5cf6c180), +- DICO(0x06d7f5c0), DICO(0x08fd3cc0), DICO(0x0d8807e0), DICO(0x1140d500), +- DICO(0x146dfc80), DICO(0x1e9fbaa0), DICO(0x23d7bf00), DICO(0x28b2ae80), +- DICO(0x2e5a9b00), DICO(0x327005c0), DICO(0x37736640), DICO(0x4001c500), +- DICO(0x4a862b00), DICO(0x4f7a2e00), DICO(0x54a22080), DICO(0x5b76c380), +- DICO(0x0671fb68), DICO(0x08e4bf30), DICO(0x0d801250), DICO(0x1176b820), +- DICO(0x15128860), DICO(0x1ee21180), DICO(0x24799580), DICO(0x29415a40), +- DICO(0x2efa2380), DICO(0x33fe5040), DICO(0x39bf6d00), DICO(0x3f28b380), +- DICO(0x442b2280), DICO(0x493de680), DICO(0x54377700), DICO(0x5d3a5480), +- DICO(0x065b7970), DICO(0x087820b0), DICO(0x0d8d6aa0), DICO(0x16718620), +- DICO(0x1a3a8f40), DICO(0x1f4099c0), DICO(0x24d87b40), DICO(0x296d85c0), +- DICO(0x2f887c80), DICO(0x342d1b40), DICO(0x3887fc40), DICO(0x3d758b40), +- DICO(0x42641c80), DICO(0x47bf6980), DICO(0x55f82900), DICO(0x5e132a00), +- DICO(0x05ddbc00), DICO(0x081f17a0), DICO(0x0bf23ac0), DICO(0x12fc8d60), +- DICO(0x172bc440), DICO(0x1a833540), DICO(0x1e942200), DICO(0x21e477c0), +- DICO(0x2e75da80), DICO(0x399efac0), DICO(0x3dfb6900), DICO(0x428b3780), +- DICO(0x4922a080), DICO(0x4d4c1700), DICO(0x51bbee00), DICO(0x5b4cfc80), +- DICO(0x06ecf380), DICO(0x08f83990), DICO(0x0cb55680), DICO(0x140b2860), +- DICO(0x18084d00), DICO(0x1aff9940), DICO(0x1f5f6f00), DICO(0x224a3d80), +- DICO(0x2b0f49c0), DICO(0x3613b280), DICO(0x39188f40), DICO(0x3efa3640), +- DICO(0x4771e400), DICO(0x4ca32380), DICO(0x54627580), DICO(0x5cb91000), +- DICO(0x069e7f98), DICO(0x0870c760), DICO(0x0d7b73a0), DICO(0x15ab1040), +- DICO(0x18a4d220), DICO(0x1c4c1f20), DICO(0x1ffaf200), DICO(0x24142580), +- DICO(0x30e47540), DICO(0x37340200), DICO(0x3a69af40), DICO(0x3ed471c0), +- DICO(0x44157880), DICO(0x486b7f00), DICO(0x52ed2b00), DICO(0x5ce3a980), +- DICO(0x047f1080), DICO(0x06463230), DICO(0x0b566e80), DICO(0x0edb9080), +- DICO(0x128a2fa0), DICO(0x1748b340), DICO(0x210b2b00), DICO(0x28099b80), +- DICO(0x2f519740), DICO(0x36fe82c0), DICO(0x3d924b80), DICO(0x43cd3c00), +- DICO(0x4a774680), DICO(0x50d15f00), DICO(0x573b3580), DICO(0x5d4c1c00), +- DICO(0x05fa6a68), DICO(0x0866e4c0), DICO(0x0d133cc0), DICO(0x156d6b20), +- DICO(0x18abebe0), DICO(0x1d374900), DICO(0x23d23d00), DICO(0x27b370c0), +- DICO(0x2f63ef00), DICO(0x352a0600), DICO(0x3a643a40), DICO(0x3f57f980), +- DICO(0x457a7f00), DICO(0x520f6200), DICO(0x593b2c80), DICO(0x5e192b80), +- DICO(0x04e4e0c8), DICO(0x067c3450), DICO(0x0acabe70), DICO(0x1865eec0), +- DICO(0x1c5e9bc0), DICO(0x202facc0), DICO(0x24a609c0), DICO(0x28db7b00), +- DICO(0x2efbd780), DICO(0x336fe5c0), DICO(0x3819a5c0), DICO(0x3e709b40), +- DICO(0x4435ff80), DICO(0x4bd5fb80), DICO(0x5564a100), DICO(0x5d0a4980), +- DICO(0x05a72f00), DICO(0x070199b0), DICO(0x0e654780), DICO(0x14fc7780), +- DICO(0x174283c0), DICO(0x1b231480), DICO(0x1e7b9000), DICO(0x27a013c0), +- DICO(0x2b42f500), DICO(0x2fd9ca00), DICO(0x3672a0c0), DICO(0x3cc23f40), +- DICO(0x48299d80), DICO(0x4f92a800), DICO(0x564d7680), DICO(0x5d3ab580), +- DICO(0x03e63764), DICO(0x05baa3f0), DICO(0x0ab2a300), DICO(0x12cc5f60), +- DICO(0x19a8d5e0), DICO(0x1ea788e0), DICO(0x22cd50c0), DICO(0x25d48a00), +- DICO(0x29924540), DICO(0x32762a00), DICO(0x3bba55c0), DICO(0x4222e800), +- DICO(0x4aba1280), DICO(0x501d0b80), DICO(0x57091200), DICO(0x5d6bf180), +- DICO(0x047daeb0), DICO(0x069548b8), DICO(0x0b002410), DICO(0x13ff7060), +- DICO(0x186aec40), DICO(0x210db240), DICO(0x26f1ce80), DICO(0x2b73c9c0), +- DICO(0x33d57240), DICO(0x385898c0), DICO(0x3eea8cc0), DICO(0x43c79b00), +- DICO(0x496ec200), DICO(0x4e150780), DICO(0x54dcb700), DICO(0x5c3f7380), +- DICO(0x079fd258), DICO(0x0b93bd50), DICO(0x0ff7d8b0), DICO(0x14bd4e00), +- DICO(0x19536ae0), DICO(0x1d8b1640), DICO(0x23747cc0), DICO(0x2861f280), +- DICO(0x2d7d2880), DICO(0x3583b040), DICO(0x3c3cab00), DICO(0x41b7b580), +- DICO(0x498cfc80), DICO(0x506cbd00), DICO(0x57847600), DICO(0x5d05de80), +- DICO(0x06434ec0), DICO(0x0805ccd0), DICO(0x0c4b4c00), DICO(0x13d551c0), +- DICO(0x1685abe0), DICO(0x1a83ea60), DICO(0x1ddc3700), DICO(0x22bc4600), +- DICO(0x2c7ca5c0), DICO(0x30a589c0), DICO(0x395a8700), DICO(0x40c92900), +- DICO(0x472fae80), DICO(0x4f6f6e80), DICO(0x571b3f80), DICO(0x5d8e6980), +- DICO(0x05ec21b0), DICO(0x079ee388), DICO(0x0e4b4580), DICO(0x11abf100), +- DICO(0x16588ec0), DICO(0x1c984ec0), DICO(0x20a384c0), DICO(0x28d6be00), +- DICO(0x2bcca740), DICO(0x3604b600), DICO(0x3f027280), DICO(0x434af000), +- DICO(0x48dac280), DICO(0x4d7e8a00), DICO(0x51f61800), DICO(0x5a6d9380), +- DICO(0x0552c6c0), DICO(0x070c22a0), DICO(0x0a411b50), DICO(0x0e3e5270), +- DICO(0x1193bb60), DICO(0x1b177e00), DICO(0x275b2500), DICO(0x2b42bd80), +- DICO(0x322d7e40), DICO(0x3a170880), DICO(0x3d66b580), DICO(0x41413280), +- DICO(0x46a9ce80), DICO(0x4e4e3800), DICO(0x571f8380), DICO(0x5ddae380), +- DICO(0x055602c0), DICO(0x06e69118), DICO(0x0c9d13f0), DICO(0x1090d500), +- DICO(0x138d2280), DICO(0x171bf540), DICO(0x1b585180), DICO(0x288b9740), +- DICO(0x2db202c0), DICO(0x3525e680), DICO(0x3c303900), DICO(0x4311df80), +- DICO(0x49b92c00), DICO(0x509de900), DICO(0x56e9a080), DICO(0x5d523a80), +- DICO(0x04e79810), DICO(0x069626e8), DICO(0x0a6cf680), DICO(0x0da668c0), +- DICO(0x115872a0), DICO(0x2032eec0), DICO(0x25345dc0), DICO(0x2ae8ea40), +- DICO(0x30224280), DICO(0x351ff640), DICO(0x3ce65a80), DICO(0x454bff00), +- DICO(0x4ee08980), DICO(0x543b4280), DICO(0x59c19280), DICO(0x5ddfbb00), +- DICO(0x03f0bb98), DICO(0x0588f4f0), DICO(0x0a862bc0), DICO(0x14ec76e0), +- DICO(0x184b8a80), DICO(0x1f7bbd80), DICO(0x23f1a7c0), DICO(0x2c367900), +- DICO(0x3234af80), DICO(0x35460ac0), DICO(0x38514c00), DICO(0x3d5f3540), +- DICO(0x48394980), DICO(0x4fbdd380), DICO(0x56de0280), DICO(0x5d4e6500), +- DICO(0x06050f28), DICO(0x08070af0), DICO(0x0be31240), DICO(0x0f5e53e0), +- DICO(0x125f1740), DICO(0x215b1fc0), DICO(0x2883d880), DICO(0x2c181080), +- DICO(0x32810280), DICO(0x35d56800), DICO(0x3a9b0880), DICO(0x3ffaaf80), +- DICO(0x44c65500), DICO(0x4a45ae80), DICO(0x56b4ed80), DICO(0x5e4adc00), +- DICO(0x0372bbb4), DICO(0x04ea4848), DICO(0x09b8de70), DICO(0x151b4a40), +- DICO(0x1be65a00), DICO(0x207655c0), DICO(0x2720dd00), DICO(0x2fc6cc00), +- DICO(0x35b063c0), DICO(0x39bd30c0), DICO(0x3dc5b580), DICO(0x42af7b00), +- DICO(0x48d2bf00), DICO(0x4f46bb80), DICO(0x55f7ca80), DICO(0x5ca7e980), +- DICO(0x033f868c), DICO(0x04d9a0e0), DICO(0x0a18d6d0), DICO(0x13da5580), +- DICO(0x181ae880), DICO(0x207d8580), DICO(0x262022c0), DICO(0x2c6de040), +- DICO(0x3321f100), DICO(0x3927f0c0), DICO(0x3f74ce40), DICO(0x4573e980), +- DICO(0x4ba66c80), DICO(0x51a26100), DICO(0x57d3a800), DICO(0x5d52e780), +- DICO(0x05189860), DICO(0x07231848), DICO(0x0b915710), DICO(0x0f05d6c0), +- DICO(0x13bb0820), DICO(0x223adf00), DICO(0x26ce1ec0), DICO(0x2ce1ac00), +- DICO(0x3401f6c0), DICO(0x3b8c2240), DICO(0x40e4a400), DICO(0x45674f00), +- DICO(0x4b04b880), DICO(0x4f253200), DICO(0x54168600), DICO(0x58f52780), +- DICO(0x0338d184), DICO(0x05205790), DICO(0x09abcd80), DICO(0x0f53ff60), +- DICO(0x1a7fe900), DICO(0x1ef93860), DICO(0x238e2d80), DICO(0x2bd81bc0), +- DICO(0x33161240), DICO(0x368cfb80), DICO(0x3a28b5c0), DICO(0x40c7a600), +- DICO(0x4bac7780), DICO(0x524b7880), DICO(0x58638480), DICO(0x5da07b00), +- DICO(0x04d06f38), DICO(0x065f1518), DICO(0x0c9b31b0), DICO(0x10570d40), +- DICO(0x15e790a0), DICO(0x20f16380), DICO(0x246f23c0), DICO(0x2e222800), +- DICO(0x3198bf00), DICO(0x34b84640), DICO(0x38f5b440), DICO(0x4312df80), +- DICO(0x4d2d3000), DICO(0x5209ee80), DICO(0x579cf180), DICO(0x5cb37680), +- DICO(0x042e6560), DICO(0x05eaff30), DICO(0x0a090d30), DICO(0x0d9f2ab0), +- DICO(0x1a6f0260), DICO(0x209e0c00), DICO(0x25dc95c0), DICO(0x29f89840), +- DICO(0x2f372840), DICO(0x3a301940), DICO(0x3f0e2e80), DICO(0x44465c80), +- DICO(0x49207780), DICO(0x4dfdab80), DICO(0x532ec000), DICO(0x5acefd00), +- DICO(0x04e18ad8), DICO(0x06d5b660), DICO(0x0b2a22d0), DICO(0x0e0e4ef0), +- DICO(0x198304a0), DICO(0x1e4a25c0), DICO(0x23de37c0), DICO(0x290679c0), +- DICO(0x2d523b00), DICO(0x337df940), DICO(0x37948100), DICO(0x3de07300), +- DICO(0x49ee6e80), DICO(0x50576100), DICO(0x55fb1e00), DICO(0x5d080500), +- DICO(0x05312308), DICO(0x070463f0), DICO(0x0daffba0), DICO(0x12d8c3c0), +- DICO(0x163ab7a0), DICO(0x20c64c40), DICO(0x24c8fe40), DICO(0x2a6f65c0), +- DICO(0x3055e100), DICO(0x34420d80), DICO(0x389ded00), DICO(0x3cc57640), +- DICO(0x4280cd00), DICO(0x4e0a4c00), DICO(0x57675f00), DICO(0x5d87d480), +- DICO(0x047bd598), DICO(0x06cb1498), DICO(0x0c359930), DICO(0x138165e0), +- DICO(0x1cae3640), DICO(0x21647640), DICO(0x2836fac0), DICO(0x2cd7b840), +- DICO(0x30d839c0), DICO(0x360c9440), DICO(0x3ae5ca40), DICO(0x40a93b00), +- DICO(0x49401e80), DICO(0x4f739c80), DICO(0x54f33c00), DICO(0x5c190200), +- DICO(0x051c0000), DICO(0x06b45258), DICO(0x0a5eee50), DICO(0x0d46fc30), +- DICO(0x125bbc60), DICO(0x253d8cc0), DICO(0x2a1fd6c0), DICO(0x2df4cf80), +- DICO(0x3239e3c0), DICO(0x35a683c0), DICO(0x3b0bb980), DICO(0x409b3d00), +- DICO(0x46633580), DICO(0x4f2b0600), DICO(0x577cea80), DICO(0x5d86ef00), +- DICO(0x03d19eec), DICO(0x07cce6d0), DICO(0x143b4b00), DICO(0x1a657880), +- DICO(0x212e0280), DICO(0x2831fbc0), DICO(0x2f8ba080), DICO(0x35db8040), +- DICO(0x3bf17f00), DICO(0x413eb100), DICO(0x46154900), DICO(0x4ae18080), +- DICO(0x4f9ba180), DICO(0x5428ba00), DICO(0x590e9080), DICO(0x5de0d880), +- DICO(0x08c7e720), DICO(0x0ff14810), DICO(0x1758cc40), DICO(0x1cc744c0), +- DICO(0x23e45cc0), DICO(0x2b527940), DICO(0x32138580), DICO(0x37b77380), +- DICO(0x3d7da480), DICO(0x4275a800), DICO(0x473ecf00), DICO(0x4bc7dc80), +- DICO(0x50512400), DICO(0x54d2c600), DICO(0x598ce680), DICO(0x5e1e0800), +- DICO(0x09167910), DICO(0x107644a0), DICO(0x171a59e0), DICO(0x1be1ea60), +- DICO(0x21347680), DICO(0x265a5b00), DICO(0x2be41a40), DICO(0x3116e700), +- DICO(0x368b0300), DICO(0x3c225e80), DICO(0x41a6e880), DICO(0x47631680), +- DICO(0x4d47d900), DICO(0x52a28400), DICO(0x583f0e80), DICO(0x5d77bc80), +- DICO(0x040bdf88), DICO(0x05b062a0), DICO(0x0b4a2f70), DICO(0x1b8cd880), +- DICO(0x1ec58c40), DICO(0x23661880), DICO(0x2790ba80), DICO(0x2d0d6c40), +- DICO(0x34f0bc40), DICO(0x3a353f80), DICO(0x3fc3bc40), DICO(0x44998700), +- DICO(0x49b17080), DICO(0x4f31fa00), DICO(0x55311c80), DICO(0x5b5c8f80), +- DICO(0x043e2bd0), DICO(0x0645b0f0), DICO(0x0ade5b90), DICO(0x0d653a90), +- DICO(0x1bc224a0), DICO(0x1f623dc0), DICO(0x27e9a840), DICO(0x2c719bc0), +- DICO(0x2f2ac040), DICO(0x32688300), DICO(0x36695c00), DICO(0x3b8abe40), +- DICO(0x47153a80), DICO(0x52491b00), DICO(0x57ba7680), DICO(0x5ce6c300), +- DICO(0x052940b8), DICO(0x06f28228), DICO(0x0a741c90), DICO(0x0daa3110), +- DICO(0x113bb2e0), DICO(0x2010b640), DICO(0x2610f380), DICO(0x2a5c7740), +- DICO(0x2f7703c0), DICO(0x3388d080), DICO(0x3ceabe40), DICO(0x42462a80), +- DICO(0x47fb0e00), DICO(0x4f7ac480), DICO(0x5706f580), DICO(0x5d92b800), +- DICO(0x03a134a4), DICO(0x05623470), DICO(0x090a0fe0), DICO(0x12f7d3e0), +- DICO(0x1d63e440), DICO(0x20e6ac80), DICO(0x247da8c0), DICO(0x27d99600), +- DICO(0x312e99c0), DICO(0x368fb380), DICO(0x3b3e3ec0), DICO(0x40fead80), +- DICO(0x4888fa00), DICO(0x4fbd5600), DICO(0x5795a480), DICO(0x5d973000), +- DICO(0x05697990), DICO(0x06f33800), DICO(0x0b298290), DICO(0x0de47a60), +- DICO(0x12ef62a0), DICO(0x21e30a00), DICO(0x25f8ff00), DICO(0x2b2287c0), +- DICO(0x2f11fc00), DICO(0x33138000), DICO(0x37b49f80), DICO(0x41325100), +- DICO(0x4ab62800), DICO(0x501eae80), DICO(0x56228780), DICO(0x5c5d8300), +- DICO(0x063830d8), DICO(0x08a76a30), DICO(0x0d376890), DICO(0x117d3a00), +- DICO(0x1476e5c0), DICO(0x1e215720), DICO(0x24bcd680), DICO(0x29674ac0), +- DICO(0x2faab340), DICO(0x33843a00), DICO(0x3822e900), DICO(0x3d30b6c0), +- DICO(0x49cd5480), DICO(0x53187d00), DICO(0x591fe100), DICO(0x5db30f80), +- DICO(0x05cdc378), DICO(0x075c50c8), DICO(0x0e01f830), DICO(0x12b70480), +- DICO(0x15e333e0), DICO(0x192c9f40), DICO(0x1d2d6b80), DICO(0x2c09ca40), +- DICO(0x2eea5cc0), DICO(0x32c89380), DICO(0x376a5b40), DICO(0x42a42600), +- DICO(0x4c695900), DICO(0x5269e380), DICO(0x586d6c80), DICO(0x5cebdb80), +- DICO(0x052bbb80), DICO(0x0702e268), DICO(0x0ca196d0), DICO(0x0f48cef0), +- DICO(0x19d28b60), DICO(0x1ec44a40), DICO(0x24d40f00), DICO(0x29e1eac0), +- DICO(0x2cafaa80), DICO(0x301bd4c0), DICO(0x357ec200), DICO(0x42254480), +- DICO(0x4be32000), DICO(0x4f7a4a00), DICO(0x5447fc00), DICO(0x5cca6a00), +- DICO(0x050fdd18), DICO(0x06c77e10), DICO(0x10561140), DICO(0x1564c340), +- DICO(0x1867abe0), DICO(0x1f00fba0), DICO(0x22c06240), DICO(0x2aed7680), +- DICO(0x2ecc24c0), DICO(0x32abb300), DICO(0x36b42340), DICO(0x3ed8f480), +- DICO(0x4bbdfe80), DICO(0x516bf800), DICO(0x58688b00), DICO(0x5dd44980), +- DICO(0x058aa130), DICO(0x07d69ba8), DICO(0x0d521f40), DICO(0x0ff37ba0), +- DICO(0x18125ec0), DICO(0x1f3a4520), DICO(0x23349840), DICO(0x2c759580), +- DICO(0x2fc21c00), DICO(0x33a42fc0), DICO(0x3dc92900), DICO(0x47befd00), +- DICO(0x4ccd2480), DICO(0x5197a200), DICO(0x56a2ea00), DICO(0x5bdfa900), +- DICO(0x05ac8640), DICO(0x076aec88), DICO(0x0e2e3230), DICO(0x114b6f40), +- DICO(0x155d10a0), DICO(0x19bac600), DICO(0x1fbd75c0), DICO(0x2459c0c0), +- DICO(0x28229b80), DICO(0x2f586fc0), DICO(0x3d0697c0), DICO(0x42a7a500), +- DICO(0x49b0bb80), DICO(0x4e642e80), DICO(0x55774280), DICO(0x5d1a7900), +- DICO(0x05efb470), DICO(0x0831c8a0), DICO(0x0d35ece0), DICO(0x13edc400), +- DICO(0x16c8fec0), DICO(0x1bb25860), DICO(0x204f3140), DICO(0x277b8a40), +- DICO(0x2fe9a000), DICO(0x33af7c40), DICO(0x3b7d2900), DICO(0x419c9a80), +- DICO(0x4591dc80), DICO(0x4bdafd00), DICO(0x55638880), DICO(0x5cef2300), +- DICO(0x05cf4988), DICO(0x078fa8c0), DICO(0x0c291950), DICO(0x12e05320), +- DICO(0x155997e0), DICO(0x195df540), DICO(0x1c1b82c0), DICO(0x22c29400), +- DICO(0x307edec0), DICO(0x34e829c0), DICO(0x3b1b5040), DICO(0x434de400), +- DICO(0x496b9900), DICO(0x4ff88080), DICO(0x5604c480), DICO(0x5c84b080), +- DICO(0x03679fa4), DICO(0x050d4a20), DICO(0x09feec10), DICO(0x100a21e0), +- DICO(0x1483b260), DICO(0x1d76c780), DICO(0x24e75c80), DICO(0x2bd62880), +- DICO(0x32350a40), DICO(0x38be01c0), DICO(0x3f05a280), DICO(0x45295e80), +- DICO(0x4b554800), DICO(0x51618880), DICO(0x575a1500), DICO(0x5d109d80), +- DICO(0x034ffd08), DICO(0x04dccea8), DICO(0x07e289b8), DICO(0x0d6950d0), +- DICO(0x189acec0), DICO(0x1e3bf240), DICO(0x2535aa40), DICO(0x2b88d140), +- DICO(0x329bbb00), DICO(0x386c3500), DICO(0x3e950800), DICO(0x44c43f00), +- DICO(0x4b089780), DICO(0x51223280), DICO(0x574c9780), DICO(0x5d366400), +- DICO(0x036d8db8), DICO(0x04fd88b8), DICO(0x09700a70), DICO(0x116b73c0), +- DICO(0x17258c40), DICO(0x1fd03000), DICO(0x23fdf400), DICO(0x28e08dc0), +- DICO(0x32d688c0), DICO(0x37920b00), DICO(0x3daaa080), DICO(0x46a16c00), +- DICO(0x4f8c3100), DICO(0x54a13700), DICO(0x59d24b80), DICO(0x5cea4d80), +- DICO(0x05797c88), DICO(0x080dc8f0), DICO(0x0bd21520), DICO(0x1095b540), +- DICO(0x138fd400), DICO(0x1aed19c0), DICO(0x29fead00), DICO(0x2f70cec0), +- DICO(0x3327df00), DICO(0x3a812d00), DICO(0x400a8380), DICO(0x449daa00), +- DICO(0x4cd6b600), DICO(0x51f12400), DICO(0x56bdfd80), DICO(0x5be0a100), +- DICO(0x04de6d78), DICO(0x072aed40), DICO(0x0c6fc460), DICO(0x0f260220), +- DICO(0x179d00c0), DICO(0x1e8244e0), DICO(0x23867240), DICO(0x2baf7680), +- DICO(0x2fa6d240), DICO(0x37e83d40), DICO(0x3d1cbfc0), DICO(0x439d0a00), +- DICO(0x49fd3e00), DICO(0x50095e80), DICO(0x559f2080), DICO(0x5b889a00), +- DICO(0x042f5c10), DICO(0x061ab3e8), DICO(0x0dd8f160), DICO(0x126e0b40), +- DICO(0x16ea9040), DICO(0x20a31700), DICO(0x24608140), DICO(0x2ec65080), +- DICO(0x334e1a40), DICO(0x38252100), DICO(0x3fff0900), DICO(0x46519a80), +- DICO(0x4c5e0d80), DICO(0x518c5800), DICO(0x56c5b080), DICO(0x5c6ebb80), +- DICO(0x045ce230), DICO(0x067547b0), DICO(0x0a21c670), DICO(0x1408b820), +- DICO(0x1c0505c0), DICO(0x1e806c80), DICO(0x26d3c640), DICO(0x2ca573c0), +- DICO(0x3014d880), DICO(0x377108c0), DICO(0x3f35cf80), DICO(0x43566100), +- DICO(0x4a612900), DICO(0x5160c780), DICO(0x57d3e300), DICO(0x5d414b80), +- DICO(0x04c8eda8), DICO(0x06a32320), DICO(0x09ab2590), DICO(0x14230760), +- DICO(0x20fb23c0), DICO(0x24aa2880), DICO(0x285a2580), DICO(0x2c464ac0), +- DICO(0x30098280), DICO(0x36232780), DICO(0x3e428d40), DICO(0x42982280), +- DICO(0x47e60d80), DICO(0x4e1ecc00), DICO(0x55eb9200), DICO(0x5c81ed00), +- DICO(0x040d0b90), DICO(0x0586c5c0), DICO(0x0bea2190), DICO(0x1dc8dd60), +- DICO(0x20a07c40), DICO(0x2437e580), DICO(0x27ca5fc0), DICO(0x2d017980), +- DICO(0x34100040), DICO(0x38d3afc0), DICO(0x3da9b700), DICO(0x42082480), +- DICO(0x46586f00), DICO(0x4e3c3d80), DICO(0x55e1ee00), DICO(0x5c938d00), +- DICO(0x03d18c64), DICO(0x05941d60), DICO(0x116b2560), DICO(0x19cc8820), +- DICO(0x1ce930c0), DICO(0x22626080), DICO(0x26d2cf80), DICO(0x2ce2c980), +- DICO(0x305361c0), DICO(0x34b65900), DICO(0x39ee5b40), DICO(0x41508400), +- DICO(0x47ee1e80), DICO(0x50311180), DICO(0x56cb0c00), DICO(0x5d561680), +- DICO(0x0af22cf0), DICO(0x154e1c60), DICO(0x1b44ff60), DICO(0x2087d0c0), +- DICO(0x252f7380), DICO(0x28fe66c0), DICO(0x2d0e9800), DICO(0x30f7ee00), +- DICO(0x3606d640), DICO(0x3bac0a40), DICO(0x417c3700), DICO(0x470c2900), +- DICO(0x4cc20d00), DICO(0x51e55e80), DICO(0x576bc200), DICO(0x5caa7080), +- DICO(0x043314e0), DICO(0x05cb47b0), DICO(0x0985df20), DICO(0x185a22c0), +- DICO(0x1ea68300), DICO(0x21af9100), DICO(0x25cdcb40), DICO(0x297e0a80), +- DICO(0x3142ac80), DICO(0x358bb040), DICO(0x3a1345c0), DICO(0x402ca580), +- DICO(0x4d964780), DICO(0x5420cf80), DICO(0x592adf80), DICO(0x5dfe7a80), +- DICO(0x04c70e20), DICO(0x062fd6f0), DICO(0x113c60a0), DICO(0x159e9900), +- DICO(0x1933e5a0), DICO(0x1decffa0), DICO(0x22373400), DICO(0x27ed7180), +- DICO(0x2a8349c0), DICO(0x2f78f940), DICO(0x3d5c8540), DICO(0x429c3500), +- DICO(0x4936e300), DICO(0x4de08d00), DICO(0x52627700), DICO(0x5d822680), +- DICO(0x04982770), DICO(0x06ab1ad8), DICO(0x0cba1090), DICO(0x10839d60), +- DICO(0x1acd6a60), DICO(0x1f554560), DICO(0x2431c1c0), DICO(0x295db800), +- DICO(0x2d374c00), DICO(0x31f2fd80), DICO(0x3a200480), DICO(0x416bea80), +- DICO(0x4ba1ce00), DICO(0x52a88000), DICO(0x58d0db00), DICO(0x5d3e5800), +- DICO(0x059e0e70), DICO(0x08166ba0), DICO(0x0c9df590), DICO(0x11de5f40), +- DICO(0x14c08ea0), DICO(0x1c5ad6e0), DICO(0x24178ec0), DICO(0x28eb7640), +- DICO(0x31626280), DICO(0x35d43100), DICO(0x3cad10c0), DICO(0x422e1480), +- DICO(0x49baee00), DICO(0x53dd7180), DICO(0x5a17bb80), DICO(0x5e4bb180), +- DICO(0x03c64d00), DICO(0x05de0b28), DICO(0x0ccb82b0), DICO(0x144b1c00), +- DICO(0x19e39ec0), DICO(0x21e795c0), DICO(0x28149380), DICO(0x2f1ff7c0), +- DICO(0x35b7c900), DICO(0x3c5f4800), DICO(0x42799c00), DICO(0x48746180), +- DICO(0x4e8f4d00), DICO(0x53b98380), DICO(0x58d60000), DICO(0x5d71a000), +- DICO(0x050a2990), DICO(0x071bdb88), DICO(0x0f0d76b0), DICO(0x17a78de0), +- DICO(0x1aa20720), DICO(0x22eea3c0), DICO(0x276e9640), DICO(0x2ecc4d80), +- DICO(0x335f7900), DICO(0x37838640), DICO(0x3c81be80), DICO(0x41a4e400), +- DICO(0x476fa280), DICO(0x4f2ab780), DICO(0x56e87b80), DICO(0x5cbf2900), +- DICO(0x06724c98), DICO(0x099f5e20), DICO(0x119bcec0), DICO(0x16be11a0), +- DICO(0x19d53b00), DICO(0x1eb51360), DICO(0x2302c300), DICO(0x29c20d40), +- DICO(0x30dd5200), DICO(0x36576a80), DICO(0x3e3e7540), DICO(0x45aa9f80), +- DICO(0x4c833300), DICO(0x51d7ed00), DICO(0x57a4a380), DICO(0x5cce9100), +- DICO(0x05588b60), DICO(0x075a70a0), DICO(0x0ef96e30), DICO(0x12ac1100), +- DICO(0x1649dde0), DICO(0x1a50cdc0), DICO(0x22486140), DICO(0x27c7c800), +- DICO(0x2e08bd80), DICO(0x355d20c0), DICO(0x3925a9c0), DICO(0x44e2b480), +- DICO(0x4fa4e680), DICO(0x5470e180), DICO(0x595fee80), DICO(0x5d672f00), +- DICO(0x04a781c0), DICO(0x060a89f0), DICO(0x111f56a0), DICO(0x16b93be0), +- DICO(0x19ce9120), DICO(0x1e1fda60), DICO(0x2259f880), DICO(0x285cad80), +- DICO(0x2b140ec0), DICO(0x2f069940), DICO(0x33bbce40), DICO(0x3dd3e6c0), +- DICO(0x49154880), DICO(0x5008e380), DICO(0x568c4680), DICO(0x5da43780), +- DICO(0x053ade38), DICO(0x0708a200), DICO(0x0bad43d0), DICO(0x1860cf40), +- DICO(0x1c40dbe0), DICO(0x1f5a0120), DICO(0x25bcf7c0), DICO(0x29e0c840), +- DICO(0x2f223840), DICO(0x390c8940), DICO(0x3e1d7340), DICO(0x41c6a000), +- DICO(0x46cc2880), DICO(0x5006e280), DICO(0x5744e180), DICO(0x5d297780), +- DICO(0x0401a3f0), DICO(0x07be4a08), DICO(0x14f5f1a0), DICO(0x1c348080), +- DICO(0x226753c0), DICO(0x274b1b80), DICO(0x2c11a300), DICO(0x30798c00), +- DICO(0x35598c80), DICO(0x3aab18c0), DICO(0x4030f380), DICO(0x45c7b400), +- DICO(0x4be5be00), DICO(0x5180db80), DICO(0x57613b00), DICO(0x5cffff80), +- DICO(0x084b3090), DICO(0x0fe5b3b0), DICO(0x16dfd480), DICO(0x1d0aa700), +- DICO(0x24e08180), DICO(0x2b498640), DICO(0x30885b80), DICO(0x34ccc480), +- DICO(0x38fedec0), DICO(0x3cdf9c40), DICO(0x41737600), DICO(0x46ab9800), +- DICO(0x4c772e80), DICO(0x51e5b980), DICO(0x57df9900), DICO(0x5d5d7180), +- DICO(0x09549f00), DICO(0x12b84da0), DICO(0x1aeaf1c0), DICO(0x2142a9c0), +- DICO(0x275c9a00), DICO(0x2c260c80), DICO(0x3038c700), DICO(0x34081d00), +- DICO(0x38612f40), DICO(0x3d0bf8c0), DICO(0x42473e00), DICO(0x47ecad80), +- DICO(0x4db34380), DICO(0x52f0ab00), DICO(0x584cc980), DICO(0x5d62ae80), +- DICO(0x0aeca1e0), DICO(0x14354700), DICO(0x19955ba0), DICO(0x1de331e0), +- DICO(0x21cd60c0), DICO(0x25e72d80), DICO(0x2a402880), DICO(0x2efa64c0), +- DICO(0x3478d9c0), DICO(0x3a889e80), DICO(0x40744e00), DICO(0x4626fe80), +- DICO(0x4bd80900), DICO(0x51120f00), DICO(0x56d8d280), DICO(0x5c654400), +- DICO(0x07a40af8), DICO(0x0e65ec20), DICO(0x14c76780), DICO(0x19b35a60), +- DICO(0x1f76b7c0), DICO(0x24f512c0), DICO(0x2ae89f00), DICO(0x3036c3c0), +- DICO(0x36041800), DICO(0x3bc4df80), DICO(0x41adb080), DICO(0x477fbb80), +- DICO(0x4d5aa480), DICO(0x52cb0600), DICO(0x586f7280), DICO(0x5db40180), +- DICO(0x03997610), DICO(0x06175db0), DICO(0x0ea8c9c0), DICO(0x14397000), +- DICO(0x1ba34f60), DICO(0x22346680), DICO(0x28958080), DICO(0x2ea76840), +- DICO(0x33ee68c0), DICO(0x39e769c0), DICO(0x3f862500), DICO(0x4579b080), +- DICO(0x4b49cd00), DICO(0x5107da80), DICO(0x573cde00), DICO(0x5d090780), +- DICO(0x046fc2f8), DICO(0x0640dbc0), DICO(0x09da7ab0), DICO(0x174e4220), +- DICO(0x23dc8cc0), DICO(0x27016200), DICO(0x2a9a5240), DICO(0x2e6cc7c0), +- DICO(0x321ced40), DICO(0x38ca2d00), DICO(0x41482680), DICO(0x451e3700), +- DICO(0x4b90d800), DICO(0x50d0ba80), DICO(0x55602e80), DICO(0x5a465200), +- DICO(0x03ca7e28), DICO(0x057c9dd0), DICO(0x0c9ff0e0), DICO(0x1957fae0), +- DICO(0x1fef7860), DICO(0x27920c80), DICO(0x2cb233c0), DICO(0x32015c80), +- DICO(0x36af4f40), DICO(0x3ac18240), DICO(0x3f93d8c0), DICO(0x44eaef80), +- DICO(0x4aab5d80), DICO(0x50840e80), DICO(0x56c4cc80), DICO(0x5cb26600), +- DICO(0x038d53f8), DICO(0x050d1118), DICO(0x0bc14690), DICO(0x18918000), +- DICO(0x1e2a6ee0), DICO(0x24cc0c00), DICO(0x2a767d40), DICO(0x2e614940), +- DICO(0x32859c40), DICO(0x377fd940), DICO(0x3d3a3e40), DICO(0x43e81380), +- DICO(0x4aaac080), DICO(0x509e7800), DICO(0x57023a00), DICO(0x5d733c00), +- DICO(0x04cfa5e0), DICO(0x06deeb38), DICO(0x0a501c40), DICO(0x136d8aa0), +- DICO(0x17f16e40), DICO(0x1c119300), DICO(0x26154b00), DICO(0x2a0da100), +- DICO(0x2f5935c0), DICO(0x37108d40), DICO(0x3aef07c0), DICO(0x3fccf340), +- DICO(0x47e4a080), DICO(0x4d8de100), DICO(0x54eb6980), DICO(0x5cdb5380)}; +- +-/* ACELP: table for decoding +- adaptive codebook gain g_p (left column). Scaled by 2.0f. +- innovative codebook gain g_c (right column). Scaled by 16.0f. +-*/ +-const FIXP_SGL fdk_t_qua_gain7b[128 * 2] = { +- 204, 441, 464, 1977, 869, 1077, 1072, 3062, 1281, 4759, 1647, +- 1539, 1845, 7020, 1853, 634, 1995, 2336, 2351, 15400, 2661, 1165, +- 2702, 3900, 2710, 10133, 3195, 1752, 3498, 2624, 3663, 849, 3984, +- 5697, 4214, 3399, 4415, 1304, 4695, 2056, 5376, 4558, 5386, 676, +- 5518, 23554, 5567, 7794, 5644, 3061, 5672, 1513, 5957, 2338, 6533, +- 1060, 6804, 5998, 6820, 1767, 6937, 3837, 7277, 414, 7305, 2665, +- 7466, 11304, 7942, 794, 8007, 1982, 8007, 1366, 8326, 3105, 8336, +- 4810, 8708, 7954, 8989, 2279, 9031, 1055, 9247, 3568, 9283, 1631, +- 9654, 6311, 9811, 2605, 10120, 683, 10143, 4179, 10245, 1946, 10335, +- 1218, 10468, 9960, 10651, 3000, 10951, 1530, 10969, 5290, 11203, 2305, +- 11325, 3562, 11771, 6754, 11839, 1849, 11941, 4495, 11954, 1298, 11975, +- 15223, 11977, 883, 11986, 2842, 12438, 2141, 12593, 3665, 12636, 8367, +- 12658, 1594, 12886, 2628, 12984, 4942, 13146, 1115, 13224, 524, 13341, +- 3163, 13399, 1923, 13549, 5961, 13606, 1401, 13655, 2399, 13782, 3909, +- 13868, 10923, 14226, 1723, 14232, 2939, 14278, 7528, 14439, 4598, 14451, +- 984, 14458, 2265, 14792, 1403, 14818, 3445, 14899, 5709, 15017, 15362, +- 15048, 1946, 15069, 2655, 15405, 9591, 15405, 4079, 15570, 7183, 15687, +- 2286, 15691, 1624, 15699, 3068, 15772, 5149, 15868, 1205, 15970, 696, +- 16249, 3584, 16338, 1917, 16424, 2560, 16483, 4438, 16529, 6410, 16620, +- 11966, 16839, 8780, 17030, 3050, 17033, 18325, 17092, 1568, 17123, 5197, +- 17351, 2113, 17374, 980, 17566, 26214, 17609, 3912, 17639, 32767, 18151, +- 7871, 18197, 2516, 18202, 5649, 18679, 3283, 18930, 1370, 19271, 13757, +- 19317, 4120, 19460, 1973, 19654, 10018, 19764, 6792, 19912, 5135, 20040, +- 2841, 21234, 19833}; +- +-/* ACELP: factor table for interpolation of LPC coeffs in LSP domain */ +-const FIXP_SGL lsp_interpol_factor[2][NB_SUBFR] = { +- {FL2FXCONST_SGL(0.125f), FL2FXCONST_SGL(0.375f), FL2FXCONST_SGL(0.625f), +- FL2FXCONST_SGL(0.875f)}, /* for coreCoderFrameLength = 1024 */ +- {FL2FXCONST_SGL(0.166667f), FL2FXCONST_SGL(0.5f), FL2FXCONST_SGL(0.833333f), +- 0x0} /* for coreCoderFrameLength = 768 */ +-}; +- +-/* For bass post filter */ +-#ifndef TABLE_filt_lp +-const FIXP_SGL fdk_dec_filt_lp[1 + L_FILT] = { +- FL2FXCONST_SGL_FILT(0.088250f), FL2FXCONST_SGL_FILT(0.086410f), +- FL2FXCONST_SGL_FILT(0.081074f), FL2FXCONST_SGL_FILT(0.072768f), +- FL2FXCONST_SGL_FILT(0.062294f), FL2FXCONST_SGL_FILT(0.050623f), +- FL2FXCONST_SGL_FILT(0.038774f), FL2FXCONST_SGL_FILT(0.027692f), +- FL2FXCONST_SGL_FILT(0.018130f), FL2FXCONST_SGL_FILT(0.010578f), +- FL2FXCONST_SGL_FILT(0.005221f), FL2FXCONST_SGL_FILT(0.001946f), +- FL2FXCONST_SGL_FILT(0.000385f)}; +-#endif +- +-/* FAC window tables for coreCoderFrameLength = 1024 */ +-const FIXP_WTB FacWindowSynth128[] = { +- WTC(0x7fff6216), WTC(0x7ffa72d1), WTC(0x7ff09478), WTC(0x7fe1c76b), +- WTC(0x7fce0c3e), WTC(0x7fb563b3), WTC(0x7f97cebd), WTC(0x7f754e80), +- WTC(0x7f4de451), WTC(0x7f2191b4), WTC(0x7ef05860), WTC(0x7eba3a39), +- WTC(0x7e7f3957), WTC(0x7e3f57ff), WTC(0x7dfa98a8), WTC(0x7db0fdf8), +- WTC(0x7d628ac6), WTC(0x7d0f4218), WTC(0x7cb72724), WTC(0x7c5a3d50), +- WTC(0x7bf88830), WTC(0x7b920b89), WTC(0x7b26cb4f), WTC(0x7ab6cba4), +- WTC(0x7a4210d8), WTC(0x79c89f6e), WTC(0x794a7c12), WTC(0x78c7aba2), +- WTC(0x78403329), WTC(0x77b417df), WTC(0x77235f2d), WTC(0x768e0ea6), +- WTC(0x75f42c0b), WTC(0x7555bd4c), WTC(0x74b2c884), WTC(0x740b53fb), +- WTC(0x735f6626), WTC(0x72af05a7), WTC(0x71fa3949), WTC(0x71410805), +- WTC(0x708378ff), WTC(0x6fc19385), WTC(0x6efb5f12), WTC(0x6e30e34a), +- WTC(0x6d6227fa), WTC(0x6c8f351c), WTC(0x6bb812d1), WTC(0x6adcc964), +- WTC(0x69fd614a), WTC(0x6919e320), WTC(0x683257ab), WTC(0x6746c7d8), +- WTC(0x66573cbb), WTC(0x6563bf92), WTC(0x646c59bf), WTC(0x637114cc), +- WTC(0x6271fa69), WTC(0x616f146c), WTC(0x60686ccf), WTC(0x5f5e0db3), +- WTC(0x5e50015d), WTC(0x5d3e5237), WTC(0x5c290acc), WTC(0x5b1035cf), +- WTC(0x59f3de12), WTC(0x58d40e8c), WTC(0x57b0d256), WTC(0x568a34a9), +- WTC(0x556040e2), WTC(0x5433027d), WTC(0x53028518), WTC(0x51ced46e), +- WTC(0x5097fc5e), WTC(0x4f5e08e3), WTC(0x4e210617), WTC(0x4ce10034), +- WTC(0x4b9e0390), WTC(0x4a581c9e), WTC(0x490f57ee), WTC(0x47c3c22f), +- WTC(0x46756828), WTC(0x452456bd), WTC(0x43d09aed), WTC(0x427a41d0), +- WTC(0x4121589b), WTC(0x3fc5ec98), WTC(0x3e680b2c), WTC(0x3d07c1d6), +- WTC(0x3ba51e29), WTC(0x3a402dd2), WTC(0x38d8fe93), WTC(0x376f9e46), +- WTC(0x36041ad9), WTC(0x34968250), WTC(0x3326e2c3), WTC(0x31b54a5e), +- WTC(0x3041c761), WTC(0x2ecc681e), WTC(0x2d553afc), WTC(0x2bdc4e6f), +- WTC(0x2a61b101), WTC(0x28e5714b), WTC(0x27679df4), WTC(0x25e845b6), +- WTC(0x24677758), WTC(0x22e541af), WTC(0x2161b3a0), WTC(0x1fdcdc1b), +- WTC(0x1e56ca1e), WTC(0x1ccf8cb3), WTC(0x1b4732ef), WTC(0x19bdcbf3), +- WTC(0x183366e9), WTC(0x16a81305), WTC(0x151bdf86), WTC(0x138edbb1), +- WTC(0x120116d5), WTC(0x1072a048), WTC(0x0ee38766), WTC(0x0d53db92), +- WTC(0x0bc3ac35), WTC(0x0a3308bd), WTC(0x08a2009a), WTC(0x0710a345), +- WTC(0x057f0035), WTC(0x03ed26e6), WTC(0x025b26d7), WTC(0x00c90f88), +-}; +-const FIXP_WTB FacWindowZir128[] = { +- WTC(0x7f36f078), WTC(0x7da4d929), WTC(0x7c12d91a), WTC(0x7a80ffcb), +- WTC(0x78ef5cbb), WTC(0x775dff66), WTC(0x75ccf743), WTC(0x743c53cb), +- WTC(0x72ac246e), WTC(0x711c789a), WTC(0x6f8d5fb8), WTC(0x6dfee92b), +- WTC(0x6c71244f), WTC(0x6ae4207a), WTC(0x6957ecfb), WTC(0x67cc9917), +- WTC(0x6642340d), WTC(0x64b8cd11), WTC(0x6330734d), WTC(0x61a935e2), +- WTC(0x602323e5), WTC(0x5e9e4c60), WTC(0x5d1abe51), WTC(0x5b9888a8), +- WTC(0x5a17ba4a), WTC(0x5898620c), WTC(0x571a8eb5), WTC(0x559e4eff), +- WTC(0x5423b191), WTC(0x52aac504), WTC(0x513397e2), WTC(0x4fbe389f), +- WTC(0x4e4ab5a2), WTC(0x4cd91d3d), WTC(0x4b697db0), WTC(0x49fbe527), +- WTC(0x489061ba), WTC(0x4727016d), WTC(0x45bfd22e), WTC(0x445ae1d7), +- WTC(0x42f83e2a), WTC(0x4197f4d4), WTC(0x403a1368), WTC(0x3edea765), +- WTC(0x3d85be30), WTC(0x3c2f6513), WTC(0x3adba943), WTC(0x398a97d8), +- WTC(0x383c3dd1), WTC(0x36f0a812), WTC(0x35a7e362), WTC(0x3461fc70), +- WTC(0x331effcc), WTC(0x31def9e9), WTC(0x30a1f71d), WTC(0x2f6803a2), +- WTC(0x2e312b92), WTC(0x2cfd7ae8), WTC(0x2bccfd83), WTC(0x2a9fbf1e), +- WTC(0x2975cb57), WTC(0x284f2daa), WTC(0x272bf174), WTC(0x260c21ee), +- WTC(0x24efca31), WTC(0x23d6f534), WTC(0x22c1adc9), WTC(0x21affea3), +- WTC(0x20a1f24d), WTC(0x1f979331), WTC(0x1e90eb94), WTC(0x1d8e0597), +- WTC(0x1c8eeb34), WTC(0x1b93a641), WTC(0x1a9c406e), WTC(0x19a8c345), +- WTC(0x18b93828), WTC(0x17cda855), WTC(0x16e61ce0), WTC(0x16029eb6), +- WTC(0x1523369c), WTC(0x1447ed2f), WTC(0x1370cae4), WTC(0x129dd806), +- WTC(0x11cf1cb6), WTC(0x1104a0ee), WTC(0x103e6c7b), WTC(0x0f7c8701), +- WTC(0x0ebef7fb), WTC(0x0e05c6b7), WTC(0x0d50fa59), WTC(0x0ca099da), +- WTC(0x0bf4ac05), WTC(0x0b4d377c), WTC(0x0aaa42b4), WTC(0x0a0bd3f5), +- WTC(0x0971f15a), WTC(0x08dca0d3), WTC(0x084be821), WTC(0x07bfccd7), +- WTC(0x0738545e), WTC(0x06b583ee), WTC(0x06376092), WTC(0x05bdef28), +- WTC(0x0549345c), WTC(0x04d934b1), WTC(0x046df477), WTC(0x040777d0), +- WTC(0x03a5c2b0), WTC(0x0348d8dc), WTC(0x02f0bde8), WTC(0x029d753a), +- WTC(0x024f0208), WTC(0x02056758), WTC(0x01c0a801), WTC(0x0180c6a9), +- WTC(0x0145c5c7), WTC(0x010fa7a0), WTC(0x00de6e4c), WTC(0x00b21baf), +- WTC(0x008ab180), WTC(0x00683143), WTC(0x004a9c4d), WTC(0x0031f3c2), +- WTC(0x001e3895), WTC(0x000f6b88), WTC(0x00058d2f), WTC(0x00009dea), +-}; +-const FIXP_WTB FacWindowSynth64[] = { +- WTC(0x7ffd885a), WTC(0x7fe9cbc0), WTC(0x7fc25596), WTC(0x7f872bf3), +- WTC(0x7f3857f6), WTC(0x7ed5e5c6), WTC(0x7e5fe493), WTC(0x7dd6668f), +- WTC(0x7d3980ec), WTC(0x7c894bde), WTC(0x7bc5e290), WTC(0x7aef6323), +- WTC(0x7a05eead), WTC(0x7909a92d), WTC(0x77fab989), WTC(0x76d94989), +- WTC(0x75a585cf), WTC(0x745f9dd1), WTC(0x7307c3d0), WTC(0x719e2cd2), +- WTC(0x7023109a), WTC(0x6e96a99d), WTC(0x6cf934fc), WTC(0x6b4af279), +- WTC(0x698c246c), WTC(0x67bd0fbd), WTC(0x65ddfbd3), WTC(0x63ef3290), +- WTC(0x61f1003f), WTC(0x5fe3b38d), WTC(0x5dc79d7c), WTC(0x5b9d1154), +- WTC(0x59646498), WTC(0x571deefa), WTC(0x54ca0a4b), WTC(0x5269126e), +- WTC(0x4ffb654d), WTC(0x4d8162c4), WTC(0x4afb6c98), WTC(0x4869e665), +- WTC(0x45cd358f), WTC(0x4325c135), WTC(0x4073f21d), WTC(0x3db832a6), +- WTC(0x3af2eeb7), WTC(0x382493b0), WTC(0x354d9057), WTC(0x326e54c7), +- WTC(0x2f875262), WTC(0x2c98fbba), WTC(0x29a3c485), WTC(0x26a82186), +- WTC(0x23a6887f), WTC(0x209f701c), WTC(0x1d934fe5), WTC(0x1a82a026), +- WTC(0x176dd9de), WTC(0x145576b1), WTC(0x1139f0cf), WTC(0x0e1bc2e4), +- WTC(0x0afb6805), WTC(0x07d95b9e), WTC(0x04b6195d), WTC(0x01921d20), +-}; +-const FIXP_WTB FacWindowZir64[] = { +- WTC(0x7e6de2e0), WTC(0x7b49e6a3), WTC(0x7826a462), WTC(0x750497fb), +- WTC(0x71e43d1c), WTC(0x6ec60f31), WTC(0x6baa894f), WTC(0x68922622), +- WTC(0x657d5fda), WTC(0x626cb01b), WTC(0x5f608fe4), WTC(0x5c597781), +- WTC(0x5957de7a), WTC(0x565c3b7b), WTC(0x53670446), WTC(0x5078ad9e), +- WTC(0x4d91ab39), WTC(0x4ab26fa9), WTC(0x47db6c50), WTC(0x450d1149), +- WTC(0x4247cd5a), WTC(0x3f8c0de3), WTC(0x3cda3ecb), WTC(0x3a32ca71), +- WTC(0x3796199b), WTC(0x35049368), WTC(0x327e9d3c), WTC(0x30049ab3), +- WTC(0x2d96ed92), WTC(0x2b35f5b5), WTC(0x28e21106), WTC(0x269b9b68), +- WTC(0x2462eeac), WTC(0x22386284), WTC(0x201c4c73), WTC(0x1e0effc1), +- WTC(0x1c10cd70), WTC(0x1a22042d), WTC(0x1842f043), WTC(0x1673db94), +- WTC(0x14b50d87), WTC(0x1306cb04), WTC(0x11695663), WTC(0x0fdcef66), +- WTC(0x0e61d32e), WTC(0x0cf83c30), WTC(0x0ba0622f), WTC(0x0a5a7a31), +- WTC(0x0926b677), WTC(0x08054677), WTC(0x06f656d3), WTC(0x05fa1153), +- WTC(0x05109cdd), WTC(0x043a1d70), WTC(0x0376b422), WTC(0x02c67f14), +- WTC(0x02299971), WTC(0x01a01b6d), WTC(0x012a1a3a), WTC(0x00c7a80a), +- WTC(0x0078d40d), WTC(0x003daa6a), WTC(0x00163440), WTC(0x000277a6), +-}; +-const FIXP_WTB FacWindowSynth32[] = { +- WTC(0x7ff62182), WTC(0x7fa736b4), WTC(0x7f0991c4), WTC(0x7e1d93ea), +- WTC(0x7ce3ceb2), WTC(0x7b5d039e), WTC(0x798a23b1), WTC(0x776c4edb), +- WTC(0x7504d345), WTC(0x72552c85), WTC(0x6f5f02b2), WTC(0x6c242960), +- WTC(0x68a69e81), WTC(0x64e88926), WTC(0x60ec3830), WTC(0x5cb420e0), +- WTC(0x5842dd54), WTC(0x539b2af0), WTC(0x4ebfe8a5), WTC(0x49b41533), +- WTC(0x447acd50), WTC(0x3f1749b8), WTC(0x398cdd32), WTC(0x33def287), +- WTC(0x2e110a62), WTC(0x2826b928), WTC(0x2223a4c5), WTC(0x1c0b826a), +- WTC(0x15e21445), WTC(0x0fab272b), WTC(0x096a9049), WTC(0x03242abf), +-}; +-const FIXP_WTB FacWindowZir32[] = { +- WTC(0x7cdbd541), WTC(0x76956fb7), WTC(0x7054d8d5), WTC(0x6a1debbb), +- WTC(0x63f47d96), WTC(0x5ddc5b3b), WTC(0x57d946d8), WTC(0x51eef59e), +- WTC(0x4c210d79), WTC(0x467322ce), WTC(0x40e8b648), WTC(0x3b8532b0), +- WTC(0x364beacd), WTC(0x3140175b), WTC(0x2c64d510), WTC(0x27bd22ac), +- WTC(0x234bdf20), WTC(0x1f13c7d0), WTC(0x1b1776da), WTC(0x1759617f), +- WTC(0x13dbd6a0), WTC(0x10a0fd4e), WTC(0x0daad37b), WTC(0x0afb2cbb), +- WTC(0x0893b125), WTC(0x0675dc4f), WTC(0x04a2fc62), WTC(0x031c314e), +- WTC(0x01e26c16), WTC(0x00f66e3c), WTC(0x0058c94c), WTC(0x0009de7e), +-}; +- +-/* FAC window tables for coreCoderFrameLength = 768 */ +-const FIXP_WTB FacWindowSynth96[] = { +- WTC(0x7ffee744), WTC(0x7ff62182), WTC(0x7fe49698), WTC(0x7fca47b9), +- WTC(0x7fa736b4), WTC(0x7f7b65ef), WTC(0x7f46d86c), WTC(0x7f0991c4), +- WTC(0x7ec3962a), WTC(0x7e74ea6a), WTC(0x7e1d93ea), WTC(0x7dbd98a4), +- WTC(0x7d54ff2e), WTC(0x7ce3ceb2), WTC(0x7c6a0ef2), WTC(0x7be7c847), +- WTC(0x7b5d039e), WTC(0x7ac9ca7a), WTC(0x7a2e26f2), WTC(0x798a23b1), +- WTC(0x78ddcbf5), WTC(0x78292b8d), WTC(0x776c4edb), WTC(0x76a742d1), +- WTC(0x75da14ef), WTC(0x7504d345), WTC(0x74278c72), WTC(0x73424fa0), +- WTC(0x72552c85), WTC(0x71603361), WTC(0x706374ff), WTC(0x6f5f02b2), +- WTC(0x6e52ee52), WTC(0x6d3f4a40), WTC(0x6c242960), WTC(0x6b019f1a), +- WTC(0x69d7bf57), WTC(0x68a69e81), WTC(0x676e5183), WTC(0x662eedc3), +- WTC(0x64e88926), WTC(0x639b3a0b), WTC(0x62471749), WTC(0x60ec3830), +- WTC(0x5f8ab487), WTC(0x5e22a487), WTC(0x5cb420e0), WTC(0x5b3f42ae), +- WTC(0x59c42381), WTC(0x5842dd54), WTC(0x56bb8a90), WTC(0x552e4605), +- WTC(0x539b2af0), WTC(0x520254ef), WTC(0x5063e008), WTC(0x4ebfe8a5), +- WTC(0x4d168b8b), WTC(0x4b67e5e4), WTC(0x49b41533), WTC(0x47fb3757), +- WTC(0x463d6a87), WTC(0x447acd50), WTC(0x42b37e96), WTC(0x40e79d8c), +- WTC(0x3f1749b8), WTC(0x3d42a2ec), WTC(0x3b69c947), WTC(0x398cdd32), +- WTC(0x37abff5d), WTC(0x35c750bc), WTC(0x33def287), WTC(0x31f30638), +- WTC(0x3003ad85), WTC(0x2e110a62), WTC(0x2c1b3efb), WTC(0x2a226db5), +- WTC(0x2826b928), WTC(0x26284422), WTC(0x2427319d), WTC(0x2223a4c5), +- WTC(0x201dc0ef), WTC(0x1e15a99a), WTC(0x1c0b826a), WTC(0x19ff6f2a), +- WTC(0x17f193c5), WTC(0x15e21445), WTC(0x13d114d0), WTC(0x11beb9aa), +- WTC(0x0fab272b), WTC(0x0d9681c2), WTC(0x0b80edf1), WTC(0x096a9049), +- WTC(0x07538d6b), WTC(0x053c0a01), WTC(0x03242abf), WTC(0x010c1460), +-}; +-const FIXP_WTB FacWindowZir96[] = { +- WTC(0x7ef3eba0), WTC(0x7cdbd541), WTC(0x7ac3f5ff), WTC(0x78ac7295), +- WTC(0x76956fb7), WTC(0x747f120f), WTC(0x72697e3e), WTC(0x7054d8d5), +- WTC(0x6e414656), WTC(0x6c2eeb30), WTC(0x6a1debbb), WTC(0x680e6c3b), +- WTC(0x660090d6), WTC(0x63f47d96), WTC(0x61ea5666), WTC(0x5fe23f11), +- WTC(0x5ddc5b3b), WTC(0x5bd8ce63), WTC(0x59d7bbde), WTC(0x57d946d8), +- WTC(0x55dd924b), WTC(0x53e4c105), WTC(0x51eef59e), WTC(0x4ffc527b), +- WTC(0x4e0cf9c8), WTC(0x4c210d79), WTC(0x4a38af44), WTC(0x485400a3), +- WTC(0x467322ce), WTC(0x449636b9), WTC(0x42bd5d14), WTC(0x40e8b648), +- WTC(0x3f186274), WTC(0x3d4c816a), WTC(0x3b8532b0), WTC(0x39c29579), +- WTC(0x3804c8a9), WTC(0x364beacd), WTC(0x34981a1c), WTC(0x32e97475), +- WTC(0x3140175b), WTC(0x2f9c1ff8), WTC(0x2dfdab11), WTC(0x2c64d510), +- WTC(0x2ad1b9fb), WTC(0x29447570), WTC(0x27bd22ac), WTC(0x263bdc7f), +- WTC(0x24c0bd52), WTC(0x234bdf20), WTC(0x21dd5b79), WTC(0x20754b79), +- WTC(0x1f13c7d0), WTC(0x1db8e8b7), WTC(0x1c64c5f5), WTC(0x1b1776da), +- WTC(0x19d1123d), WTC(0x1891ae7d), WTC(0x1759617f), WTC(0x162840a9), +- WTC(0x14fe60e6), WTC(0x13dbd6a0), WTC(0x12c0b5c0), WTC(0x11ad11ae), +- WTC(0x10a0fd4e), WTC(0x0f9c8b01), WTC(0x0e9fcc9f), WTC(0x0daad37b), +- WTC(0x0cbdb060), WTC(0x0bd8738e), WTC(0x0afb2cbb), WTC(0x0a25eb11), +- WTC(0x0958bd2f), WTC(0x0893b125), WTC(0x07d6d473), WTC(0x0722340b), +- WTC(0x0675dc4f), WTC(0x05d1d90e), WTC(0x05363586), WTC(0x04a2fc62), +- WTC(0x041837b9), WTC(0x0395f10e), WTC(0x031c314e), WTC(0x02ab00d2), +- WTC(0x0242675c), WTC(0x01e26c16), WTC(0x018b1596), WTC(0x013c69d6), +- WTC(0x00f66e3c), WTC(0x00b92794), WTC(0x00849a11), WTC(0x0058c94c), +- WTC(0x0035b847), WTC(0x001b6968), WTC(0x0009de7e), WTC(0x000118bc), +-}; +-const FIXP_WTB FacWindowSynth48[] = { +- WTC(0x7ffb9d15), WTC(0x7fd8878e), WTC(0x7f92661d), WTC(0x7f294bfd), +- WTC(0x7e9d55fc), WTC(0x7deeaa7a), WTC(0x7d1d7958), WTC(0x7c29fbee), +- WTC(0x7b1474fd), WTC(0x79dd3098), WTC(0x78848414), WTC(0x770acdec), +- WTC(0x757075ac), WTC(0x73b5ebd1), WTC(0x71dba9ab), WTC(0x6fe2313c), +- WTC(0x6dca0d14), WTC(0x6b93d02e), WTC(0x694015c3), WTC(0x66cf8120), +- WTC(0x6442bd7e), WTC(0x619a7dce), WTC(0x5ed77c8a), WTC(0x5bfa7b82), +- WTC(0x590443a7), WTC(0x55f5a4d2), WTC(0x52cf758f), WTC(0x4f9292dc), +- WTC(0x4c3fdff4), WTC(0x48d84609), WTC(0x455cb40c), WTC(0x41ce1e65), +- WTC(0x3e2d7eb1), WTC(0x3a7bd382), WTC(0x36ba2014), WTC(0x32e96c09), +- WTC(0x2f0ac320), WTC(0x2b1f34eb), WTC(0x2727d486), WTC(0x2325b847), +- WTC(0x1f19f97b), WTC(0x1b05b40f), WTC(0x16ea0646), WTC(0x12c8106f), +- WTC(0x0ea0f48c), WTC(0x0a75d60e), WTC(0x0647d97c), WTC(0x02182427), +-}; +-const FIXP_WTB FacWindowZir48[] = { +- WTC(0x7de7dbd9), WTC(0x79b82684), WTC(0x758a29f2), WTC(0x715f0b74), +- WTC(0x6d37ef91), WTC(0x6915f9ba), WTC(0x64fa4bf1), WTC(0x60e60685), +- WTC(0x5cda47b9), WTC(0x58d82b7a), WTC(0x54e0cb15), WTC(0x50f53ce0), +- WTC(0x4d1693f7), WTC(0x4945dfec), WTC(0x45842c7e), WTC(0x41d2814f), +- WTC(0x3e31e19b), WTC(0x3aa34bf4), WTC(0x3727b9f7), WTC(0x33c0200c), +- WTC(0x306d6d24), WTC(0x2d308a71), WTC(0x2a0a5b2e), WTC(0x26fbbc59), +- WTC(0x2405847e), WTC(0x21288376), WTC(0x1e658232), WTC(0x1bbd4282), +- WTC(0x19307ee0), WTC(0x16bfea3d), WTC(0x146c2fd2), WTC(0x1235f2ec), +- WTC(0x101dcec4), WTC(0x0e245655), WTC(0x0c4a142f), WTC(0x0a8f8a54), +- WTC(0x08f53214), WTC(0x077b7bec), WTC(0x0622cf68), WTC(0x04eb8b03), +- WTC(0x03d60412), WTC(0x02e286a8), WTC(0x02115586), WTC(0x0162aa04), +- WTC(0x00d6b403), WTC(0x006d99e3), WTC(0x00277872), WTC(0x000462eb), +-}; +diff --git a/libAACdec/src/usacdec_rom.h b/libAACdec/src/usacdec_rom.h +deleted file mode 100644 +index f969e90..0000000 +--- a/libAACdec/src/usacdec_rom.h ++++ /dev/null +@@ -1,154 +0,0 @@ +-/* ----------------------------------------------------------------------------- +-Software License for The Fraunhofer FDK AAC Codec Library for Android +- +-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +-Forschung e.V. All rights reserved. +- +- 1. INTRODUCTION +-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +-that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +-scheme for digital audio. This FDK AAC Codec software is intended to be used on +-a wide variety of Android devices. +- +-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +-general perceptual audio codecs. AAC-ELD is considered the best-performing +-full-bandwidth communications codec by independent studies and is widely +-deployed. AAC has been standardized by ISO and IEC as part of the MPEG +-specifications. +- +-Patent licenses for necessary patent claims for the FDK AAC Codec (including +-those of Fraunhofer) may be obtained through Via Licensing +-(www.vialicensing.com) or through the respective patent owners individually for +-the purpose of encoding or decoding bit streams in products that are compliant +-with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +-Android devices already license these patent claims through Via Licensing or +-directly from the patent owners, and therefore FDK AAC Codec software may +-already be covered under those patent licenses when it is used for those +-licensed purposes only. +- +-Commercially-licensed AAC software libraries, including floating-point versions +-with enhanced sound quality, are also available from Fraunhofer. Users are +-encouraged to check the Fraunhofer website for additional applications +-information and documentation. +- +-2. COPYRIGHT LICENSE +- +-Redistribution and use in source and binary forms, with or without modification, +-are permitted without payment of copyright license fees provided that you +-satisfy the following conditions: +- +-You must retain the complete text of this software license in redistributions of +-the FDK AAC Codec or your modifications thereto in source code form. +- +-You must retain the complete text of this software license in the documentation +-and/or other materials provided with redistributions of the FDK AAC Codec or +-your modifications thereto in binary form. You must make available free of +-charge copies of the complete source code of the FDK AAC Codec and your +-modifications thereto to recipients of copies in binary form. +- +-The name of Fraunhofer may not be used to endorse or promote products derived +-from this library without prior written permission. +- +-You may not charge copyright license fees for anyone to use, copy or distribute +-the FDK AAC Codec software or your modifications thereto. +- +-Your modified versions of the FDK AAC Codec must carry prominent notices stating +-that you changed the software and the date of any change. For modified versions +-of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +-must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +-AAC Codec Library for Android." +- +-3. NO PATENT LICENSE +- +-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +-limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +-Fraunhofer provides no warranty of patent non-infringement with respect to this +-software. +- +-You may use this FDK AAC Codec software or modifications thereto only for +-purposes that are authorized by appropriate patent licenses. +- +-4. DISCLAIMER +- +-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +-holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +-including but not limited to the implied warranties of merchantability and +-fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +-or consequential damages, including but not limited to procurement of substitute +-goods or services; loss of use, data, or profits, or business interruption, +-however caused and on any theory of liability, whether in contract, strict +-liability, or tort (including negligence), arising in any way out of the use of +-this software, even if advised of the possibility of such damage. +- +-5. CONTACT INFORMATION +- +-Fraunhofer Institute for Integrated Circuits IIS +-Attention: Audio and Multimedia Departments - FDK AAC LL +-Am Wolfsmantel 33 +-91058 Erlangen, Germany +- +-www.iis.fraunhofer.de/amm +-amm-info@iis.fraunhofer.de +------------------------------------------------------------------------------ */ +- +-/**************************** AAC decoder library ****************************** +- +- Author(s): M. Jander +- +- Description: re8.h +- +-*******************************************************************************/ +- +-#ifndef USACDEC_ROM_H +-#define USACDEC_ROM_H +- +-#include "common_fix.h" +-#include "FDK_lpc.h" +- +-#include "usacdec_const.h" +- +-/* RE8 lattice quantiser constants */ +-#define NB_SPHERE 32 +-#define NB_LEADER 37 +-#define NB_LDSIGN 226 +-#define NB_LDQ3 9 +-#define NB_LDQ4 28 +- +-#define LSF_SCALE 13 +- +-/* RE8 lattice quantiser tables */ +-extern const UINT fdk_dec_tab_factorial[8]; +-extern const UCHAR fdk_dec_Ia[NB_LEADER]; +-extern const UCHAR fdk_dec_Ds[NB_LDSIGN]; +-extern const USHORT fdk_dec_Is[NB_LDSIGN]; +-extern const UCHAR fdk_dec_Ns[], fdk_dec_A3[], fdk_dec_A4[]; +-extern const UCHAR fdk_dec_Da[][8]; +-extern const USHORT fdk_dec_I3[], fdk_dec_I4[]; +- +-/* temp float tables for LPC decoding */ +-extern const FIXP_LPC fdk_dec_lsf_init[16]; +-extern const FIXP_LPC fdk_dec_dico_lsf_abs_8b[16 * 256]; +- +-/* ACELP tables */ +-#define SF_QUA_GAIN7B 4 +-extern const FIXP_SGL fdk_t_qua_gain7b[128 * 2]; +-extern const FIXP_SGL lsp_interpol_factor[2][NB_SUBFR]; +- +-/* For bass post filter */ +-#define L_FILT 12 /* Delay of up-sampling filter */ +- +-extern const FIXP_SGL fdk_dec_filt_lp[1 + L_FILT]; +- +-extern const FIXP_WTB FacWindowSynth128[128]; +-extern const FIXP_WTB FacWindowZir128[128]; +-extern const FIXP_WTB FacWindowSynth64[64]; +-extern const FIXP_WTB FacWindowZir64[64]; +-extern const FIXP_WTB FacWindowSynth32[32]; +-extern const FIXP_WTB FacWindowZir32[32]; +-extern const FIXP_WTB FacWindowSynth96[96]; +-extern const FIXP_WTB FacWindowZir96[96]; +-extern const FIXP_WTB FacWindowSynth48[48]; +-extern const FIXP_WTB FacWindowZir48[48]; +- +-#endif /* USACDEC_ROM_H */ +-- +cgit v1.1 +