summaryrefslogtreecommitdiffstats
path: root/libFDK
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2012-09-09 11:48:51 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2012-09-09 11:52:09 -0700
commit381d69840ad3af2259f0b7ef49236f9ee9c76b76 (patch)
tree059754bb7c5ff151506ac52a2962d532a180b5bc /libFDK
parentfef220869b4e5bf9241369d3379b389136c2f174 (diff)
downloadfdk-aac-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.gz
fdk-aac-381d69840ad3af2259f0b7ef49236f9ee9c76b76.tar.bz2
fdk-aac-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.h2
-rw-r--r--libFDK/include/mips/cplx_mul.h28
-rw-r--r--libFDK/include/mips/fixmul_mips.h8
-rw-r--r--libFDK/include/scale.h10
-rw-r--r--libFDK/src/FDK_core.cpp2
-rw-r--r--libFDK/src/qmf.cpp6
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;
}