diff options
Diffstat (limited to 'apps/codecs/libfaad/fixed.h')
-rw-r--r-- | apps/codecs/libfaad/fixed.h | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/apps/codecs/libfaad/fixed.h b/apps/codecs/libfaad/fixed.h index da895e81bc..9781a846f7 100644 --- a/apps/codecs/libfaad/fixed.h +++ b/apps/codecs/libfaad/fixed.h | |||
@@ -49,10 +49,11 @@ extern "C" { | |||
49 | 49 | ||
50 | typedef int32_t real_t; | 50 | typedef int32_t real_t; |
51 | 51 | ||
52 | 52 | #define UFIX_CONST(A,PRECISION) ((uint32_t)((A)*(PRECISION)+0.5)) | |
53 | #define REAL_CONST(A) (((A) >= 0) ? ((real_t)((A)*(REAL_PRECISION)+0.5)) : ((real_t)((A)*(REAL_PRECISION)-0.5))) | 53 | #define FIX_CONST(A,PRECISION) (((A) >= 0) ? ((real_t)((A)*(PRECISION)+0.5)) : ((real_t)((A)*(PRECISION)-0.5))) |
54 | #define COEF_CONST(A) (((A) >= 0) ? ((real_t)((A)*(COEF_PRECISION)+0.5)) : ((real_t)((A)*(COEF_PRECISION)-0.5))) | 54 | #define REAL_CONST(A) FIX_CONST((A),(REAL_PRECISION)) |
55 | #define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5)))) | 55 | #define COEF_CONST(A) FIX_CONST((A),(COEF_PRECISION)) |
56 | #define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : FIX_CONST((A),(FRAC_PRECISION))) | ||
56 | //#define FRAC_CONST(A) (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5))) | 57 | //#define FRAC_CONST(A) (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5))) |
57 | 58 | ||
58 | #define Q2_BITS 22 | 59 | #define Q2_BITS 22 |
@@ -128,6 +129,8 @@ static INLINE void ComplexMult(real_t *y1, real_t *y2, | |||
128 | #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) | 129 | #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) |
129 | #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) | 130 | #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) |
130 | #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) | 131 | #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) |
132 | #define DESCALE(A,S) ((S)>0?(((A)>>((S)-1))+1)>>1:(A)<<-(S)) | ||
133 | #define DESCALE_SHIFT(A,SH,SC) DESCALE((A),(SC)-(SH) | ||
131 | 134 | ||
132 | #elif defined(__GNUC__) && defined (__arm__) | 135 | #elif defined(__GNUC__) && defined (__arm__) |
133 | 136 | ||
@@ -205,6 +208,18 @@ static INLINE void ComplexMult(real_t *y1, real_t *y2, | |||
205 | *y2 = yt2 << (FRAC_SIZE-FRAC_BITS); | 208 | *y2 = yt2 << (FRAC_SIZE-FRAC_BITS); |
206 | } | 209 | } |
207 | 210 | ||
211 | static inline real_t DESCALE_SHIFT(unsigned val, int shift, int scale) | ||
212 | { | ||
213 | unsigned out; | ||
214 | if ((out = val >> (scale - shift - 1))) | ||
215 | { | ||
216 | out++; | ||
217 | out >>= 1; | ||
218 | } else | ||
219 | out = val << (shift - scale); | ||
220 | return out; | ||
221 | } | ||
222 | |||
208 | #else | 223 | #else |
209 | 224 | ||
210 | /* multiply with real shift */ | 225 | /* multiply with real shift */ |
@@ -225,6 +240,8 @@ static INLINE void ComplexMult(real_t *y1, real_t *y2, | |||
225 | #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) | 240 | #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) |
226 | #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) | 241 | #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) |
227 | #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) | 242 | #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) |
243 | #define DESCALE(A,S) ((S)>0?(((A)>>((S)-1))+1)>>1:(A)<<-(S)) | ||
244 | #define DESCALE_SHIFT(A,SH,SC) DESCALE((A),(SC)-(SH) | ||
228 | 245 | ||
229 | /* Complex multiplication */ | 246 | /* Complex multiplication */ |
230 | static INLINE void ComplexMult(real_t *y1, real_t *y2, | 247 | static INLINE void ComplexMult(real_t *y1, real_t *y2, |