From cba9d259b05a88302a78669cba0953ba0c98274d Mon Sep 17 00:00:00 2001 From: Andree Buschmann Date: Tue, 14 Sep 2010 06:03:39 +0000 Subject: Further libfaad cleanup. Make libfaad compilable for floating point. Floating point cannot be used as reference though, as errorous noise is the result. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28071 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libfaad/common.h | 9 +--- apps/codecs/libfaad/sbr_hfgen.c | 117 ++++++++++++++-------------------------- apps/codecs/libfaad/sbr_qmf.c | 2 +- 3 files changed, 42 insertions(+), 86 deletions(-) diff --git a/apps/codecs/libfaad/common.h b/apps/codecs/libfaad/common.h index 5343de325c..e6cdcd8646 100644 --- a/apps/codecs/libfaad/common.h +++ b/apps/codecs/libfaad/common.h @@ -95,11 +95,6 @@ extern struct codec_api* ci; /* Use if target platform has address generators with autoincrement */ //#define PREFER_POINTERS -#ifdef _WIN32_WCE -#define FIXED_POINT -#endif - - #define ERROR_RESILIENCE @@ -328,7 +323,7 @@ char *strchr(), *strrchr(); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } - +/* rockbox: must be commented to build for non-FP #if defined(_WIN32) && !defined(__MINGW32__) #define HAS_LRINTF static INLINE int lrintf(float f) @@ -355,7 +350,7 @@ char *strchr(), *strrchr(); return i; } #endif - +*/ #ifdef __ICL /* only Intel C compiler has fmath ??? */ diff --git a/apps/codecs/libfaad/sbr_hfgen.c b/apps/codecs/libfaad/sbr_hfgen.c index 08d3af0253..fc1d188f4a 100644 --- a/apps/codecs/libfaad/sbr_hfgen.c +++ b/apps/codecs/libfaad/sbr_hfgen.c @@ -146,23 +146,15 @@ void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], #endif #ifdef SBR_LOW_POWER - QMF_RE(Xhigh[l + offset][k]) = - temp3_r - +(MUL_R(a0_r, temp2_r) + - MUL_R(a1_r, temp1_r)); + QMF_RE(Xhigh[l + offset][k]) = temp3_r + + (MUL_R(a0_r, temp2_r) + MUL_R(a1_r, temp1_r)); #else - QMF_RE(Xhigh[l + offset][k]) = - temp3_r - +(MUL_R(a0_r, temp2_r) - - MUL_R(a0_i, temp2_i) + - MUL_R(a1_r, temp1_r) - - MUL_R(a1_i, temp1_i)); - QMF_IM(Xhigh[l + offset][k]) = - temp3_i - +(MUL_R(a0_i, temp2_r) + - MUL_R(a0_r, temp2_i) + - MUL_R(a1_i, temp1_r) + - MUL_R(a1_r, temp1_i)); + QMF_RE(Xhigh[l + offset][k]) = temp3_r + + (MUL_R(a0_r, temp2_r) - MUL_R(a0_i, temp2_i) + + MUL_R(a1_r, temp1_r) - MUL_R(a1_i, temp1_i)); + QMF_IM(Xhigh[l + offset][k]) = temp3_i + + (MUL_R(a0_i, temp2_r) + MUL_R(a0_r, temp2_i) + + MUL_R(a1_i, temp1_r) + MUL_R(a1_r, temp1_i)); #endif } } else { @@ -199,6 +191,7 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, uint8_t bd, uint8_t len) { real_t r01 = 0, r02 = 0, r11 = 0; + real_t tmp1, tmp2; int8_t j; uint8_t offset = sbr->tHFAdj; #ifdef FIXED_POINT @@ -233,12 +226,13 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, r02 += MUL_R(buf_j , buf_j_2); r11 += MUL_R(buf_j_1, buf_j_1); } - RE(ac->r12) = r01 - - MUL_R(((QMF_RE(buffer[len+offset-1][bd]))>>exp), ((QMF_RE(buffer[len+offset-2][bd]))>>exp)) + - MUL_R(((QMF_RE(buffer[ offset-1][bd]))>>exp), ((QMF_RE(buffer[ offset-2][bd]))>>exp)); - RE(ac->r22) = r11 - - MUL_R(((QMF_RE(buffer[len+offset-2][bd]))>>exp), ((QMF_RE(buffer[len+offset-2][bd]))>>exp)) + - MUL_R(((QMF_RE(buffer[ offset-2][bd]))>>exp), ((QMF_RE(buffer[ offset-2][bd]))>>exp)); + tmp1 = (QMF_RE(buffer[len+offset-1][bd]))>>exp; + tmp2 = (QMF_RE(buffer[ offset-1][bd]))>>exp; + RE(ac->r12) = r01 - MUL_R(tmp1, tmp1) + MUL_R(tmp2, tmp2); + + tmp1 = (QMF_RE(buffer[len+offset-2][bd]))>>exp; + tmp2 = (QMF_RE(buffer[ offset-2][bd]))>>exp; + RE(ac->r22) = r11 - MUL_R(tmp1, tmp1) + MUL_R(tmp2, tmp2); #else for (j = offset; j < len + offset; j++) { @@ -246,12 +240,13 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, r02 += QMF_RE(buffer[j ][bd]) * QMF_RE(buffer[j-2][bd]); r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]); } - RE(ac->r12) = r01 - - QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[ offset-1][bd]) * QMF_RE(buffer[ offset-2][bd]); - RE(ac->r22) = r11 - - QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[ offset-2][bd]) * QMF_RE(buffer[ offset-2][bd]); + tmp1 = (QMF_RE(buffer[len+offset-1][bd])); + tmp2 = (QMF_RE(buffer[ offset-1][bd])); + RE(ac->r12) = r01 - tmp1*tmp1 + tmp2*tmp2; + + tmp1 = (QMF_RE(buffer[len+offset-2][bd])); + tmp2 = (QMF_RE(buffer[ offset-2][bd])); + RE(ac->r22) = r11 - tmp1*tmp1 + tmp2*tmp2; #endif RE(ac->r01) = r01; RE(ac->r02) = r02; @@ -313,30 +308,13 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTS r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i); } - // These are actual values in temporary variable at this point - // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; - // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; - // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; - // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; - // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; - // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; - // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; - - RE(ac->r12) = r01r - - (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) + - (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i)); - IM(ac->r12) = r01i - - (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) + - (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i)); - RE(ac->r22) = r11r - - (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) + - (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i)); - + RE(ac->r12) = r01r - (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) + + (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i)); + IM(ac->r12) = r01i - (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) + + (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i)); + RE(ac->r22) = r11r - (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) + + (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i)); #else - temp2_r = QMF_RE(buffer[offset-2][bd]); temp2_i = QMF_IM(buffer[offset-2][bd]); temp3_r = QMF_RE(buffer[offset-1][bd]); @@ -349,10 +327,10 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTS for (j = offset; j < len + offset; j++) { - temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd]; - temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd]; - temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd]; - temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd]; + temp1_r = temp2_r; + temp1_i = temp2_i; + temp2_r = temp3_r; + temp2_i = temp3_i; temp3_r = QMF_RE(buffer[j][bd]); temp3_i = QMF_IM(buffer[j][bd]); r01r += temp3_r * temp2_r + temp3_i * temp2_i; @@ -362,30 +340,13 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTS r11r += temp2_r * temp2_r + temp2_i * temp2_i; } - // These are actual values in temporary variable at this point - // temp1_r = QMF_RE(buffer[len+offset-1-2][bd]; - // temp1_i = QMF_IM(buffer[len+offset-1-2][bd]; - // temp2_r = QMF_RE(buffer[len+offset-1-1][bd]; - // temp2_i = QMF_IM(buffer[len+offset-1-1][bd]; - // temp3_r = QMF_RE(buffer[len+offset-1][bd]); - // temp3_i = QMF_IM(buffer[len+offset-1][bd]); - // temp4_r = QMF_RE(buffer[offset-2][bd]); - // temp4_i = QMF_IM(buffer[offset-2][bd]); - // temp5_r = QMF_RE(buffer[offset-1][bd]); - // temp5_i = QMF_IM(buffer[offset-1][bd]); - - RE(ac->r12) = r01r - - (temp3_r * temp2_r + temp3_i * temp2_i) + - (temp5_r * temp4_r + temp5_i * temp4_i); - IM(ac->r12) = r01i - - (temp3_i * temp2_r - temp3_r * temp2_i) + - (temp5_i * temp4_r - temp5_r * temp4_i); - RE(ac->r22) = r11r - - (temp2_r * temp2_r + temp2_i * temp2_i) + - (temp4_r * temp4_r + temp4_i * temp4_i); - + RE(ac->r12) = r01r - (temp3_r * temp2_r + temp3_i * temp2_i) + + (temp5_r * temp4_r + temp5_i * temp4_i); + IM(ac->r12) = r01i - (temp3_i * temp2_r - temp3_r * temp2_i) + + (temp5_i * temp4_r - temp5_r * temp4_i); + RE(ac->r22) = r11r - (temp2_r * temp2_r + temp2_i * temp2_i) + + (temp4_r * temp4_r + temp4_i * temp4_i); #endif - RE(ac->r01) = r01r; IM(ac->r01) = r01i; RE(ac->r02) = r02r; diff --git a/apps/codecs/libfaad/sbr_qmf.c b/apps/codecs/libfaad/sbr_qmf.c index 3759329c3c..6008c72b11 100644 --- a/apps/codecs/libfaad/sbr_qmf.c +++ b/apps/codecs/libfaad/sbr_qmf.c @@ -44,7 +44,7 @@ #define FAAD_ANALYSIS_SCALE2(X) ((X)) #define FAAD_ANALYSIS_SCALE3(X) ((X)) #else - #define FAAD_ANALYSIS_SCALE1(X) ((X)*scale) + #define FAAD_SYNTHESIS_SCALE(X) ((X)*scale) #define FAAD_ANALYSIS_SCALE1(X) ((X)) #define FAAD_ANALYSIS_SCALE2(X) (2.*(X)) #define FAAD_ANALYSIS_SCALE3(X) ((X)/32.0) -- cgit v1.2.3