diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2012-09-09 11:48:51 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2012-09-09 11:52:09 -0700 |
commit | 381d69840ad3af2259f0b7ef49236f9ee9c76b76 (patch) | |
tree | 059754bb7c5ff151506ac52a2962d532a180b5bc /libFDK | |
parent | fef220869b4e5bf9241369d3379b389136c2f174 (diff) | |
download | ODR-AudioEnc-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.gz ODR-AudioEnc-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.bz2 ODR-AudioEnc-381d69840ad3af2259f0b7ef49236f9ee9c76b76.zip |
Bug fixes in AAC decoder, AAC encoder, FDK library
Latest code drop from Fraunhofer:
* AAC-Decoder
- Expanded AAC-LD/ELD decoder TNS max band tables to avoid wrong data
access for sampling rates <22kHz and >48kHz.
Modified file(s):
libAACdec\src\aacdec_tns.cpp
libAACdec\src\aac_rom.h
libAACdec\src\aac_rom.cpp
- Fixed ELD synthesis QMF filterbank scaling for downsampled SBR.
Modified file(s):
libFDK\src\qmf.cpp
* AAC-Encoder
- Fixed bit rate limiting for lower limit as introduced in the Delivery 2012-05-11.
Modified file(s):
libAACenc\include\aacenc_lib.h
libAACenc\src\aacenc.h
libAACenc\src\aacenc.cpp
libSBRenc\src\sbr_rom.h
libSBRenc\src\sbr_rom.cpp
- Allow negative prediction gain as meaning that there is no coding gain.
Make use of scaleValueSaturate in gauss window calculation.
Modified file(s):
libAACenc\src\aacenc_tns.cpp
- Added energy saturation to prevent overflow in short blocks.
Modified file(s):
libAACenc\src\grp_data.cpp
- Perform scalefactor adaption in case quantized lines are out of valid range.
Modified file(s):
libAACenc\src\quantize.cpp
- Interrupt quantization loop when no spectral data is available.
Adjustments in bitreservoir adaption.
Modified file(s):
libAACenc\src\qc_main.cpp
- Indroduced dynamic scaling in none missing harmonic energy lowering compensation.
Modified file(s):
libSBRenc\src\env_est.cpp
* FDK-Library
- Fixed saturation for negative values in scaleValueSaturate.
Modified file(s):
libFDK\include\scale.h
Change-Id: If830ea65caef6b5554281e4b7a77a8b2e08825ce
Diffstat (limited to 'libFDK')
-rw-r--r-- | libFDK/include/common_fix.h | 2 | ||||
-rw-r--r-- | libFDK/include/mips/cplx_mul.h | 28 | ||||
-rw-r--r-- | libFDK/include/mips/fixmul_mips.h | 8 | ||||
-rw-r--r-- | libFDK/include/scale.h | 10 | ||||
-rw-r--r-- | libFDK/src/FDK_core.cpp | 2 | ||||
-rw-r--r-- | libFDK/src/qmf.cpp | 6 |
6 files changed, 45 insertions, 11 deletions
diff --git a/libFDK/include/common_fix.h b/libFDK/include/common_fix.h index 83d4ba3..a39548e 100644 --- a/libFDK/include/common_fix.h +++ b/libFDK/include/common_fix.h @@ -225,7 +225,6 @@ FDK_INLINE FIXP_DBL fAbs(FIXP_DBL x) FDK_INLINE FIXP_SGL fAbs(FIXP_SGL x) { return fixabs_S(x); } - /* workaround for TI C6x compiler but not for TI ARM9E compiler */ #if (!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__) FDK_INLINE INT fAbs(INT x) @@ -336,7 +335,6 @@ FDK_INLINE FIXP_SGL fMin(FIXP_SGL a, FIXP_SGL b) FDK_INLINE FIXP_SGL fMax(FIXP_SGL a, FIXP_SGL b) { return fixmax_S(a,b); } - /* workaround for TI C6x compiler but not for TI ARM9E */ #if ((!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__x86_64__)) || (FIX_FRACT == 1) FDK_INLINE INT fMax(INT a, INT b) diff --git a/libFDK/include/mips/cplx_mul.h b/libFDK/include/mips/cplx_mul.h index 4e8f26f..e0781dd 100644 --- a/libFDK/include/mips/cplx_mul.h +++ b/libFDK/include/mips/cplx_mul.h @@ -108,9 +108,20 @@ inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) + : "lo"); + *c_Re = result; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result; } #endif @@ -124,9 +135,18 @@ inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL b_Im) { INT result; - result = (((long long)a_Re * b_Re) - ((long long) a_Im * b_Im)) >> 32; + __asm__ ("mult %[a_Re], %[b_Re];\n" + "msub %[a_Im], %[b_Im];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) + : "lo"); *c_Re = result<<1; - result = (((long long)a_Re * b_Im) - ((long long) a_Im * b_Re)) >> 32; + + __asm__ ("mult %[a_Re], %[b_Im];\n" + "madd %[a_Im], %[b_Re];\n" + : "=hi"(result) + : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) + : "lo"); *c_Im = result<<1; } #endif diff --git a/libFDK/include/mips/fixmul_mips.h b/libFDK/include/mips/fixmul_mips.h index 0e7af0d..4fb72f7 100644 --- a/libFDK/include/mips/fixmul_mips.h +++ b/libFDK/include/mips/fixmul_mips.h @@ -100,8 +100,14 @@ amm-info@iis.fraunhofer.de inline INT fixmuldiv2_DD (const INT a, const INT b) { + INT result ; - return ((long long) a * b) >> 32; + asm ("mult %1,%2;\n" + : "=hi" (result) + : "d" (a), "r" (b) + : "lo"); + + return result ; } #endif /* (__GNUC__) && defined(__mips__) */ diff --git a/libFDK/include/scale.h b/libFDK/include/scale.h index fcb6c48..d60ed2c 100644 --- a/libFDK/include/scale.h +++ b/libFDK/include/scale.h @@ -148,12 +148,20 @@ FIXP_DBL scaleValueSaturate( { if(scalefactor > 0) { if (fNorm(value) < scalefactor && value != (FIXP_DBL)0) { - return (FIXP_DBL)MAXVAL_DBL; + if (value > (FIXP_DBL)0) { + return (FIXP_DBL)MAXVAL_DBL; + } else { + return (FIXP_DBL)MINVAL_DBL; + } } else { return (value<<scalefactor); } } else { + if (-(DFRACT_BITS-1) > scalefactor) { + return (FIXP_DBL)0; + } else { return (value>>(-scalefactor)); + } } } #endif diff --git a/libFDK/src/FDK_core.cpp b/libFDK/src/FDK_core.cpp index 37d88ee..98a051f 100644 --- a/libFDK/src/FDK_core.cpp +++ b/libFDK/src/FDK_core.cpp @@ -93,7 +93,7 @@ amm-info@iis.fraunhofer.de /* FDK tools library info */ #define FDK_TOOLS_LIB_VL0 2 #define FDK_TOOLS_LIB_VL1 2 -#define FDK_TOOLS_LIB_VL2 6 +#define FDK_TOOLS_LIB_VL2 7 #define FDK_TOOLS_LIB_TITLE "FDK Tools" #define FDK_TOOLS_LIB_BUILD_DATE __DATE__ #define FDK_TOOLS_LIB_BUILD_TIME __TIME__ diff --git a/libFDK/src/qmf.cpp b/libFDK/src/qmf.cpp index e410f55..314b9fe 100644 --- a/libFDK/src/qmf.cpp +++ b/libFDK/src/qmf.cpp @@ -1040,7 +1040,8 @@ qmfInitFilterBank (HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Handle to return */ h_Qmf->outScalefactor = ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + h_Qmf->filterScale; - if (h_Qmf->p_stride == 2) { + if ( (h_Qmf->p_stride == 2) + || ((flags & QMF_FLAG_CLDFB) && (no_channels == 32)) ) { h_Qmf->outScalefactor -= 1; } h_Qmf->outGain = (FIXP_DBL)0x80000000; /* default init value will be not applied */ @@ -1147,7 +1148,8 @@ qmfChangeOutScalefactor (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf S /* Add internal filterbank scale */ outScalefactor += ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + synQmf->filterScale; - if (synQmf->p_stride == 2) { + if ( (synQmf->p_stride == 2) + || ((synQmf->flags & QMF_FLAG_CLDFB) && (synQmf->no_channels == 32)) ) { outScalefactor -= 1; } |