diff options
Diffstat (limited to 'apps/codecs/libmad/mad.h')
-rw-r--r-- | apps/codecs/libmad/mad.h | 566 |
1 files changed, 283 insertions, 283 deletions
diff --git a/apps/codecs/libmad/mad.h b/apps/codecs/libmad/mad.h index 52a74d122c..6e75e3bf09 100644 --- a/apps/codecs/libmad/mad.h +++ b/apps/codecs/libmad/mad.h | |||
@@ -27,28 +27,28 @@ extern "C" { | |||
27 | # endif | 27 | # endif |
28 | 28 | ||
29 | # define FPM_DEFAULT | 29 | # define FPM_DEFAULT |
30 | 30 | ||
31 | /* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */ | 31 | /* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */ |
32 | 32 | ||
33 | # ifndef LIBMAD_VERSION_H | 33 | # ifndef LIBMAD_VERSION_H |
34 | # define LIBMAD_VERSION_H | 34 | # define LIBMAD_VERSION_H |
35 | 35 | ||
36 | # define MAD_VERSION_MAJOR 0 | 36 | # define MAD_VERSION_MAJOR 0 |
37 | # define MAD_VERSION_MINOR 15 | 37 | # define MAD_VERSION_MINOR 15 |
38 | # define MAD_VERSION_PATCH 1 | 38 | # define MAD_VERSION_PATCH 1 |
39 | # define MAD_VERSION_EXTRA " (beta)" | 39 | # define MAD_VERSION_EXTRA " (beta)" |
40 | 40 | ||
41 | # define MAD_VERSION_STRINGIZE(str) #str | 41 | # define MAD_VERSION_STRINGIZE(str) #str |
42 | # define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) | 42 | # define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) |
43 | 43 | ||
44 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ | 44 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
45 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ | 45 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ |
46 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ | 46 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ |
47 | MAD_VERSION_EXTRA | 47 | MAD_VERSION_EXTRA |
48 | 48 | ||
49 | # define MAD_PUBLISHYEAR "2000-2004" | 49 | # define MAD_PUBLISHYEAR "2000-2004" |
50 | # define MAD_AUTHOR "Underbit Technologies, Inc." | 50 | # define MAD_AUTHOR "Underbit Technologies, Inc." |
51 | # define MAD_EMAIL "info@underbit.com" | 51 | # define MAD_EMAIL "info@underbit.com" |
52 | 52 | ||
53 | extern char const mad_version[]; | 53 | extern char const mad_version[]; |
54 | extern char const mad_copyright[]; | 54 | extern char const mad_copyright[]; |
@@ -102,50 +102,50 @@ typedef mad_fixed_t mad_sample_t; | |||
102 | * supported, and must be done with care. | 102 | * supported, and must be done with care. |
103 | */ | 103 | */ |
104 | 104 | ||
105 | # define MAD_F_FRACBITS 28 | 105 | # define MAD_F_FRACBITS 28 |
106 | 106 | ||
107 | # if MAD_F_FRACBITS == 28 | 107 | # if MAD_F_FRACBITS == 28 |
108 | # define MAD_F(x) ((mad_fixed_t) (x##L)) | 108 | # define MAD_F(x) ((mad_fixed_t) (x##L)) |
109 | # else | 109 | # else |
110 | # if MAD_F_FRACBITS < 28 | 110 | # if MAD_F_FRACBITS < 28 |
111 | # warning "MAD_F_FRACBITS < 28" | 111 | # warning "MAD_F_FRACBITS < 28" |
112 | # define MAD_F(x) ((mad_fixed_t) \ | 112 | # define MAD_F(x) ((mad_fixed_t) \ |
113 | (((x##L) + \ | 113 | (((x##L) + \ |
114 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ | 114 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ |
115 | (28 - MAD_F_FRACBITS))) | 115 | (28 - MAD_F_FRACBITS))) |
116 | # elif MAD_F_FRACBITS > 28 | 116 | # elif MAD_F_FRACBITS > 28 |
117 | # error "MAD_F_FRACBITS > 28 not currently supported" | 117 | # error "MAD_F_FRACBITS > 28 not currently supported" |
118 | # define MAD_F(x) ((mad_fixed_t) \ | 118 | # define MAD_F(x) ((mad_fixed_t) \ |
119 | ((x##L) << (MAD_F_FRACBITS - 28))) | 119 | ((x##L) << (MAD_F_FRACBITS - 28))) |
120 | # endif | 120 | # endif |
121 | # endif | 121 | # endif |
122 | 122 | ||
123 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) | 123 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
124 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) | 124 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
125 | 125 | ||
126 | # define MAD_F_ONE MAD_F(0x10000000) | 126 | # define MAD_F_ONE MAD_F(0x10000000) |
127 | 127 | ||
128 | # define mad_f_tofixed(x) ((mad_fixed_t) \ | 128 | # define mad_f_tofixed(x) ((mad_fixed_t) \ |
129 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) | 129 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
130 | # define mad_f_todouble(x) ((double) \ | 130 | # define mad_f_todouble(x) ((double) \ |
131 | ((x) / (double) (1L << MAD_F_FRACBITS))) | 131 | ((x) / (double) (1L << MAD_F_FRACBITS))) |
132 | 132 | ||
133 | # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) | 133 | # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) |
134 | # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) | 134 | # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) |
135 | /* (x should be positive) */ | 135 | /* (x should be positive) */ |
136 | 136 | ||
137 | # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) | 137 | # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) |
138 | 138 | ||
139 | # define mad_f_add(x, y) ((x) + (y)) | 139 | # define mad_f_add(x, y) ((x) + (y)) |
140 | # define mad_f_sub(x, y) ((x) - (y)) | 140 | # define mad_f_sub(x, y) ((x) - (y)) |
141 | 141 | ||
142 | # if defined(FPM_FLOAT) | 142 | # if defined(FPM_FLOAT) |
143 | # error "FPM_FLOAT not yet supported" | 143 | # error "FPM_FLOAT not yet supported" |
144 | 144 | ||
145 | # undef MAD_F | 145 | # undef MAD_F |
146 | # define MAD_F(x) mad_f_todouble(x) | 146 | # define MAD_F(x) mad_f_todouble(x) |
147 | 147 | ||
148 | # define mad_f_mul(x, y) ((x) * (y)) | 148 | # define mad_f_mul(x, y) ((x) * (y)) |
149 | # define mad_f_scale64 | 149 | # define mad_f_scale64 |
150 | 150 | ||
151 | # undef ASO_ZEROCHECK | 151 | # undef ASO_ZEROCHECK |
@@ -192,7 +192,7 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
192 | } | 192 | } |
193 | # pragma warning(pop) | 193 | # pragma warning(pop) |
194 | 194 | ||
195 | # define mad_f_mul mad_f_mul_inline | 195 | # define mad_f_mul mad_f_mul_inline |
196 | # define mad_f_scale64 | 196 | # define mad_f_scale64 |
197 | # else | 197 | # else |
198 | /* | 198 | /* |
@@ -201,9 +201,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
201 | */ | 201 | */ |
202 | # define MAD_F_MLX(hi, lo, x, y) \ | 202 | # define MAD_F_MLX(hi, lo, x, y) \ |
203 | asm ("imull %3" \ | 203 | asm ("imull %3" \ |
204 | : "=a" (lo), "=d" (hi) \ | 204 | : "=a" (lo), "=d" (hi) \ |
205 | : "%a" (x), "rm" (y) \ | 205 | : "%a" (x), "rm" (y) \ |
206 | : "cc") | 206 | : "cc") |
207 | 207 | ||
208 | # if defined(OPT_ACCURACY) | 208 | # if defined(OPT_ACCURACY) |
209 | /* | 209 | /* |
@@ -214,10 +214,10 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
214 | mad_fixed64lo_t __lo; \ | 214 | mad_fixed64lo_t __lo; \ |
215 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 215 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
216 | asm ("addl %2,%0\n\t" \ | 216 | asm ("addl %2,%0\n\t" \ |
217 | "adcl %3,%1" \ | 217 | "adcl %3,%1" \ |
218 | : "=rm" (lo), "=rm" (hi) \ | 218 | : "=rm" (lo), "=rm" (hi) \ |
219 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ | 219 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ |
220 | : "cc"); \ | 220 | : "cc"); \ |
221 | }) | 221 | }) |
222 | # endif /* OPT_ACCURACY */ | 222 | # endif /* OPT_ACCURACY */ |
223 | 223 | ||
@@ -230,15 +230,15 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
230 | mad_fixed64lo_t __lo_; \ | 230 | mad_fixed64lo_t __lo_; \ |
231 | mad_fixed_t __result; \ | 231 | mad_fixed_t __result; \ |
232 | asm ("addl %4,%2\n\t" \ | 232 | asm ("addl %4,%2\n\t" \ |
233 | "adcl %5,%3" \ | 233 | "adcl %5,%3" \ |
234 | : "=rm" (__lo_), "=rm" (__hi_) \ | 234 | : "=rm" (__lo_), "=rm" (__hi_) \ |
235 | : "0" (lo), "1" (hi), \ | 235 | : "0" (lo), "1" (hi), \ |
236 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ | 236 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ |
237 | : "cc"); \ | 237 | : "cc"); \ |
238 | asm ("shrdl %3,%2,%1" \ | 238 | asm ("shrdl %3,%2,%1" \ |
239 | : "=rm" (__result) \ | 239 | : "=rm" (__result) \ |
240 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ | 240 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ |
241 | : "cc"); \ | 241 | : "cc"); \ |
242 | __result; \ | 242 | __result; \ |
243 | }) | 243 | }) |
244 | # elif defined(OPT_INTEL) | 244 | # elif defined(OPT_INTEL) |
@@ -248,21 +248,21 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
248 | # define mad_f_scale64(hi, lo) \ | 248 | # define mad_f_scale64(hi, lo) \ |
249 | ({ mad_fixed_t __result; \ | 249 | ({ mad_fixed_t __result; \ |
250 | asm ("shrl %3,%1\n\t" \ | 250 | asm ("shrl %3,%1\n\t" \ |
251 | "shll %4,%2\n\t" \ | 251 | "shll %4,%2\n\t" \ |
252 | "orl %2,%1" \ | 252 | "orl %2,%1" \ |
253 | : "=rm" (__result) \ | 253 | : "=rm" (__result) \ |
254 | : "0" (lo), "r" (hi), \ | 254 | : "0" (lo), "r" (hi), \ |
255 | "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ | 255 | "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ |
256 | : "cc"); \ | 256 | : "cc"); \ |
257 | __result; \ | 257 | __result; \ |
258 | }) | 258 | }) |
259 | # else | 259 | # else |
260 | # define mad_f_scale64(hi, lo) \ | 260 | # define mad_f_scale64(hi, lo) \ |
261 | ({ mad_fixed_t __result; \ | 261 | ({ mad_fixed_t __result; \ |
262 | asm ("shrdl %3,%2,%1" \ | 262 | asm ("shrdl %3,%2,%1" \ |
263 | : "=rm" (__result) \ | 263 | : "=rm" (__result) \ |
264 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ | 264 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ |
265 | : "cc"); \ | 265 | : "cc"); \ |
266 | __result; \ | 266 | __result; \ |
267 | }) | 267 | }) |
268 | # endif /* OPT_ACCURACY */ | 268 | # endif /* OPT_ACCURACY */ |
@@ -287,42 +287,42 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
287 | ({ mad_fixed64hi_t __hi; \ | 287 | ({ mad_fixed64hi_t __hi; \ |
288 | mad_fixed64lo_t __lo; \ | 288 | mad_fixed64lo_t __lo; \ |
289 | mad_fixed_t __result; \ | 289 | mad_fixed_t __result; \ |
290 | asm ("smull %0, %1, %3, %4\n\t" \ | 290 | asm ("smull %0, %1, %3, %4\n\t" \ |
291 | "movs %0, %0, lsr %5\n\t" \ | 291 | "movs %0, %0, lsr %5\n\t" \ |
292 | "adc %2, %0, %1, lsl %6" \ | 292 | "adc %2, %0, %1, lsl %6" \ |
293 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ | 293 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ |
294 | : "%r" (x), "r" (y), \ | 294 | : "%r" (x), "r" (y), \ |
295 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 295 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
296 | : "cc"); \ | 296 | : "cc"); \ |
297 | __result; \ | 297 | __result; \ |
298 | }) | 298 | }) |
299 | # endif | 299 | # endif |
300 | 300 | ||
301 | # define MAD_F_MLX(hi, lo, x, y) \ | 301 | # define MAD_F_MLX(hi, lo, x, y) \ |
302 | asm ("smull %0, %1, %2, %3" \ | 302 | asm ("smull %0, %1, %2, %3" \ |
303 | : "=&r" (lo), "=&r" (hi) \ | 303 | : "=&r" (lo), "=&r" (hi) \ |
304 | : "%r" (x), "r" (y)) | 304 | : "%r" (x), "r" (y)) |
305 | 305 | ||
306 | # define MAD_F_MLA(hi, lo, x, y) \ | 306 | # define MAD_F_MLA(hi, lo, x, y) \ |
307 | asm ("smlal %0, %1, %2, %3" \ | 307 | asm ("smlal %0, %1, %2, %3" \ |
308 | : "+r" (lo), "+r" (hi) \ | 308 | : "+r" (lo), "+r" (hi) \ |
309 | : "%r" (x), "r" (y)) | 309 | : "%r" (x), "r" (y)) |
310 | 310 | ||
311 | # define MAD_F_MLN(hi, lo) \ | 311 | # define MAD_F_MLN(hi, lo) \ |
312 | asm ("rsbs %0, %2, #0\n\t" \ | 312 | asm ("rsbs %0, %2, #0\n\t" \ |
313 | "rsc %1, %3, #0" \ | 313 | "rsc %1, %3, #0" \ |
314 | : "=r" (lo), "=r" (hi) \ | 314 | : "=r" (lo), "=r" (hi) \ |
315 | : "0" (lo), "1" (hi) \ | 315 | : "0" (lo), "1" (hi) \ |
316 | : "cc") | 316 | : "cc") |
317 | 317 | ||
318 | # define mad_f_scale64(hi, lo) \ | 318 | # define mad_f_scale64(hi, lo) \ |
319 | ({ mad_fixed_t __result; \ | 319 | ({ mad_fixed_t __result; \ |
320 | asm ("movs %0, %1, lsr %3\n\t" \ | 320 | asm ("movs %0, %1, lsr %3\n\t" \ |
321 | "adc %0, %0, %2, lsl %4" \ | 321 | "adc %0, %0, %2, lsl %4" \ |
322 | : "=&r" (__result) \ | 322 | : "=&r" (__result) \ |
323 | : "r" (lo), "r" (hi), \ | 323 | : "r" (lo), "r" (hi), \ |
324 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 324 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
325 | : "cc"); \ | 325 | : "cc"); \ |
326 | __result; \ | 326 | __result; \ |
327 | }) | 327 | }) |
328 | 328 | ||
@@ -337,28 +337,28 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
337 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 337 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
338 | */ | 338 | */ |
339 | # define MAD_F_MLX(hi, lo, x, y) \ | 339 | # define MAD_F_MLX(hi, lo, x, y) \ |
340 | asm ("mult %2,%3" \ | 340 | asm ("mult %2,%3" \ |
341 | : "=l" (lo), "=h" (hi) \ | 341 | : "=l" (lo), "=h" (hi) \ |
342 | : "%r" (x), "r" (y)) | 342 | : "%r" (x), "r" (y)) |
343 | 343 | ||
344 | # if defined(HAVE_MADD_ASM) | 344 | # if defined(HAVE_MADD_ASM) |
345 | # define MAD_F_MLA(hi, lo, x, y) \ | 345 | # define MAD_F_MLA(hi, lo, x, y) \ |
346 | asm ("madd %2,%3" \ | 346 | asm ("madd %2,%3" \ |
347 | : "+l" (lo), "+h" (hi) \ | 347 | : "+l" (lo), "+h" (hi) \ |
348 | : "%r" (x), "r" (y)) | 348 | : "%r" (x), "r" (y)) |
349 | # elif defined(HAVE_MADD16_ASM) | 349 | # elif defined(HAVE_MADD16_ASM) |
350 | /* | 350 | /* |
351 | * This loses significant accuracy due to the 16-bit integer limit in the | 351 | * This loses significant accuracy due to the 16-bit integer limit in the |
352 | * multiply/accumulate instruction. | 352 | * multiply/accumulate instruction. |
353 | */ | 353 | */ |
354 | # define MAD_F_ML0(hi, lo, x, y) \ | 354 | # define MAD_F_ML0(hi, lo, x, y) \ |
355 | asm ("mult %2,%3" \ | 355 | asm ("mult %2,%3" \ |
356 | : "=l" (lo), "=h" (hi) \ | 356 | : "=l" (lo), "=h" (hi) \ |
357 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 357 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
358 | # define MAD_F_MLA(hi, lo, x, y) \ | 358 | # define MAD_F_MLA(hi, lo, x, y) \ |
359 | asm ("madd16 %2,%3" \ | 359 | asm ("madd16 %2,%3" \ |
360 | : "+l" (lo), "+h" (hi) \ | 360 | : "+l" (lo), "+h" (hi) \ |
361 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 361 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
362 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) | 362 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
363 | # endif | 363 | # endif |
364 | 364 | ||
@@ -378,9 +378,9 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
378 | */ | 378 | */ |
379 | # define MAD_F_MLX(hi, lo, x, y) \ | 379 | # define MAD_F_MLX(hi, lo, x, y) \ |
380 | asm ("smul %2, %3, %0\n\t" \ | 380 | asm ("smul %2, %3, %0\n\t" \ |
381 | "rd %%y, %1" \ | 381 | "rd %%y, %1" \ |
382 | : "=r" (lo), "=r" (hi) \ | 382 | : "=r" (lo), "=r" (hi) \ |
383 | : "%r" (x), "rI" (y)) | 383 | : "%r" (x), "rI" (y)) |
384 | 384 | ||
385 | /* --- PowerPC ------------------------------------------------------------- */ | 385 | /* --- PowerPC ------------------------------------------------------------- */ |
386 | 386 | ||
@@ -393,11 +393,11 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
393 | # define MAD_F_MLX(hi, lo, x, y) \ | 393 | # define MAD_F_MLX(hi, lo, x, y) \ |
394 | do { \ | 394 | do { \ |
395 | asm ("mullw %0,%1,%2" \ | 395 | asm ("mullw %0,%1,%2" \ |
396 | : "=r" (lo) \ | 396 | : "=r" (lo) \ |
397 | : "%r" (x), "r" (y)); \ | 397 | : "%r" (x), "r" (y)); \ |
398 | asm ("mulhw %0,%1,%2" \ | 398 | asm ("mulhw %0,%1,%2" \ |
399 | : "=r" (hi) \ | 399 | : "=r" (hi) \ |
400 | : "%r" (x), "r" (y)); \ | 400 | : "%r" (x), "r" (y)); \ |
401 | } \ | 401 | } \ |
402 | while (0) | 402 | while (0) |
403 | 403 | ||
@@ -410,11 +410,11 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
410 | mad_fixed64lo_t __lo; \ | 410 | mad_fixed64lo_t __lo; \ |
411 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 411 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
412 | asm ("addc %0,%2,%3\n\t" \ | 412 | asm ("addc %0,%2,%3\n\t" \ |
413 | "adde %1,%4,%5" \ | 413 | "adde %1,%4,%5" \ |
414 | : "=r" (lo), "=r" (hi) \ | 414 | : "=r" (lo), "=r" (hi) \ |
415 | : "%r" (lo), "r" (__lo), \ | 415 | : "%r" (lo), "r" (__lo), \ |
416 | "%r" (hi), "r" (__hi) \ | 416 | "%r" (hi), "r" (__hi) \ |
417 | : "xer"); \ | 417 | : "xer"); \ |
418 | }) | 418 | }) |
419 | # endif | 419 | # endif |
420 | 420 | ||
@@ -425,28 +425,28 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
425 | # define mad_f_scale64(hi, lo) \ | 425 | # define mad_f_scale64(hi, lo) \ |
426 | ({ mad_fixed_t __result, __round; \ | 426 | ({ mad_fixed_t __result, __round; \ |
427 | asm ("rotrwi %0,%1,%2" \ | 427 | asm ("rotrwi %0,%1,%2" \ |
428 | : "=r" (__result) \ | 428 | : "=r" (__result) \ |
429 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ | 429 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
430 | asm ("extrwi %0,%1,1,0" \ | 430 | asm ("extrwi %0,%1,1,0" \ |
431 | : "=r" (__round) \ | 431 | : "=r" (__round) \ |
432 | : "r" (__result)); \ | 432 | : "r" (__result)); \ |
433 | asm ("insrwi %0,%1,%2,0" \ | 433 | asm ("insrwi %0,%1,%2,0" \ |
434 | : "+r" (__result) \ | 434 | : "+r" (__result) \ |
435 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ | 435 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ |
436 | asm ("add %0,%1,%2" \ | 436 | asm ("add %0,%1,%2" \ |
437 | : "=r" (__result) \ | 437 | : "=r" (__result) \ |
438 | : "%r" (__result), "r" (__round)); \ | 438 | : "%r" (__result), "r" (__round)); \ |
439 | __result; \ | 439 | __result; \ |
440 | }) | 440 | }) |
441 | # else | 441 | # else |
442 | # define mad_f_scale64(hi, lo) \ | 442 | # define mad_f_scale64(hi, lo) \ |
443 | ({ mad_fixed_t __result; \ | 443 | ({ mad_fixed_t __result; \ |
444 | asm ("rotrwi %0,%1,%2" \ | 444 | asm ("rotrwi %0,%1,%2" \ |
445 | : "=r" (__result) \ | 445 | : "=r" (__result) \ |
446 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ | 446 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
447 | asm ("insrwi %0,%1,%2,0" \ | 447 | asm ("insrwi %0,%1,%2,0" \ |
448 | : "+r" (__result) \ | 448 | : "+r" (__result) \ |
449 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ | 449 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ |
450 | __result; \ | 450 | __result; \ |
451 | }) | 451 | }) |
452 | # endif | 452 | # endif |
@@ -467,10 +467,10 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
467 | * Pre-rounding is required to stay within the limits of compliance. | 467 | * Pre-rounding is required to stay within the limits of compliance. |
468 | */ | 468 | */ |
469 | # if defined(OPT_SPEED) | 469 | # if defined(OPT_SPEED) |
470 | # define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) | 470 | # define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) |
471 | # else | 471 | # else |
472 | # define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ | 472 | # define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ |
473 | (((y) + (1L << 15)) >> 16)) | 473 | (((y) + (1L << 15)) >> 16)) |
474 | # endif | 474 | # endif |
475 | 475 | ||
476 | /* ------------------------------------------------------------------------- */ | 476 | /* ------------------------------------------------------------------------- */ |
@@ -491,22 +491,22 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
491 | # endif | 491 | # endif |
492 | 492 | ||
493 | # if !defined(MAD_F_MLA) | 493 | # if !defined(MAD_F_MLA) |
494 | # define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) | 494 | # define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) |
495 | # define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) | 495 | # define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) |
496 | # define MAD_F_MLN(hi, lo) ((lo) = -(lo)) | 496 | # define MAD_F_MLN(hi, lo) ((lo) = -(lo)) |
497 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) | 497 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
498 | # endif | 498 | # endif |
499 | 499 | ||
500 | # if !defined(MAD_F_ML0) | 500 | # if !defined(MAD_F_ML0) |
501 | # define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) | 501 | # define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) |
502 | # endif | 502 | # endif |
503 | 503 | ||
504 | # if !defined(MAD_F_MLN) | 504 | # if !defined(MAD_F_MLN) |
505 | # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) | 505 | # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) |
506 | # endif | 506 | # endif |
507 | 507 | ||
508 | # if !defined(MAD_F_MLZ) | 508 | # if !defined(MAD_F_MLZ) |
509 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) | 509 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
510 | # endif | 510 | # endif |
511 | 511 | ||
512 | # if !defined(mad_f_scale64) | 512 | # if !defined(mad_f_scale64) |
@@ -514,7 +514,7 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | |||
514 | # define mad_f_scale64(hi, lo) \ | 514 | # define mad_f_scale64(hi, lo) \ |
515 | ((((mad_fixed_t) \ | 515 | ((((mad_fixed_t) \ |
516 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ | 516 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ |
517 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) | 517 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
518 | # else | 518 | # else |
519 | # define mad_f_scale64(hi, lo) \ | 519 | # define mad_f_scale64(hi, lo) \ |
520 | ((mad_fixed_t) \ | 520 | ((mad_fixed_t) \ |
@@ -544,10 +544,10 @@ struct mad_bitptr { | |||
544 | 544 | ||
545 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); | 545 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
546 | 546 | ||
547 | # define mad_bit_finish(bitptr) /* nothing */ | 547 | # define mad_bit_finish(bitptr) /* nothing */ |
548 | 548 | ||
549 | unsigned int mad_bit_length(struct mad_bitptr const *, | 549 | unsigned int mad_bit_length(struct mad_bitptr const *, |
550 | struct mad_bitptr const *); | 550 | struct mad_bitptr const *); |
551 | 551 | ||
552 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) | 552 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
553 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); | 553 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
@@ -566,67 +566,67 @@ unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); | |||
566 | # define LIBMAD_TIMER_H | 566 | # define LIBMAD_TIMER_H |
567 | 567 | ||
568 | typedef struct { | 568 | typedef struct { |
569 | signed long seconds; /* whole seconds */ | 569 | signed long seconds; /* whole seconds */ |
570 | unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ | 570 | unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ |
571 | } mad_timer_t; | 571 | } mad_timer_t; |
572 | 572 | ||
573 | extern mad_timer_t const mad_timer_zero; | 573 | extern mad_timer_t const mad_timer_zero; |
574 | 574 | ||
575 | # define MAD_TIMER_RESOLUTION 352800000UL | 575 | # define MAD_TIMER_RESOLUTION 352800000UL |
576 | 576 | ||
577 | enum mad_units { | 577 | enum mad_units { |
578 | MAD_UNITS_HOURS = -2, | 578 | MAD_UNITS_HOURS = -2, |
579 | MAD_UNITS_MINUTES = -1, | 579 | MAD_UNITS_MINUTES = -1, |
580 | MAD_UNITS_SECONDS = 0, | 580 | MAD_UNITS_SECONDS = 0, |
581 | 581 | ||
582 | /* metric units */ | 582 | /* metric units */ |
583 | 583 | ||
584 | MAD_UNITS_DECISECONDS = 10, | 584 | MAD_UNITS_DECISECONDS = 10, |
585 | MAD_UNITS_CENTISECONDS = 100, | 585 | MAD_UNITS_CENTISECONDS = 100, |
586 | MAD_UNITS_MILLISECONDS = 1000, | 586 | MAD_UNITS_MILLISECONDS = 1000, |
587 | 587 | ||
588 | /* audio sample units */ | 588 | /* audio sample units */ |
589 | 589 | ||
590 | MAD_UNITS_8000_HZ = 8000, | 590 | MAD_UNITS_8000_HZ = 8000, |
591 | MAD_UNITS_11025_HZ = 11025, | 591 | MAD_UNITS_11025_HZ = 11025, |
592 | MAD_UNITS_12000_HZ = 12000, | 592 | MAD_UNITS_12000_HZ = 12000, |
593 | 593 | ||
594 | MAD_UNITS_16000_HZ = 16000, | 594 | MAD_UNITS_16000_HZ = 16000, |
595 | MAD_UNITS_22050_HZ = 22050, | 595 | MAD_UNITS_22050_HZ = 22050, |
596 | MAD_UNITS_24000_HZ = 24000, | 596 | MAD_UNITS_24000_HZ = 24000, |
597 | 597 | ||
598 | MAD_UNITS_32000_HZ = 32000, | 598 | MAD_UNITS_32000_HZ = 32000, |
599 | MAD_UNITS_44100_HZ = 44100, | 599 | MAD_UNITS_44100_HZ = 44100, |
600 | MAD_UNITS_48000_HZ = 48000, | 600 | MAD_UNITS_48000_HZ = 48000, |
601 | 601 | ||
602 | /* video frame/field units */ | 602 | /* video frame/field units */ |
603 | 603 | ||
604 | MAD_UNITS_24_FPS = 24, | 604 | MAD_UNITS_24_FPS = 24, |
605 | MAD_UNITS_25_FPS = 25, | 605 | MAD_UNITS_25_FPS = 25, |
606 | MAD_UNITS_30_FPS = 30, | 606 | MAD_UNITS_30_FPS = 30, |
607 | MAD_UNITS_48_FPS = 48, | 607 | MAD_UNITS_48_FPS = 48, |
608 | MAD_UNITS_50_FPS = 50, | 608 | MAD_UNITS_50_FPS = 50, |
609 | MAD_UNITS_60_FPS = 60, | 609 | MAD_UNITS_60_FPS = 60, |
610 | 610 | ||
611 | /* CD audio frames */ | 611 | /* CD audio frames */ |
612 | 612 | ||
613 | MAD_UNITS_75_FPS = 75, | 613 | MAD_UNITS_75_FPS = 75, |
614 | 614 | ||
615 | /* video drop-frame units */ | 615 | /* video drop-frame units */ |
616 | 616 | ||
617 | MAD_UNITS_23_976_FPS = -24, | 617 | MAD_UNITS_23_976_FPS = -24, |
618 | MAD_UNITS_24_975_FPS = -25, | 618 | MAD_UNITS_24_975_FPS = -25, |
619 | MAD_UNITS_29_97_FPS = -30, | 619 | MAD_UNITS_29_97_FPS = -30, |
620 | MAD_UNITS_47_952_FPS = -48, | 620 | MAD_UNITS_47_952_FPS = -48, |
621 | MAD_UNITS_49_95_FPS = -50, | 621 | MAD_UNITS_49_95_FPS = -50, |
622 | MAD_UNITS_59_94_FPS = -60 | 622 | MAD_UNITS_59_94_FPS = -60 |
623 | }; | 623 | }; |
624 | 624 | ||
625 | # define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) | 625 | # define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) |
626 | 626 | ||
627 | int mad_timer_compare(mad_timer_t, mad_timer_t); | 627 | int mad_timer_compare(mad_timer_t, mad_timer_t); |
628 | 628 | ||
629 | # define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) | 629 | # define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) |
630 | 630 | ||
631 | void mad_timer_negate(mad_timer_t *); | 631 | void mad_timer_negate(mad_timer_t *); |
632 | mad_timer_t mad_timer_abs(mad_timer_t); | 632 | mad_timer_t mad_timer_abs(mad_timer_t); |
@@ -638,7 +638,7 @@ void mad_timer_multiply(mad_timer_t *, signed long); | |||
638 | signed long mad_timer_count(mad_timer_t, enum mad_units); | 638 | signed long mad_timer_count(mad_timer_t, enum mad_units); |
639 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); | 639 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
640 | void mad_timer_string(mad_timer_t, char *, char const *, | 640 | void mad_timer_string(mad_timer_t, char *, char const *, |
641 | enum mad_units, enum mad_units, unsigned long); | 641 | enum mad_units, enum mad_units, unsigned long); |
642 | 642 | ||
643 | # endif | 643 | # endif |
644 | 644 | ||
@@ -648,70 +648,70 @@ void mad_timer_string(mad_timer_t, char *, char const *, | |||
648 | # define LIBMAD_STREAM_H | 648 | # define LIBMAD_STREAM_H |
649 | 649 | ||
650 | 650 | ||
651 | # define MAD_BUFFER_GUARD 8 | 651 | # define MAD_BUFFER_GUARD 8 |
652 | # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) | 652 | # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) |
653 | 653 | ||
654 | enum mad_error { | 654 | enum mad_error { |
655 | MAD_ERROR_NONE = 0x0000, /* no error */ | 655 | MAD_ERROR_NONE = 0x0000, /* no error */ |
656 | 656 | ||
657 | MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ | 657 | MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ |
658 | MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ | 658 | MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ |
659 | 659 | ||
660 | MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ | 660 | MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ |
661 | 661 | ||
662 | MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ | 662 | MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ |
663 | MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ | 663 | MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ |
664 | MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ | 664 | MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ |
665 | MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ | 665 | MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ |
666 | MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ | 666 | MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ |
667 | 667 | ||
668 | MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ | 668 | MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ |
669 | MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ | 669 | MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ |
670 | MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ | 670 | MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ |
671 | MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ | 671 | MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ |
672 | MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ | 672 | MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ |
673 | MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ | 673 | MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ |
674 | MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ | 674 | MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ |
675 | MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ | 675 | MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ |
676 | MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ | 676 | MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ |
677 | MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ | 677 | MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ |
678 | MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ | 678 | MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ |
679 | MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ | 679 | MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ |
680 | MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ | 680 | MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ |
681 | }; | 681 | }; |
682 | 682 | ||
683 | # define MAD_RECOVERABLE(error) ((error) & 0xff00) | 683 | # define MAD_RECOVERABLE(error) ((error) & 0xff00) |
684 | 684 | ||
685 | struct mad_stream { | 685 | struct mad_stream { |
686 | unsigned char const *buffer; /* input bitstream buffer */ | 686 | unsigned char const *buffer; /* input bitstream buffer */ |
687 | unsigned char const *bufend; /* end of buffer */ | 687 | unsigned char const *bufend; /* end of buffer */ |
688 | unsigned long skiplen; /* bytes to skip before next frame */ | 688 | unsigned long skiplen; /* bytes to skip before next frame */ |
689 | 689 | ||
690 | int sync; /* stream sync found */ | 690 | int sync; /* stream sync found */ |
691 | unsigned long freerate; /* free bitrate (fixed) */ | 691 | unsigned long freerate; /* free bitrate (fixed) */ |
692 | 692 | ||
693 | unsigned char const *this_frame; /* start of current frame */ | 693 | unsigned char const *this_frame; /* start of current frame */ |
694 | unsigned char const *next_frame; /* start of next frame */ | 694 | unsigned char const *next_frame; /* start of next frame */ |
695 | struct mad_bitptr ptr; /* current processing bit pointer */ | 695 | struct mad_bitptr ptr; /* current processing bit pointer */ |
696 | 696 | ||
697 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ | 697 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
698 | unsigned int anc_bitlen; /* number of ancillary bits */ | 698 | unsigned int anc_bitlen; /* number of ancillary bits */ |
699 | 699 | ||
700 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; | 700 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
701 | /* Layer III main_data() */ | 701 | /* Layer III main_data() */ |
702 | unsigned int md_len; /* bytes in main_data */ | 702 | unsigned int md_len; /* bytes in main_data */ |
703 | 703 | ||
704 | int options; /* decoding options (see below) */ | 704 | int options; /* decoding options (see below) */ |
705 | enum mad_error error; /* error code (see above) */ | 705 | enum mad_error error; /* error code (see above) */ |
706 | }; | 706 | }; |
707 | 707 | ||
708 | enum { | 708 | enum { |
709 | MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ | 709 | MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ |
710 | MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ | 710 | MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ |
711 | # if 0 /* not yet implemented */ | 711 | # if 0 /* not yet implemented */ |
712 | MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ | 712 | MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ |
713 | MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ | 713 | MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ |
714 | MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ | 714 | MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ |
715 | # endif | 715 | # endif |
716 | }; | 716 | }; |
717 | 717 | ||
@@ -722,7 +722,7 @@ void mad_stream_finish(struct mad_stream *); | |||
722 | ((void) ((stream)->options = (opts))) | 722 | ((void) ((stream)->options = (opts))) |
723 | 723 | ||
724 | void mad_stream_buffer(struct mad_stream *, | 724 | void mad_stream_buffer(struct mad_stream *, |
725 | unsigned char const *, unsigned long); | 725 | unsigned char const *, unsigned long); |
726 | void mad_stream_skip(struct mad_stream *, unsigned long); | 726 | void mad_stream_skip(struct mad_stream *, unsigned long); |
727 | 727 | ||
728 | int mad_stream_sync(struct mad_stream *); | 728 | int mad_stream_sync(struct mad_stream *); |
@@ -738,82 +738,82 @@ char const *mad_stream_errorstr(struct mad_stream const *); | |||
738 | 738 | ||
739 | 739 | ||
740 | enum mad_layer { | 740 | enum mad_layer { |
741 | MAD_LAYER_I = 1, /* Layer I */ | 741 | MAD_LAYER_I = 1, /* Layer I */ |
742 | MAD_LAYER_II = 2, /* Layer II */ | 742 | MAD_LAYER_II = 2, /* Layer II */ |
743 | MAD_LAYER_III = 3 /* Layer III */ | 743 | MAD_LAYER_III = 3 /* Layer III */ |
744 | }; | 744 | }; |
745 | 745 | ||
746 | enum mad_mode { | 746 | enum mad_mode { |
747 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ | 747 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
748 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ | 748 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
749 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ | 749 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
750 | MAD_MODE_STEREO = 3 /* normal LR stereo */ | 750 | MAD_MODE_STEREO = 3 /* normal LR stereo */ |
751 | }; | 751 | }; |
752 | 752 | ||
753 | enum mad_emphasis { | 753 | enum mad_emphasis { |
754 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ | 754 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
755 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ | 755 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
756 | MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ | 756 | MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
757 | MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ | 757 | MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ |
758 | }; | 758 | }; |
759 | 759 | ||
760 | struct mad_header { | 760 | struct mad_header { |
761 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ | 761 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
762 | enum mad_mode mode; /* channel mode (see above) */ | 762 | enum mad_mode mode; /* channel mode (see above) */ |
763 | int mode_extension; /* additional mode info */ | 763 | int mode_extension; /* additional mode info */ |
764 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ | 764 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
765 | 765 | ||
766 | unsigned long bitrate; /* stream bitrate (bps) */ | 766 | unsigned long bitrate; /* stream bitrate (bps) */ |
767 | unsigned int samplerate; /* sampling frequency (Hz) */ | 767 | unsigned int samplerate; /* sampling frequency (Hz) */ |
768 | 768 | ||
769 | unsigned short crc_check; /* frame CRC accumulator */ | 769 | unsigned short crc_check; /* frame CRC accumulator */ |
770 | unsigned short crc_target; /* final target CRC checksum */ | 770 | unsigned short crc_target; /* final target CRC checksum */ |
771 | 771 | ||
772 | int flags; /* flags (see below) */ | 772 | int flags; /* flags (see below) */ |
773 | int private_bits; /* private bits (see below) */ | 773 | int private_bits; /* private bits (see below) */ |
774 | 774 | ||
775 | mad_timer_t duration; /* audio playing time of frame */ | 775 | mad_timer_t duration; /* audio playing time of frame */ |
776 | }; | 776 | }; |
777 | 777 | ||
778 | struct mad_frame { | 778 | struct mad_frame { |
779 | struct mad_header header; /* MPEG audio header */ | 779 | struct mad_header header; /* MPEG audio header */ |
780 | int options; /* decoding options (from stream) */ | 780 | int options; /* decoding options (from stream) */ |
781 | 781 | ||
782 | mad_fixed_t (*sbsample)[2][36][32]; /* synthesis subband filter samples */ | 782 | mad_fixed_t (*sbsample)[2][36][32]; /* synthesis subband filter samples */ |
783 | mad_fixed_t (*sbsample_prev)[2][36][32]; /* synthesis subband filter samples | 783 | mad_fixed_t (*sbsample_prev)[2][36][32]; /* synthesis subband filter samples |
784 | from previous frame only needed | 784 | from previous frame only needed |
785 | when synthesis is on cop */ | 785 | when synthesis is on cop */ |
786 | 786 | ||
787 | mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ | 787 | mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ |
788 | }; | 788 | }; |
789 | 789 | ||
790 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) | 790 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
791 | # define MAD_NSBSAMPLES(header) \ | 791 | # define MAD_NSBSAMPLES(header) \ |
792 | ((header)->layer == MAD_LAYER_I ? 12 : \ | 792 | ((header)->layer == MAD_LAYER_I ? 12 : \ |
793 | (((header)->layer == MAD_LAYER_III && \ | 793 | (((header)->layer == MAD_LAYER_III && \ |
794 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) | 794 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
795 | 795 | ||
796 | enum { | 796 | enum { |
797 | MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ | 797 | MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ |
798 | MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ | 798 | MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ |
799 | 799 | ||
800 | MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ | 800 | MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ |
801 | MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ | 801 | MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ |
802 | MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ | 802 | MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ |
803 | MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ | 803 | MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ |
804 | 804 | ||
805 | MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ | 805 | MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ |
806 | MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ | 806 | MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ |
807 | MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ | 807 | MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ |
808 | 808 | ||
809 | MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ | 809 | MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ |
810 | MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ | 810 | MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ |
811 | MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ | 811 | MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ |
812 | }; | 812 | }; |
813 | 813 | ||
814 | enum { | 814 | enum { |
815 | MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ | 815 | MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ |
816 | MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ | 816 | MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ |
817 | }; | 817 | }; |
818 | 818 | ||
819 | void mad_header_init(struct mad_header *); | 819 | void mad_header_init(struct mad_header *); |
@@ -838,19 +838,19 @@ void mad_frame_mute(struct mad_frame *); | |||
838 | 838 | ||
839 | 839 | ||
840 | struct mad_pcm { | 840 | struct mad_pcm { |
841 | unsigned int samplerate; /* sampling frequency (Hz) */ | 841 | unsigned int samplerate; /* sampling frequency (Hz) */ |
842 | unsigned short channels; /* number of channels */ | 842 | unsigned short channels; /* number of channels */ |
843 | unsigned short length; /* number of samples per channel */ | 843 | unsigned short length; /* number of samples per channel */ |
844 | mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ | 844 | mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ |
845 | }; | 845 | }; |
846 | 846 | ||
847 | struct mad_synth { | 847 | struct mad_synth { |
848 | mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ | 848 | mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ |
849 | /* [ch][eo][peo][s][v] */ | 849 | /* [ch][eo][peo][s][v] */ |
850 | 850 | ||
851 | unsigned int phase; /* current processing phase */ | 851 | unsigned int phase; /* current processing phase */ |
852 | 852 | ||
853 | struct mad_pcm pcm; /* PCM output */ | 853 | struct mad_pcm pcm; /* PCM output */ |
854 | }; | 854 | }; |
855 | 855 | ||
856 | /* single channel PCM selector */ | 856 | /* single channel PCM selector */ |
@@ -892,10 +892,10 @@ enum mad_decoder_mode { | |||
892 | }; | 892 | }; |
893 | 893 | ||
894 | enum mad_flow { | 894 | enum mad_flow { |
895 | MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ | 895 | MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ |
896 | MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ | 896 | MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ |
897 | MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ | 897 | MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ |
898 | MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ | 898 | MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ |
899 | }; | 899 | }; |
900 | 900 | ||
901 | struct mad_decoder { | 901 | struct mad_decoder { |
@@ -920,26 +920,26 @@ struct mad_decoder { | |||
920 | enum mad_flow (*input_func)(void *, struct mad_stream *); | 920 | enum mad_flow (*input_func)(void *, struct mad_stream *); |
921 | enum mad_flow (*header_func)(void *, struct mad_header const *); | 921 | enum mad_flow (*header_func)(void *, struct mad_header const *); |
922 | enum mad_flow (*filter_func)(void *, | 922 | enum mad_flow (*filter_func)(void *, |
923 | struct mad_stream const *, struct mad_frame *); | 923 | struct mad_stream const *, struct mad_frame *); |
924 | enum mad_flow (*output_func)(void *, | 924 | enum mad_flow (*output_func)(void *, |
925 | struct mad_header const *, struct mad_pcm *); | 925 | struct mad_header const *, struct mad_pcm *); |
926 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); | 926 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
927 | enum mad_flow (*message_func)(void *, void *, unsigned int *); | 927 | enum mad_flow (*message_func)(void *, void *, unsigned int *); |
928 | }; | 928 | }; |
929 | 929 | ||
930 | void mad_decoder_init(struct mad_decoder *, void *, | 930 | void mad_decoder_init(struct mad_decoder *, void *, |
931 | enum mad_flow (*)(void *, struct mad_stream *), | 931 | enum mad_flow (*)(void *, struct mad_stream *), |
932 | enum mad_flow (*)(void *, struct mad_header const *), | 932 | enum mad_flow (*)(void *, struct mad_header const *), |
933 | enum mad_flow (*)(void *, | 933 | enum mad_flow (*)(void *, |
934 | struct mad_stream const *, | 934 | struct mad_stream const *, |
935 | struct mad_frame *), | 935 | struct mad_frame *), |
936 | enum mad_flow (*)(void *, | 936 | enum mad_flow (*)(void *, |
937 | struct mad_header const *, | 937 | struct mad_header const *, |
938 | struct mad_pcm *), | 938 | struct mad_pcm *), |
939 | enum mad_flow (*)(void *, | 939 | enum mad_flow (*)(void *, |
940 | struct mad_stream *, | 940 | struct mad_stream *, |
941 | struct mad_frame *), | 941 | struct mad_frame *), |
942 | enum mad_flow (*)(void *, void *, unsigned int *)); | 942 | enum mad_flow (*)(void *, void *, unsigned int *)); |
943 | int mad_decoder_finish(struct mad_decoder *); | 943 | int mad_decoder_finish(struct mad_decoder *); |
944 | 944 | ||
945 | # define mad_decoder_options(decoder, opts) \ | 945 | # define mad_decoder_options(decoder, opts) \ |