diff options
author | Michael Roitzsch <mroi@users.sourceforge.net> | 2004-01-11 15:44:04 +0000 |
---|---|---|
committer | Michael Roitzsch <mroi@users.sourceforge.net> | 2004-01-11 15:44:04 +0000 |
commit | ba65efaad16ddd1347de7af98f9494cee7a39419 (patch) | |
tree | 630d2e9b4581f45cbe85815ec881705be9cc045b | |
parent | 14019fd4a433078fb4466e910cd432489dd60bbc (diff) | |
download | xine-lib-ba65efaad16ddd1347de7af98f9494cee7a39419.tar.gz xine-lib-ba65efaad16ddd1347de7af98f9494cee7a39419.tar.bz2 |
the faad project accepted a huge compiler warning patch I sent them,
merging their CVS back to our copy
everyone please check, if your AAC samples still work
CVS patchset: 6024
CVS date: 2004/01/11 15:44:04
76 files changed, 926 insertions, 736 deletions
diff --git a/src/libfaad/analysis.h b/src/libfaad/analysis.h index 2cfd05d50..5afbce414 100644 --- a/src/libfaad/analysis.h +++ b/src/libfaad/analysis.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: analysis.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: analysis.h,v 1.4 2004/01/11 15:44:04 mroi Exp $ **/ #ifndef __ANALYSIS_H__ diff --git a/src/libfaad/bits.c b/src/libfaad/bits.c index ea0b8a78c..2ec31a930 100644 --- a/src/libfaad/bits.c +++ b/src/libfaad/bits.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: bits.c,v 1.5 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: bits.c,v 1.6 2004/01/11 15:44:04 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/bits.h b/src/libfaad/bits.h index 2760ad022..18f1c2a3f 100644 --- a/src/libfaad/bits.h +++ b/src/libfaad/bits.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: bits.h,v 1.5 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: bits.h,v 1.6 2004/01/11 15:44:04 mroi Exp $ **/ #ifndef __BITS_H__ diff --git a/src/libfaad/cfft.c b/src/libfaad/cfft.c index bbdfc36df..fa858303c 100644 --- a/src/libfaad/cfft.c +++ b/src/libfaad/cfft.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: cfft.c,v 1.7 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: cfft.c,v 1.8 2004/01/11 15:44:04 mroi Exp $ **/ /* @@ -43,84 +43,115 @@ #include "cfft_tab.h" +/* static function declarations */ +#ifdef USE_SSE +static void passf2pos_sse(const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf2pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf4pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); +#endif +static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); +static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); +static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); +static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, + const complex_t *wa4, const int8_t isign); +INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, const int8_t isign); +static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); + + /*---------------------------------------------------------------------- passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. ----------------------------------------------------------------------*/ -#ifdef USE_SSE -static void passf2pos_sse(const uint16_t ido, const uint16_t l1, const complex_t *cc, +#if 0 //def USE_SSE +static void passf2pos_sse(const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa) { - uint16_t i, k, ah, ac; + uint16_t k, ah, ac; - if (ido == 1) + for (k = 0; k < l1; k++) { - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; + ah = 2*k; + ac = 4*k; - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); + RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); + IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } - } else { - for (k = 0; k < l1; k++) + RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); + IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); + } +} + +static void passf2pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa) +{ + uint16_t i, k, ah, ac; + + for (k = 0; k < l1; k++) + { + ah = k*ido; + ac = 2*k*ido; + + for (i = 0; i < ido; i+=4) { - ah = k*ido; - ac = 2*k*ido; + __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14; + __m128 m15, m16, m17, m18, m19, m20, m21, m22, m23, m24; + __m128 w1, w2, w3, w4; - for (i = 0; i < ido; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14; - __m128 m15, m16, m17, m18, m19, m20, m21, m22, m23, m24; - __m128 w1, w2, w3, w4; + m1 = _mm_load_ps(&RE(cc[ac+i])); + m2 = _mm_load_ps(&RE(cc[ac+ido+i])); + m5 = _mm_load_ps(&RE(cc[ac+i+2])); + m6 = _mm_load_ps(&RE(cc[ac+ido+i+2])); + w1 = _mm_load_ps(&RE(wa[i])); + w3 = _mm_load_ps(&RE(wa[i+2])); - m1 = _mm_load_ps(&RE(cc[ac+i])); - m2 = _mm_load_ps(&RE(cc[ac+ido+i])); - m5 = _mm_load_ps(&RE(cc[ac+i+2])); - m6 = _mm_load_ps(&RE(cc[ac+ido+i+2])); - w1 = _mm_load_ps(&RE(wa[i])); - w3 = _mm_load_ps(&RE(wa[i+2])); + m3 = _mm_add_ps(m1, m2); + m15 = _mm_add_ps(m5, m6); - m3 = _mm_add_ps(m1, m2); - m15 = _mm_add_ps(m5, m6); + m4 = _mm_sub_ps(m1, m2); + m16 = _mm_sub_ps(m5, m6); - m4 = _mm_sub_ps(m1, m2); - m16 = _mm_sub_ps(m5, m6); + _mm_store_ps(&RE(ch[ah+i]), m3); + _mm_store_ps(&RE(ch[ah+i+2]), m15); - _mm_store_ps(&RE(ch[ah+i]), m3); - _mm_store_ps(&RE(ch[ah+i+2]), m15); - w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); - w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); + w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); + w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); - m7 = _mm_mul_ps(m4, w1); - m17 = _mm_mul_ps(m16, w3); - m8 = _mm_mul_ps(m4, w2); - m18 = _mm_mul_ps(m16, w4); + m7 = _mm_mul_ps(m4, w1); + m17 = _mm_mul_ps(m16, w3); + m8 = _mm_mul_ps(m4, w2); + m18 = _mm_mul_ps(m16, w4); - m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); - m19 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(2, 0, 2, 0)); - m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); - m20 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(3, 1, 3, 1)); + m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); + m19 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(2, 0, 2, 0)); + m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); + m20 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(3, 1, 3, 1)); - m11 = _mm_add_ps(m9, m10); - m21 = _mm_add_ps(m19, m20); - m12 = _mm_sub_ps(m9, m10); - m22 = _mm_sub_ps(m19, m20); + m11 = _mm_add_ps(m9, m10); + m21 = _mm_add_ps(m19, m20); + m12 = _mm_sub_ps(m9, m10); + m22 = _mm_sub_ps(m19, m20); - m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); - m23 = _mm_shuffle_ps(m21, m21, _MM_SHUFFLE(0, 0, 3, 2)); + m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); + m23 = _mm_shuffle_ps(m21, m21, _MM_SHUFFLE(0, 0, 3, 2)); - m14 = _mm_unpacklo_ps(m12, m13); - m24 = _mm_unpacklo_ps(m22, m23); + m14 = _mm_unpacklo_ps(m12, m13); + m24 = _mm_unpacklo_ps(m22, m23); - _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); - _mm_store_ps(&RE(ch[ah+i+2+l1*ido]), m24); - } + _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); + _mm_store_ps(&RE(ch[ah+i+2+l1*ido]), m24); } } } @@ -159,8 +190,13 @@ static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); +#if 1 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); +#else + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); +#endif } } } @@ -199,8 +235,13 @@ static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); +#if 1 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); +#else + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); +#endif } } } @@ -290,10 +331,17 @@ static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, RE(d3) = RE(c2) + IM(c3); IM(d2) = IM(c2) + RE(c3); +#if 1 ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); +#else + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); +#endif } } } else { @@ -320,10 +368,17 @@ static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, RE(d3) = RE(c2) - IM(c3); IM(d2) = IM(c2) - RE(c3); +#if 1 ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); +#else + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); +#endif } } } @@ -331,158 +386,213 @@ static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, } #ifdef USE_SSE -static void passf4pos_sse(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) +ALIGN static const int32_t negate[4] = { 0x0, 0x0, 0x0, 0x80000000 }; + +__declspec(naked) static void passf4pos_sse(const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, + const complex_t *wa3) +{ + __asm { + push ebx + mov ebx, esp + and esp, -16 + push edi + push esi + sub esp, 8 + movzx edi, WORD PTR [ebx+8] + + movaps xmm1, XMMWORD PTR negate + + test edi, edi + jle l1_is_zero + + lea esi, DWORD PTR [edi+edi] + add esi, esi + sub esi, edi + add esi, esi + add esi, esi + add esi, esi + mov eax, DWORD PTR [ebx+16] + add esi, eax + lea ecx, DWORD PTR [edi+edi] + add ecx, ecx + add ecx, ecx + add ecx, ecx + add ecx, eax + lea edx, DWORD PTR [edi+edi] + add edx, edx + add edx, edx + add edx, eax + xor eax, eax + mov DWORD PTR [esp], ebp + mov ebp, DWORD PTR [ebx+12] + +fftloop: + lea edi, DWORD PTR [eax+eax] + add edi, edi + movaps xmm2, XMMWORD PTR [ebp+edi*8] + movaps xmm0, XMMWORD PTR [ebp+edi*8+16] + movaps xmm7, XMMWORD PTR [ebp+edi*8+32] + movaps xmm5, XMMWORD PTR [ebp+edi*8+48] + movaps xmm6, xmm2 + addps xmm6, xmm0 + movaps xmm4, xmm1 + xorps xmm4, xmm7 + movaps xmm3, xmm1 + xorps xmm3, xmm5 + xorps xmm2, xmm1 + xorps xmm0, xmm1 + addps xmm7, xmm5 + subps xmm2, xmm0 + movaps xmm0, xmm6 + shufps xmm0, xmm7, 68 + subps xmm4, xmm3 + shufps xmm6, xmm7, 238 + movaps xmm5, xmm2 + shufps xmm5, xmm4, 68 + movaps xmm3, xmm0 + addps xmm3, xmm6 + shufps xmm2, xmm4, 187 + subps xmm0, xmm6 + movaps xmm4, xmm5 + addps xmm4, xmm2 + mov edi, DWORD PTR [ebx+16] + movaps XMMWORD PTR [edi+eax*8], xmm3 + subps xmm5, xmm2 + movaps XMMWORD PTR [edx+eax*8], xmm4 + movaps XMMWORD PTR [ecx+eax*8], xmm0 + movaps XMMWORD PTR [esi+eax*8], xmm5 + add eax, 2 + movzx eax, ax + movzx edi, WORD PTR [ebx+8] + cmp eax, edi + jl fftloop + + mov ebp, DWORD PTR [esp] + +l1_is_zero: + + add esp, 8 + pop esi + pop edi + mov esp, ebx + pop ebx + ret + } +} +#endif + +#if 0 +static void passf4pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, + const complex_t *wa3) { uint16_t i, k, ac, ah; - if (ido == 1) + for (k = 0; k < l1; k++) { - for (k = 0; k < l1; k+=2) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10; - __m128 n1, n2, n3, n4, n5, n6, n7, n8, n9, n10; - __m128 neg1 = _mm_set_ps(-1.0, 1.0, 1.0, 1.0); + ac = 4*k*ido; + ah = k*ido; - m1 = _mm_load_ps(&RE(cc[4*k])); - m2 = _mm_load_ps(&RE(cc[4*k+2])); - n1 = _mm_load_ps(&RE(cc[4*k+4])); - n2 = _mm_load_ps(&RE(cc[4*k+6])); + for (i = 0; i < ido; i+=2) + { + __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16; + __m128 n1, n2, n3, n4, n5, n6, n7, n8, n9, m17, m18, m19, m20, m21, m22, m23; + __m128 w1, w2, w3, w4, w5, w6, m24, m25, m26, m27, m28, m29, m30; + __m128 neg1 = _mm_set_ps(-1.0, 1.0, -1.0, 1.0); + m1 = _mm_load_ps(&RE(cc[ac+i])); + m2 = _mm_load_ps(&RE(cc[ac+i+2*ido])); m3 = _mm_add_ps(m1, m2); + m4 = _mm_sub_ps(m1, m2); - n4 = _mm_mul_ps(neg1, n1); - n5 = _mm_mul_ps(neg1, n2); - m4 = _mm_mul_ps(neg1, m1); - m5 = _mm_mul_ps(neg1, m2); - + n1 = _mm_load_ps(&RE(cc[ac+i+ido])); + n2 = _mm_load_ps(&RE(cc[ac+i+3*ido])); n3 = _mm_add_ps(n1, n2); - m6 = _mm_sub_ps(m4, m5); - m7 = _mm_shuffle_ps(m3, n3, _MM_SHUFFLE(1, 0, 1, 0)); + n4 = _mm_mul_ps(neg1, n1); + n5 = _mm_mul_ps(neg1, n2); n6 = _mm_sub_ps(n4, n5); - m8 = _mm_shuffle_ps(m3, n3, _MM_SHUFFLE(3, 2, 3, 2)); - n7 = _mm_shuffle_ps(m6, n6, _MM_SHUFFLE(1, 0, 1, 0)); - m9 = _mm_add_ps(m7, m8); - n8 = _mm_shuffle_ps(m6, n6, _MM_SHUFFLE(2, 3, 2, 3)); + m5 = _mm_add_ps(m3, n3); - m10 = _mm_sub_ps(m7, m8); - n9 = _mm_add_ps(n7, n8); + n7 = _mm_shuffle_ps(n6, n6, _MM_SHUFFLE(2, 3, 0, 1)); + n8 = _mm_add_ps(m4, n7); - _mm_store_ps(&RE(ch[k]), m9); - n10 = _mm_sub_ps(n7, n8); - _mm_store_ps(&RE(ch[k+l1]), n9); - _mm_store_ps(&RE(ch[k+2*l1]), m10); - _mm_store_ps(&RE(ch[k+3*l1]), n10); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; + m6 = _mm_sub_ps(m3, n3); + n9 = _mm_sub_ps(m4, n7); - for (i = 0; i < ido; i+=2) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16; - __m128 n1, n2, n3, n4, n5, n6, n7, n8, n9, m17, m18, m19, m20, m21, m22, m23; - __m128 w1, w2, w3, w4, w5, w6, m24, m25, m26, m27, m28, m29, m30; - __m128 neg1 = _mm_set_ps(-1.0, 1.0, -1.0, 1.0); - - m1 = _mm_load_ps(&RE(cc[ac+i])); - m2 = _mm_load_ps(&RE(cc[ac+i+2*ido])); - m3 = _mm_add_ps(m1, m2); - m4 = _mm_sub_ps(m1, m2); - - n1 = _mm_load_ps(&RE(cc[ac+i+ido])); - n2 = _mm_load_ps(&RE(cc[ac+i+3*ido])); - n3 = _mm_add_ps(n1, n2); - - n4 = _mm_mul_ps(neg1, n1); - n5 = _mm_mul_ps(neg1, n2); - n6 = _mm_sub_ps(n4, n5); - - m5 = _mm_add_ps(m3, n3); - - n7 = _mm_shuffle_ps(n6, n6, _MM_SHUFFLE(2, 3, 0, 1)); - n8 = _mm_add_ps(m4, n7); - - m6 = _mm_sub_ps(m3, n3); - n9 = _mm_sub_ps(m4, n7); - - _mm_store_ps(&RE(ch[ah+i]), m5); + _mm_store_ps(&RE(ch[ah+i]), m5); #if 0 - static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) - { - *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); - *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); - } - - m7.0 = RE(c2)*RE(wa1[i]) - m7.1 = IM(c2)*IM(wa1[i]) - m7.2 = RE(c6)*RE(wa1[i+1]) - m7.3 = IM(c6)*IM(wa1[i+1]) - - m8.0 = RE(c2)*IM(wa1[i]) - m8.1 = IM(c2)*RE(wa1[i]) - m8.2 = RE(c6)*IM(wa1[i+1]) - m8.3 = IM(c6)*RE(wa1[i+1]) - - RE(0) = m7.0 - m7.1 - IM(0) = m8.0 + m8.1 - RE(1) = m7.2 - m7.3 - IM(1) = m8.2 + m8.3 - -//// - RE(0) = RE(c2)*RE(wa1[i]) - IM(c2)*IM(wa1[i]) - IM(0) = RE(c2)*IM(wa1[i]) + IM(c2)*RE(wa1[i]) - RE(1) = RE(c6)*RE(wa1[i+1]) - IM(c6)*IM(wa1[i+1]) - IM(1) = RE(c6)*IM(wa1[i+1]) + IM(c6)*RE(wa1[i+1]) + static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) + { + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); + } + + m7.0 = RE(c2)*RE(wa1[i]) + m7.1 = IM(c2)*IM(wa1[i]) + m7.2 = RE(c6)*RE(wa1[i+1]) + m7.3 = IM(c6)*IM(wa1[i+1]) + + m8.0 = RE(c2)*IM(wa1[i]) + m8.1 = IM(c2)*RE(wa1[i]) + m8.2 = RE(c6)*IM(wa1[i+1]) + m8.3 = IM(c6)*RE(wa1[i+1]) + + RE(0) = m7.0 - m7.1 + IM(0) = m8.0 + m8.1 + RE(1) = m7.2 - m7.3 + IM(1) = m8.2 + m8.3 + + //// + RE(0) = RE(c2)*RE(wa1[i]) - IM(c2)*IM(wa1[i]) + IM(0) = RE(c2)*IM(wa1[i]) + IM(c2)*RE(wa1[i]) + RE(1) = RE(c6)*RE(wa1[i+1]) - IM(c6)*IM(wa1[i+1]) + IM(1) = RE(c6)*IM(wa1[i+1]) + IM(c6)*RE(wa1[i+1]) #endif - w1 = _mm_load_ps(&RE(wa1[i])); - w3 = _mm_load_ps(&RE(wa2[i])); - w5 = _mm_load_ps(&RE(wa3[i])); - - w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); - w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); - w6 = _mm_shuffle_ps(w5, w5, _MM_SHUFFLE(2, 3, 0, 1)); - - m7 = _mm_mul_ps(n8, w1); - m15 = _mm_mul_ps(m6, w3); - m23 = _mm_mul_ps(n9, w5); - m8 = _mm_mul_ps(n8, w2); - m16 = _mm_mul_ps(m6, w4); - m24 = _mm_mul_ps(n9, w6); - - m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); - m17 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(2, 0, 2, 0)); - m25 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(2, 0, 2, 0)); - m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); - m18 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(3, 1, 3, 1)); - m26 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(3, 1, 3, 1)); - - m11 = _mm_add_ps(m9, m10); - m19 = _mm_add_ps(m17, m18); - m27 = _mm_add_ps(m25, m26); - m12 = _mm_sub_ps(m9, m10); - m20 = _mm_sub_ps(m17, m18); - m28 = _mm_sub_ps(m25, m26); - - m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); - m21 = _mm_shuffle_ps(m19, m19, _MM_SHUFFLE(0, 0, 3, 2)); - m29 = _mm_shuffle_ps(m27, m27, _MM_SHUFFLE(0, 0, 3, 2)); - m14 = _mm_unpacklo_ps(m12, m13); - m22 = _mm_unpacklo_ps(m20, m21); - m30 = _mm_unpacklo_ps(m28, m29); - - _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); - _mm_store_ps(&RE(ch[ah+i+2*l1*ido]), m22); - _mm_store_ps(&RE(ch[ah+i+3*l1*ido]), m30); - } + w1 = _mm_load_ps(&RE(wa1[i])); + w3 = _mm_load_ps(&RE(wa2[i])); + w5 = _mm_load_ps(&RE(wa3[i])); + + w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); + w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); + w6 = _mm_shuffle_ps(w5, w5, _MM_SHUFFLE(2, 3, 0, 1)); + + m7 = _mm_mul_ps(n8, w1); + m15 = _mm_mul_ps(m6, w3); + m23 = _mm_mul_ps(n9, w5); + m8 = _mm_mul_ps(n8, w2); + m16 = _mm_mul_ps(m6, w4); + m24 = _mm_mul_ps(n9, w6); + + m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); + m17 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(2, 0, 2, 0)); + m25 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(2, 0, 2, 0)); + m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); + m18 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(3, 1, 3, 1)); + m26 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(3, 1, 3, 1)); + + m11 = _mm_add_ps(m9, m10); + m19 = _mm_add_ps(m17, m18); + m27 = _mm_add_ps(m25, m26); + m12 = _mm_sub_ps(m9, m10); + m20 = _mm_sub_ps(m17, m18); + m28 = _mm_sub_ps(m25, m26); + + m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); + m21 = _mm_shuffle_ps(m19, m19, _MM_SHUFFLE(0, 0, 3, 2)); + m29 = _mm_shuffle_ps(m27, m27, _MM_SHUFFLE(0, 0, 3, 2)); + m14 = _mm_unpacklo_ps(m12, m13); + m22 = _mm_unpacklo_ps(m20, m21); + m30 = _mm_unpacklo_ps(m28, m29); + + _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); + _mm_store_ps(&RE(ch[ah+i+2*l1*ido]), m22); + _mm_store_ps(&RE(ch[ah+i+3*l1*ido]), m30); } } } @@ -555,12 +665,21 @@ static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc IM(ch[ah+i]) = IM(t2) + IM(t3); IM(c3) = IM(t2) - IM(t3); +#if 1 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); +#else + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), + RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), + RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); +#endif } } } @@ -633,12 +752,21 @@ static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc IM(ch[ah+i]) = IM(t2) + IM(t3); IM(c3) = IM(t2) - IM(t3); +#if 1 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); +#else + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), + IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), + IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); +#endif } } } @@ -774,6 +902,7 @@ static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, RE(d3) = RE(c3) - IM(c4); IM(d4) = IM(c3) - RE(c4); +#if 1 ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), @@ -782,6 +911,16 @@ static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); +#else + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), + RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), + RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); +#endif } } } else { @@ -823,6 +962,7 @@ static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, RE(d3) = RE(c3) + IM(c4); IM(d4) = IM(c3) + RE(c4); +#if 1 ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), @@ -831,6 +971,16 @@ static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); +#else + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), + IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), + IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); +#endif } } } @@ -843,8 +993,12 @@ static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, ----------------------------------------------------------------------*/ #ifdef USE_SSE -INLINE void cfftf1pos_sse(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign) + +#define CONV(A,B,C) ( (A<<2) | ((B & 0x1)<<1) | ((C==1)&0x1) ) + +static INLINE void cfftf1pos_sse(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, + const int8_t isign) { uint16_t i; uint16_t k1, l1, l2; @@ -862,51 +1016,62 @@ INLINE void cfftf1pos_sse(uint16_t n, complex_t *c, complex_t *ch, ido = n / l2; idl1 = ido*l1; - switch (ip) - { - case 4: - ix2 = iw + ido; - ix3 = ix2 + ido; - - if (na == 0) - passf4pos_sse((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - else - passf4pos_sse((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); + ix2 = iw + ido; + ix3 = ix2 + ido; + ix4 = ix3 + ido; - na = 1 - na; + switch (CONV(ip,na,ido)) + { + case CONV(4,0,0): + //passf4pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); + passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); break; - case 2: - if (na == 0) - passf2pos_sse((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - else - passf2pos_sse((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - - na = 1 - na; + case CONV(4,0,1): + passf4pos_sse((const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); break; - case 3: - ix2 = iw + ido; - - if (na == 0) - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - else - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - - na = 1 - na; + case CONV(4,1,0): + passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); + //passf4pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); break; - case 5: - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - if (na == 0) - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - else - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - - na = 1 - na; + case CONV(4,1,1): + passf4pos_sse((const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); + break; + case CONV(2,0,0): + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + //passf2pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + break; + case CONV(2,0,1): + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + //passf2pos_sse((const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + break; + case CONV(2,1,0): + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + //passf2pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + break; + case CONV(2,1,1): + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + //passf2pos_sse((const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + break; + case CONV(3,0,0): + case CONV(3,0,1): + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); + break; + case CONV(3,1,0): + case CONV(3,1,1): + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); + break; + case CONV(5,0,0): + case CONV(5,0,1): + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); + break; + case CONV(5,1,0): + case CONV(5,1,1): + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); break; } + na = 1 - na; + l1 = l2; iw += (ip-1) * ido; } @@ -922,8 +1087,9 @@ INLINE void cfftf1pos_sse(uint16_t n, complex_t *c, complex_t *ch, } #endif -INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign) +static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, + const int8_t isign) { uint16_t i; uint16_t k1, l1, l2; @@ -1000,8 +1166,9 @@ INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, } } -INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign) +static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, + const int8_t isign) { uint16_t i; uint16_t k1, l1, l2; @@ -1104,7 +1271,7 @@ static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac) uint16_t i1, k1, l1, l2; uint16_t ld, ii, ip; #endif - uint16_t ntry, i, j; + uint16_t ntry = 0, i, j; uint16_t ib; uint16_t nf, nl, nq, nr; @@ -1174,7 +1341,11 @@ startloop: fi++; arg = fi * argld; RE(wa[i]) = (real_t)cos(arg); +#if 1 IM(wa[i]) = (real_t)sin(arg); +#else + IM(wa[i]) = (real_t)-sin(arg); +#endif } if (ip > 5) diff --git a/src/libfaad/cfft.h b/src/libfaad/cfft.h index 74c42a91a..7c5b0fb8e 100644 --- a/src/libfaad/cfft.h +++ b/src/libfaad/cfft.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: cfft.h,v 1.5 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: cfft.h,v 1.6 2004/01/11 15:44:04 mroi Exp $ **/ #ifndef __CFFT_H__ @@ -46,30 +46,9 @@ void cfftb(cfft_info *cfft, complex_t *c); cfft_info *cffti(uint16_t n); void cfftu(cfft_info *cfft); - #ifdef USE_SSE void cfftb_sse(cfft_info *cfft, complex_t *c); -static void passf2pos_sse(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf4pos_sse(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); #endif -static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); -static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, - const complex_t *wa4, const int8_t isign); -INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign); -static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); #ifdef __cplusplus diff --git a/src/libfaad/cfft_tab.h b/src/libfaad/cfft_tab.h index dabc0dcc3..5492040e1 100644 --- a/src/libfaad/cfft_tab.h +++ b/src/libfaad/cfft_tab.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: cfft_tab.h,v 1.2 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: cfft_tab.h,v 1.3 2004/01/11 15:44:04 mroi Exp $ **/ #ifndef __CFFT_TAB_H__ diff --git a/src/libfaad/common.c b/src/libfaad/common.c index 3df232482..a5135a05f 100644 --- a/src/libfaad/common.c +++ b/src/libfaad/common.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: common.c,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: common.c,v 1.5 2004/01/11 15:44:04 mroi Exp $ **/ /* just some common functions that could be used anywhere */ @@ -34,7 +34,7 @@ #include "syntax.h" #ifdef USE_SSE -__declspec(naked) static int32_t __fastcall test_cpuid() +__declspec(naked) static int32_t __fastcall test_cpuid(void) { __asm { @@ -233,7 +233,7 @@ int8_t can_decode_ot(const uint8_t object_type) /* common malloc function */ void *faad_malloc(int32_t size) { -#ifdef _WIN32 +#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) return _aligned_malloc(size, 16); #else return malloc(size); @@ -243,7 +243,7 @@ void *faad_malloc(int32_t size) /* common free function */ void faad_free(void *b) { -#ifdef _WIN32 +#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) _aligned_free(b); #else free(b); @@ -293,7 +293,6 @@ static uint32_t __r2 = 1; */ uint32_t random_int(void) { - static const uint32_t rnd_seed = 16428320; uint32_t t1, t2, t3, t4; t3 = t1 = __r1; t4 = t2 = __r2; // Parity calculation is done via table lookup, this is also available diff --git a/src/libfaad/common.h b/src/libfaad/common.h index aa40ebe0a..577f54368 100644 --- a/src/libfaad/common.h +++ b/src/libfaad/common.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: common.h,v 1.9 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: common.h,v 1.10 2004/01/11 15:44:04 mroi Exp $ **/ #ifndef __COMMON_H__ @@ -33,7 +33,7 @@ extern "C" { #endif #define INLINE __inline -#ifdef _WIN32 +#if defined(_WIN32) && !defined(_WIN32_WCE) #define ALIGN __declspec(align(16)) #else #define ALIGN @@ -120,7 +120,7 @@ extern "C" { #if ((defined(_WIN32) && !defined(_WIN32_WCE)) /* || ((__GNUC__ >= 3) && defined(__i386__)) */ ) #ifndef FIXED_POINT /* includes <xmmintrin.h> to enable SSE intrinsics */ -#define USE_SSE +//#define USE_SSE #endif #endif @@ -289,6 +289,7 @@ char *strchr(), *strrchr(); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } + #ifndef HAVE_LRINTF #ifdef _WIN32 #define HAS_LRINTF @@ -318,6 +319,7 @@ char *strchr(), *strrchr(); #endif #endif + #ifdef __ICL /* only Intel C compiler has fmath ??? */ #include <mathf.h> @@ -379,7 +381,7 @@ typedef real_t complex_t[2]; /* common functions */ -uint8_t cpu_has_sse(); +uint8_t cpu_has_sse(void); uint32_t random_int(void); uint8_t get_sr_index(const uint32_t samplerate); uint8_t max_pred_sfb(const uint8_t sr_index); diff --git a/src/libfaad/decoder.c b/src/libfaad/decoder.c index 8c824ff3d..09358adf4 100644 --- a/src/libfaad/decoder.c +++ b/src/libfaad/decoder.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: decoder.c,v 1.6 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: decoder.c,v 1.7 2004/01/11 15:44:04 mroi Exp $ **/ #include "common.h" @@ -54,7 +54,7 @@ int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode) return err_msg[errcode]; } -uint32_t FAADAPI faacDecGetCapabilities() +uint32_t FAADAPI faacDecGetCapabilities(void) { uint32_t cap = 0; @@ -80,7 +80,7 @@ uint32_t FAADAPI faacDecGetCapabilities() return cap; } -faacDecHandle FAADAPI faacDecOpen() +faacDecHandle FAADAPI faacDecOpen(void) { uint8_t i; faacDecHandle hDecoder = NULL; @@ -256,7 +256,7 @@ int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, #ifdef SBR_DEC /* implicit signalling */ - if (*samplerate <= 24000) + if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { *samplerate *= 2; hDecoder->forceUpSampling = 1; @@ -324,7 +324,10 @@ int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, #endif #ifdef SBR_DEC hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; - hDecoder->forceUpSampling = mp4ASC.forceUpSampling; + if (hDecoder->config.dontUpSampleImplicitSBR == 0) + hDecoder->forceUpSampling = mp4ASC.forceUpSampling; + else + hDecoder->forceUpSampling = 0; /* AAC core decoder samplerate is 2 times as low */ if (hDecoder->sbr_present_flag == 1 || hDecoder->forceUpSampling == 1) diff --git a/src/libfaad/decoder.h b/src/libfaad/decoder.h index 9973d69cb..0196777ac 100644 --- a/src/libfaad/decoder.h +++ b/src/libfaad/decoder.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: decoder.h,v 1.5 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: decoder.h,v 1.6 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __DECODER_H__ @@ -78,9 +78,9 @@ extern "C" { int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode); -uint32_t FAADAPI faacDecGetCapabilities(); +uint32_t FAADAPI faacDecGetCapabilities(void); -faacDecHandle FAADAPI faacDecOpen(); +faacDecHandle FAADAPI faacDecOpen(void); faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder); diff --git a/src/libfaad/diff_to_faad2_cvs.patch b/src/libfaad/diff_to_faad2_cvs.patch new file mode 100644 index 000000000..86dc8aa69 --- /dev/null +++ b/src/libfaad/diff_to_faad2_cvs.patch @@ -0,0 +1,18 @@ +--- common.h.old 2004-01-10 22:45:44.000000000 +0100 ++++ common.h 2004-01-10 22:46:20.000000000 +0100 +@@ -290,6 +290,7 @@ + } + + ++#ifndef HAVE_LRINTF + #ifdef _WIN32 + #define HAS_LRINTF + static INLINE int lrintf(float f) +@@ -316,6 +317,7 @@ + return i; + } + #endif ++#endif + + + #ifdef __ICL /* only Intel C compiler has fmath ??? */ diff --git a/src/libfaad/drc.c b/src/libfaad/drc.c index 9482d984f..b8089ca18 100644 --- a/src/libfaad/drc.c +++ b/src/libfaad/drc.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: drc.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: drc.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/drc.h b/src/libfaad/drc.h index 137566c54..b9f666f78 100644 --- a/src/libfaad/drc.h +++ b/src/libfaad/drc.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: drc.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: drc.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __DRC_H__ diff --git a/src/libfaad/error.c b/src/libfaad/error.c index 84943f100..43af74fe7 100644 --- a/src/libfaad/error.c +++ b/src/libfaad/error.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,13 +22,13 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: error.c,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: error.c,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" #include "error.h" -extern int8_t *err_msg[] = { +int8_t *err_msg[] = { "No error", "Gain control not yet implemented", "Pulse coding not allowed in short blocks", @@ -48,4 +48,5 @@ extern int8_t *err_msg[] = { "Maximum number of scalefactor bands exceeded", "Quantised value out of range", "LTP lag out of range" -};
\ No newline at end of file +}; + diff --git a/src/libfaad/error.h b/src/libfaad/error.h index fb6780361..d25fb1026 100644 --- a/src/libfaad/error.h +++ b/src/libfaad/error.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: error.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: error.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __ERROR_H__ diff --git a/src/libfaad/filtbank.c b/src/libfaad/filtbank.c index 28187172f..1ec45ac77 100644 --- a/src/libfaad/filtbank.c +++ b/src/libfaad/filtbank.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: filtbank.c,v 1.6 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: filtbank.c,v 1.7 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -120,7 +120,7 @@ void filter_bank_end(fb_info *fb) static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { #ifdef LD_DEC - mdct_info *mdct; + mdct_info *mdct = NULL; switch (len) { @@ -144,7 +144,7 @@ static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, ui static INLINE void imdct_long_sse(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { #ifdef LD_DEC - mdct_info *mdct; + mdct_info *mdct = NULL; switch (len) { @@ -168,7 +168,7 @@ static INLINE void imdct_long_sse(fb_info *fb, real_t *in_data, real_t *out_data #ifdef LTP_DEC static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { - mdct_info *mdct; + mdct_info *mdct = NULL; switch (len) { @@ -199,10 +199,10 @@ void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, int16_t i; ALIGN real_t transf_buf[2*1024] = {0}; - const real_t *window_long; - const real_t *window_long_prev; - const real_t *window_short; - const real_t *window_short_prev; + const real_t *window_long = NULL; + const real_t *window_long_prev = NULL; + const real_t *window_short = NULL; + const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; @@ -323,10 +323,10 @@ void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape int16_t i; ALIGN real_t transf_buf[2*1024] = {0}; - const real_t *window_long; - const real_t *window_long_prev; - const real_t *window_short; - const real_t *window_short_prev; + const real_t *window_long = NULL; + const real_t *window_long_prev = NULL; + const real_t *window_short = NULL; + const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; @@ -359,26 +359,22 @@ void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape imdct_long_sse(fb, freq_in, transf_buf, 2*nlong); for (i = 0; i < nlong; i+=4) { - __m128 m1 = _mm_load_ps(&transf_buf[i]); - __m128 m2 = _mm_load_ps(&window_long_prev[i]); - __m128 m3 = _mm_load_ps(&time_out[nlong+i]); + __m128 m1, m2, m3, m4, m5, m6, m7, m8; - __m128 m4 = _mm_mul_ps(m1, m2); - m4 = _mm_add_ps(m4, m3); + m1 = _mm_load_ps(&transf_buf[i]); + m2 = _mm_load_ps(&window_long_prev[i]); + m6 = _mm_load_ps(&window_long[nlong-4-i]); + m3 = _mm_load_ps(&time_out[nlong+i]); + m5 = _mm_load_ps(&transf_buf[nlong+i]); - _mm_store_ps(&time_out[i], m4); - } - for (i = 0; i < nlong; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]); - __m128 m2 = _mm_load_ps(&window_long[nlong-4-i]); - __m128 m3, m4; - - m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); + m4 = _mm_mul_ps(m1, m2); + m7 = _mm_shuffle_ps(m6, m6, _MM_SHUFFLE(0, 1, 2, 3)); - m4 = _mm_mul_ps(m1, m3); + m4 = _mm_add_ps(m4, m3); + m8 = _mm_mul_ps(m5, m7); - _mm_store_ps(&time_out[nlong+i], m4); + _mm_store_ps(&time_out[i], m4); + _mm_store_ps(&time_out[nlong+i], m8); } break; @@ -420,14 +416,14 @@ void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape break; case EIGHT_SHORT_SEQUENCE: - faad_imdct_sse(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); - faad_imdct_sse(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); - faad_imdct_sse(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); - faad_imdct_sse(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); - faad_imdct_sse(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); - faad_imdct_sse(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); - faad_imdct_sse(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); - faad_imdct_sse(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); + faad_imdct_sse(fb->mdct256, &freq_in[0*nshort], &transf_buf[2*nshort*0]); + faad_imdct_sse(fb->mdct256, &freq_in[1*nshort], &transf_buf[2*nshort*1]); + faad_imdct_sse(fb->mdct256, &freq_in[2*nshort], &transf_buf[2*nshort*2]); + faad_imdct_sse(fb->mdct256, &freq_in[3*nshort], &transf_buf[2*nshort*3]); + faad_imdct_sse(fb->mdct256, &freq_in[4*nshort], &transf_buf[2*nshort*4]); + faad_imdct_sse(fb->mdct256, &freq_in[5*nshort], &transf_buf[2*nshort*5]); + faad_imdct_sse(fb->mdct256, &freq_in[6*nshort], &transf_buf[2*nshort*6]); + faad_imdct_sse(fb->mdct256, &freq_in[7*nshort], &transf_buf[2*nshort*7]); for (i = 0; i < nflat_ls; i+=4) { __m128 m1 = _mm_load_ps(&time_out[nlong+i]); @@ -657,10 +653,10 @@ void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, int16_t i; ALIGN real_t windowed_buf[2*1024] = {0}; - const real_t *window_long; - const real_t *window_long_prev; - const real_t *window_short; - const real_t *window_short_prev; + const real_t *window_long = NULL; + const real_t *window_long_prev = NULL; + const real_t *window_short = NULL; + const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; diff --git a/src/libfaad/filtbank.h b/src/libfaad/filtbank.h index 60e25e840..9688d90ed 100644 --- a/src/libfaad/filtbank.h +++ b/src/libfaad/filtbank.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: filtbank.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: filtbank.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __FILTBANK_H__ diff --git a/src/libfaad/fixed.h b/src/libfaad/fixed.h index 65897d166..8a5ac238a 100644 --- a/src/libfaad/fixed.h +++ b/src/libfaad/fixed.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: fixed.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: fixed.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __FIXED_H__ diff --git a/src/libfaad/hcr.c b/src/libfaad/hcr.c index 4b59e205b..010958fee 100644 --- a/src/libfaad/hcr.c +++ b/src/libfaad/hcr.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2002 A. Kurpiers +** Copyright (C) 2002-2004 A. Kurpiers ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: hcr.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: hcr.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -153,7 +153,6 @@ uint8_t reordered_spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile bits_t Segment[ 512 ]; uint8_t PCW_decoded=0; - uint16_t segment_index=0, codeword_index=0; uint16_t nshort = hDecoder->frameLength/8; diff --git a/src/libfaad/huffman.c b/src/libfaad/huffman.c index 5ec920976..9986e1472 100644 --- a/src/libfaad/huffman.c +++ b/src/libfaad/huffman.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: huffman.c,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: huffman.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -38,6 +38,20 @@ #include "codebook/hcb.h" +/* static function declarations */ +static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); +static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp); +static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static int16_t huffman_codebook(uint8_t i); + + int8_t huffman_scale_factor(bitfile *ld) { uint16_t offset = 0; @@ -104,10 +118,20 @@ static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) } } +#ifdef _WIN32 +static INLINE uint32_t bsr(uint32_t bits) +{ + __asm + { + bsr eax, dword ptr [bits] + } +} +#endif + static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp) { uint8_t neg, i; - int16_t j; + int32_t j; int32_t off; if (sp < 0) @@ -116,11 +140,12 @@ static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp) return sp; neg = 1; } else { - if(sp != 16) + if (sp != 16) return sp; neg = 0; } +#ifndef _WIN32 for (i = 4; ; i++) { if (faad_get1bit(ld @@ -129,11 +154,22 @@ static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp) break; } } +#else + /* maximum quantised value is 8192, + * so the maximum number of bits for 1 value is log[2](8192)=13 + * minimum bits used when escape is present is 4 bits + * this leaves a maximum of 9 bits to be read at this point + */ + j = faad_showbits(ld, 9) | 0xFFFFFE00; + i = 12 - bsr(~j); + faad_getbits(ld, i-3 + DEBUGVAR(1,6,"huffman_getescape(): escape size")); +#endif off = faad_getbits(ld, i DEBUGVAR(1,9,"huffman_getescape(): escape")); - j = off + (1<<i); + j = off | (1<<i); if (neg) j = -j; @@ -216,7 +252,7 @@ static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp) return 0; } -static huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) +static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) { uint8_t err = huffman_2step_pair(cb, ld, sp); huffman_sign_bits(ld, sp, PAIR_LEN); @@ -357,7 +393,6 @@ int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp) uint16_t offset = 0; uint8_t extra_bits; uint8_t i; - uint8_t save_cb = cb; switch (cb) diff --git a/src/libfaad/huffman.h b/src/libfaad/huffman.h index 35b8b72f2..8a51fb8f6 100644 --- a/src/libfaad/huffman.h +++ b/src/libfaad/huffman.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: huffman.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: huffman.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __HUFFMAN_H__ @@ -32,19 +32,6 @@ extern "C" { #endif - -static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); -static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp); -static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static int16_t huffman_codebook(uint8_t i); - int8_t huffman_scale_factor(bitfile *ld); uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); #ifdef ERROR_RESILIENCE diff --git a/src/libfaad/ic_predict.c b/src/libfaad/ic_predict.c index 31ae5d668..446183a26 100644 --- a/src/libfaad/ic_predict.c +++ b/src/libfaad/ic_predict.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ic_predict.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: ic_predict.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/ic_predict.h b/src/libfaad/ic_predict.h index 9d7a9d8e2..fc99b5879 100644 --- a/src/libfaad/ic_predict.h +++ b/src/libfaad/ic_predict.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ic_predict.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: ic_predict.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifdef MAIN_DEC diff --git a/src/libfaad/iq_table.h b/src/libfaad/iq_table.h index 33b2dd75a..b3ae6bb2b 100644 --- a/src/libfaad/iq_table.h +++ b/src/libfaad/iq_table.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: iq_table.h,v 1.2 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: iq_table.h,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef IQ_TABLE_H__ diff --git a/src/libfaad/is.c b/src/libfaad/is.c index 3437d712a..f410ef107 100644 --- a/src/libfaad/is.c +++ b/src/libfaad/is.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: is.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: is.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -47,7 +47,7 @@ void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len) { uint8_t g, sfb, b; - uint16_t i, k; + uint16_t i; #ifndef FIXED_POINT real_t scale; #else @@ -84,18 +84,17 @@ void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, do not touch left channel */ for (i = icsr->swb_offset[sfb]; i < icsr->swb_offset[sfb+1]; i++) { - k = (group*nshort)+i; #ifndef FIXED_POINT - r_spec[k] = MUL_R(l_spec[k], scale); + r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); #else if (exp < 0) - r_spec[k] = l_spec[k] << -exp; + r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] << -exp; else - r_spec[k] = l_spec[k] >> exp; - r_spec[k] = MUL_C(r_spec[k], pow05_table[frac + 3]); + r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] >> exp; + r_spec[(group*nshort)+i] = MUL_C(r_spec[(group*nshort)+i], pow05_table[frac + 3]); #endif if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) - r_spec[k] = -r_spec[k]; + r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; } } } diff --git a/src/libfaad/is.h b/src/libfaad/is.h index dfa963013..3548a1090 100644 --- a/src/libfaad/is.h +++ b/src/libfaad/is.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: is.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: is.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __IS_H__ diff --git a/src/libfaad/kbd_win.h b/src/libfaad/kbd_win.h index c3a148522..957b8ba1b 100644 --- a/src/libfaad/kbd_win.h +++ b/src/libfaad/kbd_win.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: kbd_win.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: kbd_win.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __KBD_WIN_H__ diff --git a/src/libfaad/lt_predict.c b/src/libfaad/lt_predict.c index c81a62def..388d841c3 100644 --- a/src/libfaad/lt_predict.c +++ b/src/libfaad/lt_predict.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: lt_predict.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: lt_predict.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ @@ -37,6 +37,11 @@ #include "filtbank.h" #include "tns.h" + +/* static function declarations */ +static int16_t real_to_int16(real_t sig_in); + + /* check if the object type is an object type that can have LTP */ uint8_t is_ltp_ot(uint8_t object_type) { @@ -128,7 +133,7 @@ void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, } #ifdef FIXED_POINT -INLINE int16_t real_to_int16(real_t sig_in) +static INLINE int16_t real_to_int16(real_t sig_in) { if (sig_in >= 0) { @@ -144,7 +149,7 @@ INLINE int16_t real_to_int16(real_t sig_in) return (sig_in >> REAL_BITS); } #else -INLINE int16_t real_to_int16(real_t sig_in) +static INLINE int16_t real_to_int16(real_t sig_in) { if (sig_in >= 0) { diff --git a/src/libfaad/lt_predict.h b/src/libfaad/lt_predict.h index 7900605e8..963ab1a8e 100644 --- a/src/libfaad/lt_predict.h +++ b/src/libfaad/lt_predict.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: lt_predict.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: lt_predict.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifdef LTP_DEC @@ -55,9 +55,6 @@ void lt_update_state(int16_t *lt_pred_stat, uint16_t frame_len, uint8_t object_type); - -static int16_t real_to_int16(real_t sig_in); - #ifdef __cplusplus } #endif diff --git a/src/libfaad/mdct.c b/src/libfaad/mdct.c index 6c4d3edd7..afa27b990 100644 --- a/src/libfaad/mdct.c +++ b/src/libfaad/mdct.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: mdct.c,v 1.7 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: mdct.c,v 1.8 2004/01/11 15:44:05 mroi Exp $ **/ /* @@ -119,7 +119,8 @@ real_t const_tab[][5] = }; #endif -uint8_t map_N_to_idx(uint16_t N) +#ifdef FIXED_POINT +static uint8_t map_N_to_idx(uint16_t N) { /* gives an index into const_tab above */ /* for normal AAC deocding (eg. no scalable profile) only */ @@ -139,6 +140,7 @@ uint8_t map_N_to_idx(uint16_t N) } return 0; } +#endif mdct_info *faad_mdct_init(uint16_t N) { diff --git a/src/libfaad/mdct.h b/src/libfaad/mdct.h index 4aa2cdd25..435269137 100644 --- a/src/libfaad/mdct.h +++ b/src/libfaad/mdct.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: mdct.h,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: mdct.h,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __MDCT_H__ diff --git a/src/libfaad/mp4.c b/src/libfaad/mp4.c index b09495fb3..e931e965e 100644 --- a/src/libfaad/mp4.c +++ b/src/libfaad/mp4.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: mp4.c,v 1.5 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: mp4.c,v 1.6 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/mp4.h b/src/libfaad/mp4.h index 7ec94d81e..dfbfcd8c6 100644 --- a/src/libfaad/mp4.h +++ b/src/libfaad/mp4.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: mp4.h,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: mp4.h,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __MP4_H__ diff --git a/src/libfaad/ms.c b/src/libfaad/ms.c index 22d4de134..f53340167 100644 --- a/src/libfaad/ms.c +++ b/src/libfaad/ms.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ms.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: ms.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -49,7 +49,7 @@ void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, { for (b = 0; b < ics->window_group_length[g]; b++) { - for(sfb = 0; sfb < ics->max_sfb; sfb++) + for (sfb = 0; sfb < ics->max_sfb; sfb++) { /* If intensity stereo coding or noise substitution is on for a particular scalefactor band, no M/S stereo decoding diff --git a/src/libfaad/ms.h b/src/libfaad/ms.h index 5ece4efaf..e728f0436 100644 --- a/src/libfaad/ms.h +++ b/src/libfaad/ms.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ms.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: ms.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __MS_H__ diff --git a/src/libfaad/output.h b/src/libfaad/output.h index 967ba5ade..953dbe638 100644 --- a/src/libfaad/output.h +++ b/src/libfaad/output.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: output.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: output.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __OUTPUT_H__ @@ -39,9 +39,6 @@ void* output_to_PCM(faacDecHandle hDecoder, uint16_t frame_len, uint8_t format); -static int64_t dither_output(uint8_t dithering, uint8_t shapingtype, - uint16_t i, double Sum, uint8_t k); - #ifdef __cplusplus } #endif diff --git a/src/libfaad/pns.c b/src/libfaad/pns.c index 911b9cdb0..1802e439f 100644 --- a/src/libfaad/pns.c +++ b/src/libfaad/pns.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: pns.c,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: pns.c,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -31,6 +31,11 @@ #include "pns.h" +/* static function declarations */ +static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, + uint8_t sub); + + #ifdef FIXED_POINT #define DIV(A, B) (((int64_t)A << REAL_BITS)/B) diff --git a/src/libfaad/pns.h b/src/libfaad/pns.h index 32a757ea7..23557587b 100644 --- a/src/libfaad/pns.h +++ b/src/libfaad/pns.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: pns.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: pns.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __PNS_H__ @@ -42,10 +42,6 @@ void pns_decode(ic_stream *ics_left, ic_stream *ics_right, real_t *spec_left, real_t *spec_right, uint16_t frame_len, uint8_t channel_pair, uint8_t object_type); -static INLINE int32_t random2(); -static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, - uint8_t sub); - static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) { if (ics->sfb_cb[group][sfb] == NOISE_HCB) diff --git a/src/libfaad/pulse.c b/src/libfaad/pulse.c index 3c33708eb..c11ee802d 100644 --- a/src/libfaad/pulse.c +++ b/src/libfaad/pulse.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: pulse.c,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: pulse.c,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/pulse.h b/src/libfaad/pulse.h index 671a0e9b9..d64625101 100644 --- a/src/libfaad/pulse.h +++ b/src/libfaad/pulse.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: pulse.h,v 1.4 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: pulse.h,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __PULSE_H__ diff --git a/src/libfaad/rvlc.c b/src/libfaad/rvlc.c index 59034b6df..22aa8b0ca 100644 --- a/src/libfaad/rvlc.c +++ b/src/libfaad/rvlc.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: rvlc.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: rvlc.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ /* RVLC scalefactor decoding @@ -52,6 +52,22 @@ //#define PRINT_RVLC +/* static function declarations */ +static uint8_t rvlc_decode_sf_forward(ic_stream *ics, + bitfile *ld_sf, + bitfile *ld_esc, + uint8_t *is_used); +#if 0 +static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, + bitfile *ld_sf, + bitfile *ld_esc, + uint8_t is_used); +#endif +static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, + int8_t direction); +static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); + + uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) { uint8_t bits = 9; @@ -235,6 +251,7 @@ static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *l return 0; } +#if 0 // not used right now, doesn't work correctly yet static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, uint8_t intensity_used) { @@ -337,6 +354,7 @@ static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *l return 0; } +#endif /* index == 99 means not allowed codeword */ static rvlc_huff_table book_rvlc[] = { @@ -508,4 +526,5 @@ static int8_t rvlc_huffman_esc(bitfile *ld, return h->index; } -#endif
\ No newline at end of file +#endif + diff --git a/src/libfaad/rvlc.h b/src/libfaad/rvlc.h index 4720dd6c0..65ea6721f 100644 --- a/src/libfaad/rvlc.h +++ b/src/libfaad/rvlc.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: rvlc.h,v 1.2 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: rvlc.h,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __RVLC_SCF_H__ @@ -46,18 +46,6 @@ typedef struct uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); -static uint8_t rvlc_decode_sf_forward(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t *is_used); -static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t is_used); -static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, - int8_t direction); -static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); - #ifdef __cplusplus } diff --git a/src/libfaad/sbr_dct.c b/src/libfaad/sbr_dct.c index 8e1559367..f21f27e40 100644 --- a/src/libfaad/sbr_dct.c +++ b/src/libfaad/sbr_dct.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_dct.c,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_dct.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/sbr_dct.h b/src/libfaad/sbr_dct.h index 5dcd5d5f2..3dace8251 100644 --- a/src/libfaad/sbr_dct.h +++ b/src/libfaad/sbr_dct.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_dct.h,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_dct.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_DCT_H__ diff --git a/src/libfaad/sbr_dec.c b/src/libfaad/sbr_dec.c index 625ff857d..edbc62548 100644 --- a/src/libfaad/sbr_dec.c +++ b/src/libfaad/sbr_dec.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_dec.c,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_dec.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ @@ -41,6 +41,8 @@ #include "sbr_hfgen.h" #include "sbr_hfadj.h" +/* static function declarations */ +static void sbr_save_prev_data(sbr_info *sbr, uint8_t ch); sbr_info *sbrDecodeInit(uint16_t framelength #ifdef DRM @@ -113,7 +115,7 @@ void sbrDecodeEnd(sbr_info *sbr) } } -void sbr_save_prev_data(sbr_info *sbr, uint8_t ch) +static void sbr_save_prev_data(sbr_info *sbr, uint8_t ch) { uint8_t i; diff --git a/src/libfaad/sbr_dec.h b/src/libfaad/sbr_dec.h index db3ba0ecd..38734afc3 100644 --- a/src/libfaad/sbr_dec.h +++ b/src/libfaad/sbr_dec.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_dec.h,v 1.3 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_dec.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_DEC_H__ diff --git a/src/libfaad/sbr_e_nf.c b/src/libfaad/sbr_e_nf.c index 730eb258f..ac25abc55 100644 --- a/src/libfaad/sbr_e_nf.c +++ b/src/libfaad/sbr_e_nf.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_e_nf.c,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_e_nf.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -53,39 +53,39 @@ ALIGN static const real_t pow2deq[] = { REAL_CONST(0.0078125), REAL_CONST(0.015625), REAL_CONST(0.03125), REAL_CONST(0.0625), REAL_CONST(0.125), REAL_CONST(0.25), - REAL_CONST(0.5), REAL_CONST(1), - REAL_CONST(2), REAL_CONST(4), - REAL_CONST(8), REAL_CONST(16), - REAL_CONST(32), REAL_CONST(64), - REAL_CONST(128), REAL_CONST(256), - REAL_CONST(512), REAL_CONST(1024), - REAL_CONST(2048), REAL_CONST(4096), - REAL_CONST(8192), REAL_CONST(16384), - REAL_CONST(32768), REAL_CONST(65536), - REAL_CONST(131072), REAL_CONST(262144), - REAL_CONST(524288), REAL_CONST(1048576), - REAL_CONST(2097152), REAL_CONST(4194304), - REAL_CONST(8388608), REAL_CONST(16777216), - REAL_CONST(33554432), REAL_CONST(67108864), - REAL_CONST(134217728), REAL_CONST(268435456), - REAL_CONST(536870912), REAL_CONST(1073741824), - REAL_CONST(2147483648), REAL_CONST(4294967296), - REAL_CONST(8589934592), REAL_CONST(17179869184), - REAL_CONST(34359738368), REAL_CONST(68719476736), - REAL_CONST(137438953472), REAL_CONST(274877906944), - REAL_CONST(549755813888), REAL_CONST(1099511627776), - REAL_CONST(2199023255552), REAL_CONST(4398046511104), - REAL_CONST(8796093022208), REAL_CONST(17592186044416), - REAL_CONST(35184372088832), REAL_CONST(70368744177664), - REAL_CONST(140737488355328), REAL_CONST(281474976710656), - REAL_CONST(562949953421312), REAL_CONST(1125899906842624), - REAL_CONST(2251799813685248), REAL_CONST(4503599627370496), - REAL_CONST(9007199254740992), REAL_CONST(18014398509481984), - REAL_CONST(36028797018963968), REAL_CONST(72057594037927936), - REAL_CONST(144115188075855870), REAL_CONST(288230376151711740), - REAL_CONST(576460752303423490), REAL_CONST(1152921504606847000), - REAL_CONST(2305843009213694000), REAL_CONST(4611686018427387900), - REAL_CONST(9223372036854775800), REAL_CONST(1.8446744073709552E+019), + REAL_CONST(0.5), REAL_CONST(1.0), + REAL_CONST(2.0), REAL_CONST(4.0), + REAL_CONST(8.0), REAL_CONST(16.0), + REAL_CONST(32.0), REAL_CONST(64.0), + REAL_CONST(128.0), REAL_CONST(256.0), + REAL_CONST(512.0), REAL_CONST(1024.0), + REAL_CONST(2048.0), REAL_CONST(4096.0), + REAL_CONST(8192.0), REAL_CONST(16384.0), + REAL_CONST(32768.0), REAL_CONST(65536.0), + REAL_CONST(131072.0), REAL_CONST(262144.0), + REAL_CONST(524288.0), REAL_CONST(1048576.0), + REAL_CONST(2097152.0), REAL_CONST(4194304.0), + REAL_CONST(8388608.0), REAL_CONST(16777216.0), + REAL_CONST(33554432.0), REAL_CONST(67108864.0), + REAL_CONST(134217728.0), REAL_CONST(268435456.0), + REAL_CONST(536870912.0), REAL_CONST(1073741824.0), + REAL_CONST(2147483648.0), REAL_CONST(4294967296.0), + REAL_CONST(8589934592.0), REAL_CONST(17179869184.0), + REAL_CONST(34359738368.0), REAL_CONST(68719476736.0), + REAL_CONST(137438953472.0), REAL_CONST(274877906944.0), + REAL_CONST(549755813888.0), REAL_CONST(1099511627776.0), + REAL_CONST(2199023255552.0), REAL_CONST(4398046511104.0), + REAL_CONST(8796093022208.0), REAL_CONST(17592186044416.0), + REAL_CONST(35184372088832.0), REAL_CONST(70368744177664.0), + REAL_CONST(140737488355328.0), REAL_CONST(281474976710656.0), + REAL_CONST(562949953421312.0), REAL_CONST(1125899906842624.0), + REAL_CONST(2251799813685248.0), REAL_CONST(4503599627370496.0), + REAL_CONST(9007199254740992.0), REAL_CONST(18014398509481984.0), + REAL_CONST(36028797018963968.0), REAL_CONST(72057594037927936.0), + REAL_CONST(144115188075855870.0), REAL_CONST(288230376151711740.0), + REAL_CONST(576460752303423490.0), REAL_CONST(1152921504606847000.0), + REAL_CONST(2305843009213694000.0), REAL_CONST(4611686018427387900.0), + REAL_CONST(9223372036854775800.0), REAL_CONST(1.8446744073709552E+019), REAL_CONST(3.6893488147419103E+019), REAL_CONST(7.3786976294838206E+019), REAL_CONST(1.4757395258967641E+020), REAL_CONST(2.9514790517935283E+020), REAL_CONST(5.9029581035870565E+020), REAL_CONST(1.1805916207174113E+021), @@ -256,11 +256,7 @@ void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) /* +6 for the *64 and -10 for the /32 in the synthesis QMF * since this is a energy value: (x/32)^2 = (x^2)/1024 */ - exp = (sbr->E[ch][k][l] >> amp) + 6 -#ifdef FIXED_POINT - - 10 -#endif - ; + exp = (sbr->E[ch][k][l] >> amp) + 6; if ((exp < -P2_TABLE_OFFSET) || (exp > P2_TABLE_MAX)) { @@ -287,11 +283,7 @@ void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) sbr->Q_orig[ch][k][l] = 0; } else { exp = NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l]; -#ifdef FIXED_POINT - sbr->Q_orig[ch][k][l] = pow2deq_q[exp + P2Q_TABLE_OFFSET]; -#else sbr->Q_orig[ch][k][l] = pow2deq[exp + P2_TABLE_OFFSET]; -#endif } } } @@ -311,11 +303,8 @@ void unmap_envelope_noise(sbr_info *sbr) for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) { /* +6: * 64 ; +1: * 2 ; -10: /1024 QMF */ - exp0 = (sbr->E[0][k][l] >> amp0) + 7 -#ifdef FIXED_POINT - - 10 -#endif - ; + exp0 = (sbr->E[0][k][l] >> amp0) + 7; + /* UN_MAP removed: (x / 4096) same as (x >> 12) */ /* E[1] is always even so no need for compensating the divide by 2 with * an extra multiplication @@ -334,11 +323,7 @@ void unmap_envelope_noise(sbr_info *sbr) /* FIXED POINT TODO: E_orig: INTEGER!! */ sbr->E_orig[1][k][l] = MUL_F(tmp, pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]); -#ifdef FIXED_POINT sbr->E_orig[0][k][l] = MUL_R(sbr->E_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]); -#else - sbr->E_orig[0][k][l] = MUL_R(sbr->E_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]); -#endif } } } @@ -355,13 +340,8 @@ void unmap_envelope_noise(sbr_info *sbr) exp0 = NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1; exp1 = sbr->Q[1][k][l] - 12; -#ifdef FIXED_POINT - sbr->Q_orig[1][k][l] = MUL_F(pow2deq_q[exp0 + P2Q_TABLE_OFFSET], pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]); - sbr->Q_orig[0][k][l] = MUL_R(sbr->Q_orig[1][k][l], pow2deq_q[exp1 + P2Q_TABLE_OFFSET]); -#else sbr->Q_orig[1][k][l] = MUL_F(pow2deq[exp0 + P2_TABLE_OFFSET], pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]); sbr->Q_orig[0][k][l] = MUL_R(sbr->Q_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]); -#endif } } } diff --git a/src/libfaad/sbr_e_nf.h b/src/libfaad/sbr_e_nf.h index 3e0ce399e..b6b411a23 100644 --- a/src/libfaad/sbr_e_nf.h +++ b/src/libfaad/sbr_e_nf.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_e_nf.h,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_e_nf.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_E_NF_H__ diff --git a/src/libfaad/sbr_fbt.c b/src/libfaad/sbr_fbt.c index 88a2b29f2..b18536b69 100644 --- a/src/libfaad/sbr_fbt.c +++ b/src/libfaad/sbr_fbt.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_fbt.c,v 1.1 2003/12/30 02:00:10 miguelfreitas Exp $ +** $Id: sbr_fbt.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ /* Calculate frequency band tables */ @@ -37,6 +37,10 @@ #include "sbr_syntax.h" #include "sbr_fbt.h" +/* static function declarations */ +static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); + + /* calculate the start QMF channel for the master frequency band table */ /* parameter is also called k0 */ uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, diff --git a/src/libfaad/sbr_fbt.h b/src/libfaad/sbr_fbt.h index 627bf6d42..3da8593f8 100644 --- a/src/libfaad/sbr_fbt.h +++ b/src/libfaad/sbr_fbt.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_fbt.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_fbt.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_FBT_H__ @@ -32,7 +32,6 @@ extern "C" { #endif -static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, uint32_t sample_rate); uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, diff --git a/src/libfaad/sbr_hfadj.c b/src/libfaad/sbr_hfadj.c index 7dd53f3e0..5e0faab93 100644 --- a/src/libfaad/sbr_hfadj.c +++ b/src/libfaad/sbr_hfadj.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_hfadj.c,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_hfadj.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ /* High Frequency adjustment */ @@ -37,13 +37,27 @@ #include "sbr_noise.h" + +/* static function delcarations */ +static void map_noise_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); +static void map_sinusoids(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); +static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, + qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); +static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); +#ifdef SBR_LOW_POWER +static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); +static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); +#endif +static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); + + void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg /* aliasing degree */ #endif ,uint8_t ch) { - ALIGN sbr_hfadj_info adj = {0}; + ALIGN sbr_hfadj_info adj = {{{0}}}; map_noise_data(sbr, &adj, ch); map_sinusoids(sbr, &adj, ch); @@ -267,6 +281,7 @@ static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, #define ONE (1) + static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; diff --git a/src/libfaad/sbr_hfadj.h b/src/libfaad/sbr_hfadj.h index 762306ac7..90a6f58bf 100644 --- a/src/libfaad/sbr_hfadj.h +++ b/src/libfaad/sbr_hfadj.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_hfadj.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_hfadj.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_HFADJ_H__ @@ -53,20 +53,6 @@ void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] ,uint8_t ch); -static void map_envelope_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void map_noise_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void map_sinusoids(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); -static void additional_component_levels(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -#ifdef SBR_LOW_POWER -static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -#endif -static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); - - #ifdef __cplusplus } #endif diff --git a/src/libfaad/sbr_hfgen.c b/src/libfaad/sbr_hfgen.c index ed5f4135f..588d693df 100644 --- a/src/libfaad/sbr_hfgen.c +++ b/src/libfaad/sbr_hfgen.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_hfgen.c,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_hfgen.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ /* High Frequency generation */ @@ -36,7 +36,22 @@ #include "sbr_hfgen.h" #include "sbr_fbt.h" -void hf_generation(sbr_info *sbr, const qmf_t Xlow[MAX_NTSRHFG][32], + +/* static function declarations */ +static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], + complex_t *alpha_0, complex_t *alpha_1 +#ifdef SBR_LOW_POWER + , real_t *rxx +#endif + ); +#ifdef SBR_LOW_POWER +static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); +#endif +static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); +static void patch_construction(sbr_info *sbr); + + +void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], qmf_t Xhigh[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg @@ -172,7 +187,7 @@ typedef struct #ifdef SBR_LOW_POWER static void auto_correlation(sbr_info *sbr, acorr_coef *ac, - const qmf_t buffer[MAX_NTSRHFG][32], + qmf_t buffer[MAX_NTSRHFG][32], uint8_t bd, uint8_t len) { real_t r01 = 0, r02 = 0, r11 = 0; @@ -180,6 +195,7 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, uint8_t offset = sbr->tHFAdj; const real_t rel = 1 / (1 + 1e-6f); + for (j = offset; j < len + offset; j++) { r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]); @@ -199,7 +215,7 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_C(MUL_R(RE(ac->r12), RE(ac->r12)), rel); } #else -static void auto_correlation(sbr_info *sbr, acorr_coef *ac, const qmf_t buffer[MAX_NTSRHFG][32], +static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][32], uint8_t bd, uint8_t len) { real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0; @@ -243,7 +259,7 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, const qmf_t buffer[M #endif /* calculate linear prediction coefficients using the covariance method */ -static void calc_prediction_coef(sbr_info *sbr, const qmf_t Xlow[MAX_NTSRHFG][32], +static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], complex_t *alpha_0, complex_t *alpha_1 #ifdef SBR_LOW_POWER , real_t *rxx diff --git a/src/libfaad/sbr_hfgen.h b/src/libfaad/sbr_hfgen.h index d398e26ef..d5ace4ccc 100644 --- a/src/libfaad/sbr_hfgen.h +++ b/src/libfaad/sbr_hfgen.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_hfgen.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_hfgen.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_HFGEN_H__ @@ -32,23 +32,13 @@ extern "C" { #endif -void hf_generation(sbr_info *sbr, const qmf_t Xlow[MAX_NTSRHFG][32], +void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], qmf_t Xhigh[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch); -static void calc_prediction_coef(sbr_info *sbr, const qmf_t Xlow[MAX_NTSRHFG][32], - complex_t *alpha_0, complex_t *alpha_1 -#ifdef SBR_LOW_POWER - , real_t *rxx -#endif - ); -static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); -static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); -static void patch_construction(sbr_info *sbr); - #ifdef __cplusplus } #endif diff --git a/src/libfaad/sbr_huff.c b/src/libfaad/sbr_huff.c index 1c786bd3c..3fd043f3b 100644 --- a/src/libfaad/sbr_huff.c +++ b/src/libfaad/sbr_huff.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_huff.c,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_huff.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -220,7 +220,7 @@ static const int8_t t_huffman_noise_bal_3_0dB[24][2] = { }; -INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) +static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) { uint8_t bit; int16_t index = 0; diff --git a/src/libfaad/sbr_huff.h b/src/libfaad/sbr_huff.h index 00646b36d..2830c311f 100644 --- a/src/libfaad/sbr_huff.h +++ b/src/libfaad/sbr_huff.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_huff.h,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_huff.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_HUFF_H__ diff --git a/src/libfaad/sbr_noise.h b/src/libfaad/sbr_noise.h index 3b6ffb645..f49df7481 100644 --- a/src/libfaad/sbr_noise.h +++ b/src/libfaad/sbr_noise.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_noise.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_noise.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_NOISE_H__ @@ -557,4 +557,5 @@ ALIGN static const complex_t V[] = { #ifdef __cplusplus #endif -#endif
\ No newline at end of file +#endif + diff --git a/src/libfaad/sbr_qmf.c b/src/libfaad/sbr_qmf.c index fb7623b3f..bc4b6c18a 100644 --- a/src/libfaad/sbr_qmf.c +++ b/src/libfaad/sbr_qmf.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_qmf.c,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_qmf.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -82,7 +82,11 @@ void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, /* add new samples to input buffer x */ for (n = 32 - 1; n >= 0; n--) { +#ifdef FIXED_POINT + qmfa->x[n] = (input[in++]) >> 5; +#else qmfa->x[n] = input[in++]; +#endif } /* window and summation to create array u */ @@ -109,7 +113,11 @@ void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, { if (n < kx) { +#ifdef FIXED_POINT + QMF_RE(X[l + offset][n]) = u[n] << 1; +#else QMF_RE(X[l + offset][n]) = 2. * u[n]; +#endif } else { QMF_RE(X[l + offset][n]) = 0; } @@ -129,8 +137,13 @@ void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, { if (n < kx) { +#ifdef FIXED_POINT + QMF_RE(X[l + offset][n]) = y[n] << 1; + QMF_IM(X[l + offset][n]) = -y[63-n] << 1; +#else QMF_RE(X[l + offset][n]) = 2. * y[n]; QMF_IM(X[l + offset][n]) = -2. * y[63-n]; +#endif } else { QMF_RE(X[l + offset][n]) = 0; QMF_IM(X[l + offset][n]) = 0; @@ -184,7 +197,7 @@ void qmfs_end(qmfs_info *qmfs) } #ifdef SBR_LOW_POWER -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[64]; @@ -210,7 +223,11 @@ void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSR /* calculate 128 samples */ for (k = 0; k < 64; k++) { +#ifdef FIXED_POINT + x[k] = QMF_RE(X[l][k]); +#else x[k] = QMF_RE(X[l][k]) / 32.; +#endif } for (n = 0; n < 32; n++) @@ -266,37 +283,7 @@ void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSR } } -void DST2(real_t *in, real_t *out, int32_t len) -{ - int r, i; - - for (r = 1; r <= len; r++) - { - double sum = 0; - for (i = 1; i <= len; i++) - { - sum += in[i-1] * sin(((real_t)r)*((real_t)i-0.5)*M_PI/(real_t)len); - } - out[r-1] = (real_t)sum; - } -} - -void DCT2(real_t *in, real_t *out, int32_t len) -{ - int r, i; - - for (r = 0; r < len; r++) - { - double sum = 0; - for (i = 0; i < len; i++) - { - sum += in[i] * cos(((real_t)r)*((real_t)i+0.5)*M_PI/(real_t)len); - } - out[r] = (real_t)sum; - } -} - -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[64]; @@ -322,7 +309,11 @@ void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_ /* calculate 128 samples */ for (k = 0; k < 64; k++) { +#ifdef FIXED_POINT + x[k] = QMF_RE(X[l][k]); +#else x[k] = QMF_RE(X[l][k]) / 32.; +#endif } for (n = 0; n < 32; n++) @@ -379,7 +370,7 @@ void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_ } } #else -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x1[64], x2[64]; @@ -459,7 +450,7 @@ void memmove_sse_576(real_t *out, const real_t *in) } } -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x1[64], x2[64]; diff --git a/src/libfaad/sbr_qmf.h b/src/libfaad/sbr_qmf.h index 9835d6139..7e7266c45 100644 --- a/src/libfaad/sbr_qmf.h +++ b/src/libfaad/sbr_qmf.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_qmf.h,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_qmf.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_QMF_H__ @@ -39,12 +39,10 @@ void qmfs_end(qmfs_info *qmfs); void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, qmf_t X[MAX_NTSRHFG][32], uint8_t offset, uint8_t kx); -void sbr_qmf_synthesis_32(qmfs_info *qmfs, const qmf_t *X, - real_t *output); -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); #ifdef USE_SSE -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); #endif diff --git a/src/libfaad/sbr_qmf_c.h b/src/libfaad/sbr_qmf_c.h index b02cbcd37..4b6c09b8d 100644 --- a/src/libfaad/sbr_qmf_c.h +++ b/src/libfaad/sbr_qmf_c.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_qmf_c.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_qmf_c.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_QMF_C_H__ @@ -361,4 +361,5 @@ ALIGN static const real_t qmf_c[640] = { FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) }; -#endif
\ No newline at end of file +#endif + diff --git a/src/libfaad/sbr_syntax.c b/src/libfaad/sbr_syntax.c index f24aff986..e8cdceff5 100644 --- a/src/libfaad/sbr_syntax.c +++ b/src/libfaad/sbr_syntax.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_syntax.c,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_syntax.c,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -39,6 +39,17 @@ #include "bits.h" #include "analysis.h" +/* static function declarations */ +static void sbr_header(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); + + static void sbr_reset(sbr_info *sbr) { #if 0 @@ -484,7 +495,7 @@ static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t i, env, rel, result; uint8_t bs_abs_bord, bs_abs_bord_1; - uint8_t bs_num_env; + uint8_t bs_num_env = 0; sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,248,"sbr_grid(): bs_frame_class")); diff --git a/src/libfaad/sbr_syntax.h b/src/libfaad/sbr_syntax.h index cf254ea0a..d3509edbb 100644 --- a/src/libfaad/sbr_syntax.h +++ b/src/libfaad/sbr_syntax.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_syntax.h,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_syntax.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_SYNTAX_H__ @@ -56,14 +56,6 @@ extern "C" { uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr); -static void sbr_header(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); #ifdef __cplusplus } diff --git a/src/libfaad/sbr_tf_grid.c b/src/libfaad/sbr_tf_grid.c index 977c92cd2..3c0de19fc 100644 --- a/src/libfaad/sbr_tf_grid.c +++ b/src/libfaad/sbr_tf_grid.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_tf_grid.c,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_tf_grid.c,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ /* Time/Frequency grid */ @@ -37,6 +37,15 @@ #include "sbr_syntax.h" #include "sbr_tf_grid.h" + +/* static function declarations */ +#if 0 +static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); +static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); +#endif +static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); + + uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) { uint8_t l, border, temp; @@ -155,6 +164,7 @@ void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) } } +#if 0 static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) { uint8_t i; @@ -209,10 +219,11 @@ static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) return 0; } +#endif static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) { - int8_t retval; + int8_t retval = 0; switch (sbr->bs_frame_class[ch]) { diff --git a/src/libfaad/sbr_tf_grid.h b/src/libfaad/sbr_tf_grid.h index f166a3edc..771b2116a 100644 --- a/src/libfaad/sbr_tf_grid.h +++ b/src/libfaad/sbr_tf_grid.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sbr_tf_grid.h,v 1.1 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sbr_tf_grid.h,v 1.2 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SBR_TF_GRID_H__ @@ -36,10 +36,6 @@ extern "C" { uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); -static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); -static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); -static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); - #ifdef __cplusplus } diff --git a/src/libfaad/sine_win.h b/src/libfaad/sine_win.h index 807190633..993bab2cd 100644 --- a/src/libfaad/sine_win.h +++ b/src/libfaad/sine_win.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: sine_win.h,v 1.2 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: sine_win.h,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SINE_WIN_H__ diff --git a/src/libfaad/specrec.c b/src/libfaad/specrec.c index a509c69e1..588d79656 100644 --- a/src/libfaad/specrec.c +++ b/src/libfaad/specrec.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: specrec.c,v 1.4 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: specrec.c,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ /* @@ -52,6 +52,11 @@ #endif +/* static function declarations */ +static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len); +static uint8_t inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len); + + #ifdef LD_DEC ALIGN static const uint8_t num_swb_512_window[] = { @@ -511,7 +516,7 @@ static uint8_t inverse_quantization(real_t *x_invquant, const int16_t *x_quant, uint8_t error = 0; /* Init error flag */ const real_t *tab = iq_table; - for(i = 0; i < frame_len; i+=4) + for (i = 0; i < frame_len; i+=4) { x_invquant[i] = iquant(x_quant[i], tab, &error); x_invquant[i+1] = iquant(x_quant[i+1], tab, &error); @@ -532,19 +537,19 @@ ALIGN static const real_t pow2sf_tab[] = { 0.0009765625, 0.001953125, 0.00390625, 0.0078125, 0.015625, 0.03125, 0.0625, 0.125, 0.25, - 0.5, 1, 2, - 4, 8, 16, 32, - 64, 128, 256, - 512, 1024, 2048, - 4096, 8192, 16384, - 32768, 65536, 131072, - 262144, 524288, 1048576, - 2097152, 4194304, 8388608, - 16777216, 33554432, 67108864, - 134217728, 268435456, 536870912, - 1073741824, 2147483648, 4294967296, - 8589934592, 17179869184, 34359738368, - 68719476736, 137438953472, 274877906944 + 0.5, 1.0, 2.0, + 4.0, 8.0, 16.0, 32.0, + 64.0, 128.0, 256.0, + 512.0, 1024.0, 2048.0, + 4096.0, 8192.0, 16384.0, + 32768.0, 65536.0, 131072.0, + 262144.0, 524288.0, 1048576.0, + 2097152.0, 4194304.0, 8388608.0, + 16777216.0, 33554432.0, 67108864.0, + 134217728.0, 268435456.0, 536870912.0, + 1073741824.0, 2147483648.0, 4294967296.0, + 8589934592.0, 17179869184.0, 34359738368.0, + 68719476736.0, 137438953472.0, 274877906944.0 }; #endif diff --git a/src/libfaad/specrec.h b/src/libfaad/specrec.h index cf3fe222a..06b08f12b 100644 --- a/src/libfaad/specrec.h +++ b/src/libfaad/specrec.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: specrec.h,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: specrec.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SPECREC_H__ @@ -35,8 +35,6 @@ extern "C" { #include "syntax.h" uint8_t window_grouping_info(faacDecHandle hDecoder, ic_stream *ics); -static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len); -static uint8_t inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len); void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant, uint16_t frame_len); #ifdef USE_SSE diff --git a/src/libfaad/ssr.c b/src/libfaad/ssr.c index dccd36964..dab7504ac 100644 --- a/src/libfaad/ssr.c +++ b/src/libfaad/ssr.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ssr.c,v 1.2 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: ssr.c,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/ssr.h b/src/libfaad/ssr.h index 6f4bfe997..cc635a3a3 100644 --- a/src/libfaad/ssr.h +++ b/src/libfaad/ssr.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ssr.h,v 1.2 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: ssr.h,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SSR_H__ diff --git a/src/libfaad/ssr_fb.c b/src/libfaad/ssr_fb.c index 8a73c1810..27fc655d3 100644 --- a/src/libfaad/ssr_fb.c +++ b/src/libfaad/ssr_fb.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ssr_fb.c,v 1.2 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: ssr_fb.c,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/ssr_ipqf.c b/src/libfaad/ssr_ipqf.c index 6ca22bc4a..c771775e1 100644 --- a/src/libfaad/ssr_ipqf.c +++ b/src/libfaad/ssr_ipqf.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: ssr_ipqf.c,v 1.2 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: ssr_ipqf.c,v 1.3 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" diff --git a/src/libfaad/structs.h b/src/libfaad/structs.h index 6afef3390..e0888f3ac 100644 --- a/src/libfaad/structs.h +++ b/src/libfaad/structs.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: structs.h,v 1.3 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: structs.h,v 1.4 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __STRUCTS_H__ @@ -333,6 +333,7 @@ typedef struct faacDecConfiguration uint8_t outputFormat; uint8_t downMatrix; uint8_t useOldADTSFormat; + uint8_t dontUpSampleImplicitSBR; } faacDecConfiguration, *faacDecConfigurationPtr; typedef struct faacDecFrameInfo diff --git a/src/libfaad/syntax.c b/src/libfaad/syntax.c index dda0f02de..e5e85bc80 100644 --- a/src/libfaad/syntax.c +++ b/src/libfaad/syntax.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: syntax.c,v 1.5 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: syntax.c,v 1.6 2004/01/11 15:44:05 mroi Exp $ **/ /* @@ -51,6 +51,48 @@ #endif +/* static function declarations */ +static uint8_t single_lfe_channel_element(faacDecHandle hDecoder, bitfile *ld, + uint8_t channel, uint8_t *tag); +static uint8_t channel_pair_element(faacDecHandle hDecoder, bitfile *ld, + uint8_t channel, uint8_t *tag); +#ifdef COUPLING_DEC +static uint8_t coupling_channel_element(faacDecHandle hDecoder, bitfile *ld); +#endif +static uint16_t data_stream_element(faacDecHandle hDecoder, bitfile *ld); +static uint8_t program_config_element(program_config *pce, bitfile *ld); +static uint8_t fill_element(faacDecHandle hDecoder, bitfile *ld, drc_info *drc +#ifdef SBR_DEC + ,uint8_t sbr_ele +#endif + ); +static uint8_t individual_channel_stream(faacDecHandle hDecoder, element *ele, + bitfile *ld, ic_stream *ics, uint8_t scal_flag, + int16_t *spec_data); +static uint8_t ics_info(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, + uint8_t common_window); +static uint8_t section_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); +static uint8_t scale_factor_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); +#ifdef SSR_DEC +static void gain_control_data(bitfile *ld, ic_stream *ics); +#endif +static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, + int16_t *spectral_data); +static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); +static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); +static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); +static uint8_t ltp_data(faacDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); +static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); +static void adts_variable_header(adts_header *adts, bitfile *ld); +static void adts_error_check(adts_header *adts, bitfile *ld); +static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); +static uint8_t excluded_channels(bitfile *ld, drc_info *drc); +#ifdef SCALABLE_DEC +static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, + bitfile *ld, uint8_t this_layer_stereo); +#endif + + /* Table 4.4.1 */ int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce_out) @@ -869,7 +911,7 @@ static uint16_t data_stream_element(faacDecHandle hDecoder, bitfile *ld) for (i = 0; i < count; i++) { - uint8_t data = (uint8_t)faad_getbits(ld, LEN_BYTE + faad_getbits(ld, LEN_BYTE DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); } @@ -1687,8 +1729,7 @@ static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld { int8_t i; uint8_t g; - int16_t *sp; - uint16_t k, p = 0; + uint16_t inc, k, p = 0; uint8_t groups = 0; uint8_t sect_cb; uint8_t result; @@ -1698,9 +1739,6 @@ static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld int64_t count = faad_get_ts(); #endif - sp = spectral_data; - /*memset(sp, 0, hDecoder->frameLength*sizeof(int16_t));*/ - for(g = 0; g < ics->num_window_groups; g++) { p = groups*nshort; @@ -1709,6 +1747,8 @@ static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld { sect_cb = ics->sect_cb[g][i]; + inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; + switch (sect_cb) { case ZERO_HCB: @@ -1720,18 +1760,11 @@ static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld break; default: for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; - k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += 4) + k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) { - sp = spectral_data + p; - - if ((result = huffman_spectral_data(sect_cb, ld, sp)) > 0) + if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) return result; - if (sect_cb >= FIRST_PAIR_HCB) - { - if ((result = huffman_spectral_data(sect_cb, ld, sp+2)) > 0) - return result; - } - p += 4; + p += inc; } break; } diff --git a/src/libfaad/syntax.h b/src/libfaad/syntax.h index 4dccee529..20c742f35 100644 --- a/src/libfaad/syntax.h +++ b/src/libfaad/syntax.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: syntax.h,v 1.6 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: syntax.h,v 1.7 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __SYNTAX_H__ @@ -115,51 +115,10 @@ void decode_cpe(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, bitfile *ld, uint8_t id_syn_ele); void raw_data_block(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc); +uint8_t reordered_spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, + int16_t *spectral_data); -/* static functions */ -static uint8_t single_lfe_channel_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -static uint8_t channel_pair_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -#ifdef COUPLING_DEC -static uint8_t coupling_channel_element(faacDecHandle hDecoder, bitfile *ld); -#endif -static uint16_t data_stream_element(faacDecHandle hDecoder, bitfile *ld); -static uint8_t program_config_element(program_config *pce, bitfile *ld); -static uint8_t fill_element(faacDecHandle hDecoder, bitfile *ld, drc_info *drc -#ifdef SBR_DEC - ,uint8_t sbr_ele -#endif - ); -static uint8_t individual_channel_stream(faacDecHandle hDecoder, element *ele, - bitfile *ld, ic_stream *ics, uint8_t scal_flag, - int16_t *spec_data); -static uint8_t ics_info(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - uint8_t common_window); -static uint8_t section_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); -static uint8_t scale_factor_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); -static void gain_control_data(bitfile *ld, ic_stream *ics); -static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data); -static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); -#ifdef ERROR_RESILIENCE -uint8_t reordered_spectral_data(faacDecHandle hDecoder, ic_stream *ics, - bitfile *ld, int16_t *spectral_data); -#endif -static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); -static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); -static uint8_t ltp_data(faacDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); -static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); -static void adts_variable_header(adts_header *adts, bitfile *ld); -static void adts_error_check(adts_header *adts, bitfile *ld); -static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); -static uint8_t excluded_channels(bitfile *ld, drc_info *drc); -#ifdef SCALABLE_DEC -static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - bitfile *ld, uint8_t this_layer_stereo); -#endif - #ifdef __cplusplus } #endif diff --git a/src/libfaad/tns.c b/src/libfaad/tns.c index 1d03c726c..65bef7c33 100644 --- a/src/libfaad/tns.c +++ b/src/libfaad/tns.c @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: tns.c,v 1.4 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: tns.c,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #include "common.h" @@ -31,6 +31,16 @@ #include "syntax.h" #include "tns.h" + +/* static function declarations */ +static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, + uint8_t *coef, real_t *a); +static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, + uint8_t order); +static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, + uint8_t order); + + #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) diff --git a/src/libfaad/tns.h b/src/libfaad/tns.h index 30aef676f..ebae23890 100644 --- a/src/libfaad/tns.h +++ b/src/libfaad/tns.h @@ -1,6 +1,6 @@ /* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com +** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** -** $Id: tns.h,v 1.4 2003/12/30 02:00:11 miguelfreitas Exp $ +** $Id: tns.h,v 1.5 2004/01/11 15:44:05 mroi Exp $ **/ #ifndef __TNS_H__ @@ -41,13 +41,6 @@ void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, uint8_t object_type, real_t *spec, uint16_t frame_len); -static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, - uint8_t *coef, real_t *a); -static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); -static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); - #ifdef __cplusplus } |